列表

详情


37. 请你说说 TCP 粘包

回答思路

得分点 TCP基于字节流,无法判断发送方报文段边界 标准回答 多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若发送方发送数据包的长度和接收方在缓存中读取的数据包长度不一致,就会发生粘包,发送端可能堆积了两次数据,每次100字节一共在发送缓存堆积了200字节的数据,而接收方在接收缓存中一次读取120字节的数据,这时候接收端读取的数据中就包括了下一个报文段的头部,造成了粘包。 解决粘包的方法: 1. 发送方关闭Nagle算法,使用TCP_NODELAY选项关闭Nagle功能 2. 发送定长的数据包。每个数据包的长度一样,接收方可以很容易区分数据包的边界 3. 数据包末尾加上\r\n标记,模仿FTP协议,但问题在于如果数据正文中也含有\r\n,则会误判为消息的边界 4. 数据包头部加上数据包的长度。数据包头部定长4字节,可以存储数据包的整体长度 5. 应用层自定义规则 加分回答 造成粘包的因素有很多,有可能是发送方造成的,也有可能是接收方造成的。比如接收方在接收缓存中读取数据不及时,在下一个数据包到达之前没有读取上一个,可能也会造成读取到超过一个数据包的情况。

上一题