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

    文章

    1327

    浏览量

    78777
收藏 人收藏

    评论

    相关推荐

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

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

    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

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

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

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

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

    网络丢问题分析

    通常会带来严重的性能下降,特别是对 TCP 来说,丢通常意味着网络拥塞和重传,进而还会导致网络延迟增大、吞吐降低。 一、 哪里可能丢 接下来,我就以最常用的反向代理服务器 Nginx 为例,带你一起看看如何分析网络丢
    的头像 发表于 11-13 11:24 817次阅读
    网络丢<b class='flag-5'>包</b>问题分析

    何解tcp通信中的问题

    一、 问题概述 1、描述背景 采用TCP协议进行网络数据传送的软件设计中,普遍存在问题。这主要是由于现代操作系统的网络传输机制所产生
    的头像 发表于 11-11 11:40 1277次阅读
    如<b class='flag-5'>何解</b>决<b class='flag-5'>tcp</b>通信中的<b class='flag-5'>粘</b><b class='flag-5'>包</b>问题

    TCP和拆包产生的原因

    一、TCP现象 what? TCP是个“流”协议,即没有边界。由于这个特性以及实际的网络情况,在进行数据传输时假设我们连续调用send分别发送两段数据data1和data2,在接收
    的头像 发表于 11-10 14:07 675次阅读
    <b class='flag-5'>TCP</b><b class='flag-5'>粘</b><b class='flag-5'>包</b>和拆包产生的原因

    网络丢问题解析

    数据: 1.应用程序的数据,在TCP层增加TCP报文头,形成可传输的数据。 2.在IP层增加IP报头,形成IP报文。 3.经过数据网卡
    的头像 发表于 11-09 15:10 772次阅读
    网络丢<b class='flag-5'>包</b>问题解析

    tcp究竟会带来多大的性能问题

    一个项目对接第三方接口数据。对方是TCP接口,发送数据频率很高。平均2毫秒发送三四千个字节。由于TCP协议的问题,我这里接收到的数据
    的头像 发表于 11-08 16:16 983次阅读
    <b class='flag-5'>tcp</b>丢<b class='flag-5'>包</b>究竟会带来多大的性能问题

    挑战PI材料接困难,尝试这个解决方案吧!

    探秘PI材料难于接之迷,应用方案解决方法。
    的头像 发表于 10-26 17:37 1983次阅读
    挑战PI材料<b class='flag-5'>粘</b>接困难,尝试这个解决方案吧!

    芯片接失效模式和芯片接强度提高途径

    芯片接质量是电路封装质量的一个关键方面,它直接影响电路的质量和寿命。文章从芯片接强度的失效模式出发,分析了芯片接失效的几种类型,并从失效原因出发对如何在芯片接过程中提高其
    的头像 发表于 10-18 18:24 985次阅读
    芯片<b class='flag-5'>粘</b>接失效模式和芯片<b class='flag-5'>粘</b>接强度提高途径

    焊锡丝焊接时烙铁头不锡是怎么回事?

    焊锡丝焊接时不锡是手工焊接中常见的现象。最近,很多客户问焊锡丝不锡的原因是什么。以下由佳金源锡线厂家总结如下:1、焊锡丝表面一般涂有一层防涂层,用于防止焊锡丝和烙铁头等焊接工具粘在一起,这种
    的头像 发表于 10-14 16:05 3460次阅读
    焊锡丝焊接时烙铁头不<b class='flag-5'>粘</b>锡是怎么回事?