TCP拆包粘包问题探究

什么是拆包粘包?

TCP底层有一个拆包/粘包的机制,TCP本质上是一种流协议,所谓流就是说它是没有界限的。
TCP底层它并不了解你上层业务具体的含义,也不了解多少个字节或者多少数据包,所以它只能根据TCP缓冲区的实际情况,对数据包进行划分。
因此在业务上,数据包可能被TCP当做多个包来发送,也可能把很多小的数据包合成一个大的数据包发出去,这就是TCP拆包与粘包的问题。

TCP拆包、粘包问题的产生原因:

  • 应用程序write写入的字节大小大于套接口发送缓冲区的大小
  • 进行MSS大小的TCP分段、以太网帧的payload大于MTU进行IP分片等

Netty 如何处理TCP拆包粘包的?

拆包粘包问题的解决方案,根据业界主流协议,有三种方案:

  • 消息定长,例如每个报文的大小固定为200个字节,如果不够,空位补空格
  • 在包尾部增加特殊字符进行分割,例如加回车等
  • 把消息分为消息头和消息体,在消息头中包含表示消息总长度的字段,然后进行业务处理。

猜你喜欢

转载自blog.csdn.net/qq_45455361/article/details/121845439