1. 何为netty的粘包和拆包?
假设我们发送两个数据包D1和D2,两次接收分别是D1和D2,这种属于正常情况。
那么第一次接收到D1和部分的D2,这种现象叫做粘包。
那么第二次只接收到D2的一部分包,这种现象叫做拆包。
2. 产生粘包和拆包的原因
1) 应用程序write写入的字节大小大于套接口发送缓冲区大小。
2) 进行MSS大小的TCP分段。
3) 以太网的payload大于MTU进行IP分片。
3.解决策略
底层无法感知上层应用,该问题应该在上层应用进行定义解决。采用的策略如下:
-
消息定长,比如每个报文的大小为固定长度200字节,如果不够,空位补空白 -
在包尾增加回车换行符进行分割,例如FTP协议。 -
将消息分为消息头和消息体,消息头中包含消息总长度的字段。 -
更复杂的应用层协议。