TCP流有啥特点?沾包问题又是啥?如何解决粘包问题?

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 选项)。

以上是关于TCP流有啥特点?沾包问题又是啥?如何解决粘包问题?的主要内容,如果未能解决你的问题,请参考以下文章

详解啥是 TCP 粘包和拆包现象并演示 Netty 是如何解决的

使用 boost.python 时 c++ 流有啥问题?

TCP通信中的“沾包”现象

NodeJS:Duplex 流和 Transform 流有啥区别?

数据输入/输出流和缓冲输入/输出流有啥区别?

TCP沾包问题