TCP的拆包粘包问题

介绍

TCP网络传输层协议,当经过三次握手以后,TCP点到点建立一条套节字通道,由于网络的复杂性,导致数据可能会分N个报文进行传送。在服务端可能一次或多次才能接收完成,系统本身也是缓存一定大小数据进行传送,保证传输的性能最大化。而同样是传输层协议UDP则不会有这样的问题,UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。而TCP基于字节流传输,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但TCP把这些数据块仅仅看成一连串的无结构的字节流,无边界。从TCP帧结构看出,TCP报文头部没有表示数据长度的字段。

现象的描述
  • 拆包 接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。
  • 粘包 同样在接收的时候有多个数据包。
发生的原因
  • 发送数据报文大于TCP缓冲区的大小。
  • 发送数据小于TCP缓冲区的大小。
  • 接收方没有及时读取缓冲区的数据。
问题的解决方案
  • 报文首部采用16bit指定长度。
  • 数据包定长(不足0补充)。
  • 分隔符。
现有框架
  • netty封装tcp拆包、粘包问题,具体可参考netty相关实现。

你可能感兴趣的:(TCP的拆包粘包问题)