什么是拆包粘包?
TCP底层有一个拆包/粘包的机制,TCP本质上是一种流协议,所谓流就是说它是没有界限的。
TCP底层它并不了解你上层业务具体的含义,也不了解多少个字节或者多少数据包,所以它只能根据TCP缓冲区的实际情况,对数据包进行划分。
因此在业务上,数据包可能被TCP当做多个包来发送,也可能把很多小的数据包合成一个大的数据包发出去,这就是TCP拆包与粘包的问题。
TCP拆包、粘包问题的产生原因:
- 应用程序write写入的字节大小大于套接口发送缓冲区的大小
- 进行MSS大小的TCP分段、以太网帧的payload大于MTU进行IP分片等
Netty 如何处理TCP拆包粘包的?
拆包粘包问题的解决方案,根据业界主流协议,有三种方案:
- 消息定长,例如每个报文的大小固定为200个字节,如果不够,空位补空格
- 在包尾部增加特殊字符进行分割,例如加回车等
- 把消息分为消息头和消息体,在消息头中包含表示消息总长度的字段,然后进行业务处理。