问题引入?
如何处理和解决“TCP粘包”问题?即客户端调用两次不同的send试图发送两份不同的数据,但接收端调用recv时一次全部取出。
无法分割出原先的两部分数据。
关于传输层的两个协议其定义如下:
UDP:用户数据报协议
TCP:面向连接的可靠字节流传输协议
TCP粘包是一个伪问题,需要明确的是:
TCP基于字节流的可靠传输,每一个TCP分组包含一定的字节流,该分组序号由首个字节流指定
接收端在接收到TCP分组后,根据字节流Seq序号,将其合并在缓存区。即
TCP只负责将交由的数据按照字节流顺序无差别传输到接收端,而具体这些数据如何按照多少分组发送,每个分组多大,以及最终接受的字节流如何解析,交由应用层解决。
只是字节流传输采取一部分一部分分组的形式传输,所以表面看着像“粘包”。
需要提一点:
TCP为了确保传输效率,在连续传输多个小分组时,可能会采取Nagle算法,会将它们合并一并传输,但在接收端看来仍然是最终的字节流数据。