查漏补缺(五):TCP粘包

TCP粘包是在TCP长连接下才会发生的一种问题。因为TCP它是面向流的嘛,也就是它传输的报文段没有消息保护边界,也就是说如果一次性拿到多个报文段,对于接受端来说是不知道如何划分出原来的报文段的。并且由于Nagle优化算法的存在,发送端也不会每次只发送一个报文段,而是会将单个报文段丢在缓存区上,然后一次发送多个报文段,对于接受端来说,从缓存区中可能一次获取到了多个报文段,此时就无法准确地对报文段进行划分了。这个就是TCP粘包问题
发送端和接受端都有可能是造成TCP粘包问题的罪魁祸首:

  • 发送端:由于Nagle优化算法,不会每次单独发送一个报文段,而是一次性发送多个报文段。
  • 接收端:没有及时地接受报文段,导致缓存区中报文段堆积,造成粘包问题。

粘包问题也不是一定要处理的,比如说如果在传输一个大文件,那么粘包问题是无关紧要的。但如果是传输两个不相关的数据出现了粘包问题,那么此时就要去解决了。
解决思路:

  • 像ip数据报那样,给每个报文段加上首尾,就可以进行划分了,但是也要防止数据内部出现了首尾标记的字符,就会造成错误定位。可以参考ip数据包的透明传输来解决。
  • 发送报文段的时候,将它的长度也一起发送过去,那么接收端就可以得知从哪里划分这个报文段了。
发布了60 篇原创文章 · 获赞 7 · 访问量 3850

猜你喜欢

转载自blog.csdn.net/SCUTJAY/article/details/104953842