一、序列化框架
我们在开发一些远程过程调用RPC的程序时,通常会涉及对象的序列化和反序列化问题。因为TCP协议只能发送字节流。
- 序列化一定会涉及编码和格式化。(Encoding&Format)。
- 编码方式目前有:JSON和XML。
- 序列化框架选择:1.序列化后数据要小。2.结构复杂度要低。
- Protobuf是一个高性能、易扩展的序列化框架。可以进行二进制序列化。
- 对于性能要求不是太高的服务器程序,可是选择JSON系列的序列化框架。对于性能要求比较高的程序,使用二进制序列化框架。
二、粘包和拆包
Netty每一次发送就是向通道写入一个ByteBuf。发送数据时先填好ByteBuf,然后通过通道发出去。
- 理想情况下:发送端每发送一个ByteBuf,接收端就收到一个ByteBuf。并且内容一模一样。
- 现实情况下:每次收到一个ByteBuf,就是全包。某次收到多个ByteBuf,就是粘包。每次收到部分ByteBuf,就是半包。
三、半包现象的原理
操作系统底层读取缓冲的数据容量是有限的,当TCP底层缓冲的数据包比较大时,会将一个底层包分成多次ByteBuf,进而造成半包。当TCP底层缓冲的数据包比较小时,一次复制的不止一个内核缓冲区包,进而造成粘包。
四、半包问题的解决
基本思路是,在接收端,Netty程序需要根据自定义协议,将读取到的进程缓冲区ByteBuf,在应用层进行二次拼装,重新组装我们应用层的数据包。接收端的这个过程通常也称为分包,或者叫作拆包。在netty中,分包的方法为使用解码器。