0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【推荐】TCP为何粘包?粘包问题如何解决?

亿佰特物联网应用专家 2022-09-23 10:00 次阅读

我们在涉及TCP协议的应用中,经常会出现粘包的问题。所谓粘包,简单地讲,就是我有两条消息,明明发送端的代码是分两次发送的,但是在接收端却一次性就接收到了两条消息。这个情况不管是在嵌入式行业还是在互联网行业,都非常的普遍。

TCP协议为什么粘包?

那就需要先了解 TCP 的定义。TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。其中跟粘包关系最大的就是基于字节流这个特点。字节流可以理解为一个双向的通道里流淌的数据,这个数据其实就是我们常说的二进制数据,简单来说就是一大堆 01 串。这些 01 串之间没有任何边界。7dda0d04-3ab3-11ed-b180-dac502259ad0.png应用层传到 TCP 协议的数据,不是以消息报为单位向目的主机发送,而是以字节流的方式发送到下游,这些数据可能被切割和组装成各种数据包,接收端接收到这些数据包后没有正确还原之前的消息,因此出现粘包现象。那为什么会出现不能正确还原的情况呢?主要有两个方面的原因:

1. 发送端的原因发送端在组装消息的时候,就把几个小包合成一包了,这样接收端自然无法解析出小包。这对应的就是Nagle 算法。因为TCP和Nagle 算法都是上个世纪的产物了,在早期的网络中这样做,可以显著地减小网络的压力。否则频繁地发送仅有几个字节的小包,会严重浪费网络IO性能。但是在现代互联网中,网络性能已经有了大幅提升,似乎Nagle 算法提升的那么一点IO性能就不是那么重要了,反而由于等待数据来合并的操作,会导致传输延迟变大,在网络游戏应用时,就会非常影响体验。所以现在一般都会关掉它。2. 接收端的原因接收端接收到消息以后,应用层总是不能立即取走数据,总是会有接收缓冲区的存在。如果两条独立的消息进入缓冲区的间隔太小,应用层不能在两次消息中间取走上一条消息,那么下次读取的时候,就势必会把两包消息同时读出来,这也会导致粘包。7df3fdea-3ab3-11ed-b180-dac502259ad0.png

而且这个情况并不能通过让发送端在时间上均匀发包来避免,因为网络不稳定情况的存在,即使是时间上均匀发送的数据包,在接收端看来也可能是随机出现的。

如何规避粘包的负面影响?

根据以上分析,我们不难发现,想要杜绝粘包的问题出现,基本上是不可能的。即使发送端和接收端都能自己控制,但是网络传输的过程也是很难控制的。
但是即使粘包的问题存在,也不影响我们大规模的使用TCP协议。因为这个问题在应用层非常好处理。大致有两种思路:1. 在信息中加入特殊的标志作为分隔符7e1858c0-3ab3-11ed-b180-dac502259ad0.png

这样,当应用层检测到特殊的分隔符后,便知道这是一包得到开始和结束,就可以进行分片等操作,问题便迎刃而解。不过这样存在一些弊端。比如定义分隔符为“12345678”,那如果消息内容里面出现“12345678”的字符串呢?这样就会导致消息被异常的切片,导致接收到的消息错误。但假如自己能够控制消息的内容,保证里面不会出现“12345678”的内容,则此方法较为灵活。2. 加入信息的长度7e2ec5e2-3ab3-11ed-b180-dac502259ad0.png根据约定好的长度的字段,读取消息长度的信息,再根据消息长度信息读取消息内容。这也是一种非常常用的方法,在很多协议中都有体现。
3. 添加包首部发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,就可以通过读取包首部的长度字段,知道每一个数据包的实际长度。以上就是本期关于解决TCP粘包问题的内容,小编码字不易,求个点赞、分享、在看三连支持!我们下期见~~

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1356

    浏览量

    79095
收藏 人收藏

    评论

    相关推荐

    华纳云如何解读WinMTR的丢率数据?

    是如何解读WinMTR的丢率数据: 1. 丢率的定义 丢率 :在一定时间内,未能成功到达目的地的数据占发送数据
    的头像 发表于 12-30 16:51 70次阅读

    Linux网卡收流程

    Linux 网卡收流程如下 网卡收到数据 将数据从网卡硬件缓存移动到服务器内存中(DMA方式,不经过CPU) 通过硬中断通知CPU处理 CPU通过软中断通知内核处理 经过TCP/
    的头像 发表于 12-05 16:21 202次阅读
    Linux网卡收<b class='flag-5'>包</b>流程

    集成电路微组装用环氧接胶树脂析出及控制研究

    环氧接胶常用作集成电路接材料。在其固化过程中,经常观察到树脂析出现象。树脂析出物会沾污键合区,带来键合可靠性问题。本文利用接触角的方法研究了树脂析出的机理,讨论了基板粗糙度和树脂析出的关系,初步得出真空烘培对于树脂析出有较大影响,而基板粗糙度和树脂析出的严重程度无必然
    的头像 发表于 11-05 10:16 233次阅读

    原来UV胶水在LED灯具接中有这么多用胶点

    灯具中的重要耗材,在灯具制造中胶粘剂在LED照明产品中,主要起到接、 密封、导热、阻燃防护等功效。Chenlink作为国产UV胶水厂家,针对LED灯具也生产了一系列UV胶水,可用于玻璃接,塑料接以及金属
    的头像 发表于 07-26 09:23 674次阅读

    esp8266读取模拟数据并记录到eeprom,发送tcp时无法读取模拟如何解决?

    嗨,esp8266 读取模拟数据并记录到 eeprom,我正在将存储在 eeprom 中的数据作为 tcp 发送,但在发送 tcp 时无法读取模拟,如
    发表于 07-11 07:22

    为什么ESP8266 TCP透传过程会丢

    为什么ESP8266 TCP透传过程会丢
    发表于 07-09 07:55

    tcp_client例程为何去掉发送后,一直接收就会容易出现数据呢?

    / portTICK_PERIOD_MS);} 代码如下,当我使用tcp_client例程,并且把发送数据注释掉,再接收数据就很容易出现TCP数据,求助 [22:43:18.32
    发表于 06-17 07:47

    lwip tcp的原因?

    使用lwip协议栈,作为客户端应答2帧数据时,会有问题,在tcp write 后调用tcp output没有效果,设置 #define TF_NODELAY((u8_t)0x40U
    发表于 05-10 06:51

    电池和硬电池的区别有哪些呢?

    电池和硬电池是两种不同类型的锂离子电池封装方式,它们在材料、结构、性能以及应用领域上都存在显著的区别。
    的头像 发表于 05-07 10:25 1w次阅读

    锂电池软和硬哪个好

    锂电池作为现代电子设备和电动汽车的主要电源,其封装形式主要分为软和硬两种。
    的头像 发表于 04-28 17:22 7462次阅读

    技术分享 | 芯片接空洞的超声检测

    随着电子封装技术向小型化发展,芯片散热问题逐渐成为阻碍其具有高可靠性的瓶颈,特别是功率器件,芯片接空洞是造成器件散热不良而失效的主要原因。因此,在对元器件的筛选检测工作中,往往需要通过超声检测手段
    的头像 发表于 04-11 11:48 1379次阅读
    技术分享 | 芯片<b class='flag-5'>粘</b>接空洞的超声检测

    新能源汽车电池为何缺乏通用性?

    电池电压又分为额定电压、端电压、开路电压、负载电压、最高充电电压、最低放电电压,这些都对电池的通用型造成很大影响。
    发表于 04-10 11:17 518次阅读

    接层空洞对功率芯片热阻的影响

    共读好书 潘浩东 卢桃 陈晓东 何骁 邹雅冰 (工业和信息化部电子第五研究所) 摘要: 采用有限元数值模拟方法,建立金氧半场效晶体管(MOSFET)三维有限元模型,定义不同大小和位置的接层空洞模型
    的头像 发表于 02-02 16:02 593次阅读
    <b class='flag-5'>粘</b>接层空洞对功率芯片热阻的影响

    烙铁头不锡的现象怎么解决?

    由于机械结构、功能、用途的不同,电烙铁的主要用途是焊接元件和导线。我们在进行焊锡丝焊接的时候经常会遇到烙铁头不锡的现象,该怎么解决呢?其实造成不锡的缘故还是很多,只能从中去寻找这些问题从而
    的头像 发表于 01-22 17:37 8565次阅读
    烙铁头不<b class='flag-5'>粘</b>锡的现象怎么解决?

    电池优劣势有哪些?

    电池优劣势有哪些? 软电池是一种新型的电池类型,相对于传统的硬电池有着一些优势和劣势。 第一部分:引言 软电池是一种采用软式包装
    的头像 发表于 01-10 10:30 2761次阅读