netty-拆包和粘包
2019-01-20 本文已影响0人
coderljx
为什么会发生TCP粘包、拆包呢?
发生TCP粘包、拆包主要是由于下面一些原因:
应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包。
接收方法不及时读取套接字缓冲区数据,这将发生粘包。
……
如何处理粘包、拆包问题?
知道了粘包、拆包问题及根源,那么如何处理粘包、拆包问题呢?TCP本身是面向流的,作为网络服务器,如何从这源源不断涌来的数据流中拆分出或者合并出有意义的信息呢?通常会有以下一些常用的方法:
使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。
设置定长消息,服务端每次读取既定长度的内容作为一条完整消息。
设置消息边界,服务端从网络流中按消息编辑分离出消息内容。
……
如何基于Netty处理粘包、拆包问题?
DelimiterBasedFrameDecoder是基于消息边界方式进行粘包拆包处理的。
FixedLengthFrameDecoder是基于固定长度消息进行粘包拆包处理的。
LengthFieldBasedFrameDecoder是基于消息头指定消息长度进行粘包拆包处理的。
LineBasedFrameDecoder是基于行来进行消息粘包拆包处理的。
用户可以自行选择规则然后使用Netty提供的对应的Decoder来进行具有粘包、拆包处理功能的网络应用开发。