什么是TCP粘包

[TOC]

定义

TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。

原因

原因可能是发送方也可能是接收方造成的。

发送方原因:TCP默认使用Nagle算法,将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。

接收方原因:TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。

如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象了。

处理方法:

1.发送方关闭Nagle算法。

2.接收方:接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。应用层循环读取所有的数据,根据报文的长度判断每个包开始和结束的位置。

分包机制一般有两个通用的解决方法:

  1. 特殊字符控制;

  2. 在包头首都添加数据包的长度