计算机网络|TCP流有啥特点(沾包问题又是啥?如何解决粘包问题?)

目录
【计算机网络|TCP流有啥特点(沾包问题又是啥?如何解决粘包问题?)】1、TCP流的特点
2、沾包现象产生的两个原因
3、沾包现象的解决办法

1、TCP流的特点 如下图所示,发送方执行 TCP 发送函数,需要发送的消息会先保存在 TCP 发送缓冲区中,之后由系统择机发送 TCP 报文,注意系统发送的报文数量与 send 函数没有一对一的数量关系。这是因为 TCP 是一个面向流的协议,TCP缓冲区就像一个蓄水池,上层需要发送的数据像流水一样暂存在蓄水池中,待时机成熟时将应用数据打包发送。TCP流的特性会造成 “粘包” 现象的产生,具体可见第二张图。
计算机网络|TCP流有啥特点(沾包问题又是啥?如何解决粘包问题?)
文章图片

2、沾包现象产生的两个原因 计算机网络|TCP流有啥特点(沾包问题又是啥?如何解决粘包问题?)
文章图片

粘包现象分为两方面,首先TCP是面向流的协议,应用层的数据会缓存在一起(及时多次调用send函数,数据在发送缓冲区中也会粘在一起),没有消息边界之分,所以难免会发生粘包现象。其次因为 TCP 高频率传输负载较小的数据时,会降低网络利用率(网络头部从二层到四层占至少56个字节,负载数据越大,网络利用率越高),为了提高网络利用率,目前操作系统默认开启 Nagle 算法,Nagle 算法如下流程图所示,其可以避免 TCP 发送大量的小包。
计算机网络|TCP流有啥特点(沾包问题又是啥?如何解决粘包问题?)
文章图片

3、沾包现象的解决办法 粘包依据两个不同的产生原因分为存在不同的解决办法。首先,应用程序可以自定义应用层消息格式,设置特定的消息头并记录消息长度以确定边界;其次可以关闭默认的Nagle选项(若应用程序需要高频率发送小包,并且对时延有严格的要求,可以考虑禁用 Nagle,即开启 TCP_NODELAY 选项)。

    推荐阅读