TCP流有啥特点?沾包问题又是啥?如何解决粘包问题?
Posted 我要出家当道士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP流有啥特点?沾包问题又是啥?如何解决粘包问题?相关的知识,希望对你有一定的参考价值。
目录
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 是如何解决的