目录
【计算机网络|TCP流有啥特点(沾包问题又是啥?如何解决粘包问题?)】1、TCP流的特点
2、沾包现象产生的两个原因
3、沾包现象的解决办法
1、TCP流的特点 如下图所示,发送方执行 TCP 发送函数,需要发送的消息会先保存在 TCP 发送缓冲区中,之后由系统择机发送 TCP 报文,注意系统发送的报文数量与 send 函数没有一对一的数量关系。这是因为 TCP 是一个面向流的协议,TCP缓冲区就像一个蓄水池,上层需要发送的数据像流水一样暂存在蓄水池中,待时机成熟时将应用数据打包发送。TCP流的特性会造成 “粘包” 现象的产生,具体可见第二张图。
文章图片
2、沾包现象产生的两个原因
文章图片
粘包现象分为两方面,首先TCP是面向流的协议,应用层的数据会缓存在一起(及时多次调用send函数,数据在发送缓冲区中也会粘在一起),没有消息边界之分,所以难免会发生粘包现象。其次因为 TCP 高频率传输负载较小的数据时,会降低网络利用率(网络头部从二层到四层占至少56个字节,负载数据越大,网络利用率越高),为了提高网络利用率,目前操作系统默认开启 Nagle 算法,Nagle 算法如下流程图所示,其可以避免 TCP 发送大量的小包。
文章图片
3、沾包现象的解决办法 粘包依据两个不同的产生原因分为存在不同的解决办法。首先,应用程序可以自定义应用层消息格式,设置特定的消息头并记录消息长度以确定边界;其次可以关闭默认的Nagle选项(若应用程序需要高频率发送小包,并且对时延有严格的要求,可以考虑禁用 Nagle,即开启 TCP_NODELAY 选项)。
推荐阅读
- C++|基于QT实现简单的TCP通信
- 十万个为什么|为什么需要TCP加速(TCP怎么加速呢?)
- QT|QT实现TCP通信
- 计算机网络|《计算机网络——自顶向下方法》学习笔记——应用层
- 计算机网络|计算机网络学习——TCP/IP四层模型之应用层
- tcp/ip|TCP、IP 、HTTP——深入学习TCP协议
- 计算机网络|TCP的报文详细解读
- 计算机网络|[计算机网络]二——计算机网络参考模型(分层模型和数据传输过程)、OSI七层、封装和解封装
- 计算机网络|搭建局域网&&文件传输