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

    文章

    1417

    浏览量

    83005
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    TO功率器件晶片接强度检测:一套完整的推拉力测试机解决方案

    在功率半导体领域,TO(晶体管外形)封装器件因其结构坚固、散热良好而被广泛应用于工业控制、新能源汽车及能源管理等高可靠性场景。然而,其内部晶片与基岛之间的焊接或接质量,直接决定了器件的长期导通性
    的头像 发表于 11-10 09:46 272次阅读
    TO功率器件晶片<b class='flag-5'>粘</b>接强度检测:一套完整的推拉力测试机解决方案

    GD32F470+LWIP TCP偶尔丢怎么解决?

    硬件校验和的宏,不相符。 通过wireshark在上位机监控数据,发现出现问题的时候,上位机是发送了数据的,但是板子似乎没有收到,而且过1.5秒后板子还会重发一次上一的数据,符合tcp没有收到ack
    发表于 09-29 06:43

    LED透镜接UV胶用于固定和粘合LED透镜

    LED透镜接UV胶是一种特殊的UV固化胶,用于固定和粘合LED透镜。它具有以下特点:1.高透明度:LED透镜接UV胶具有高透明度,可以确保光线的透过性,不影响LED的亮度和效果。2.快速固化
    的头像 发表于 08-08 10:11 937次阅读
    LED透镜<b class='flag-5'>粘</b>接UV胶用于固定和粘合LED透镜

    光学轮廓仪揭示:表面特性对 CFRP / 铝合金接性能影响的研究

    在材料科学领域,表面特性对碳纤维增强复合材料(CFRP)与铝合金接性能影响关键,二者接结构广泛应用于汽车轻量化、航空航天等领域。精准表征表面粗糙度与微观形貌是探究接机理的核心,光学轮廓仪以
    的头像 发表于 08-05 17:45 696次阅读
    光学轮廓仪揭示:表面特性对 CFRP / 铝合金<b class='flag-5'>粘</b>接性能影响的研究

    快断式覆成型保险丝 skyworksinc

    电子发烧友网为你提供()快断式覆成型保险丝相关产品参数、数据手册,更有快断式覆成型保险丝的引脚图、接线图、封装手册、中文资料、英文资料,快断式覆成型保险丝真值表,快断式覆成型保
    发表于 07-24 18:34
    快断式<b class='flag-5'>包</b>覆成型保险丝 skyworksinc

    更改最大数据大小时无法识别USB设备如何解决?

    将生产者 EP 端点描述符中的最大数据大小从 1024 字节更改为 512 字节时,无法识别 USB 设备。 请告知如何解决这个问题。
    发表于 05-20 08:13

    接聚酰亚胺PI膜除了使用PI膜专用UV胶粘接,还可以使用热固化环氧胶来解决!

    接聚酰亚胺PI膜可以使用PI膜专用UV胶粘接,但使用UV胶粘接时,需要接材料至少有一方要透UV紫外光方可,如不能透UV光,那么接PI这种难于接的材料时,还可以使用热固化环氧胶来
    的头像 发表于 05-07 09:11 1116次阅读
    <b class='flag-5'>粘</b>接聚酰亚胺PI膜除了使用PI膜专用UV胶粘接,还可以使用热固化环氧胶来解决!

    片工艺介绍及选型指南

    片作为芯片与管壳间实现连接和固定的关键工序,达成了封装对于芯片的固定功能,以及芯片背面电连接功能。在行业里,这一工序常被叫做片。由于其核心作用是固定芯片,因而也被称作固晶工艺或贴片工艺,英文表述为“Die Bonding”或“Die Attach”。
    的头像 发表于 04-09 10:37 1411次阅读
    <b class='flag-5'>粘</b>片工艺介绍及选型指南

    如何将Linux安装快速转成玲珑

    本篇将以 motrix 为例为大家展示如何将 Linux 安装快速转成玲珑
    的头像 发表于 03-12 16:01 1255次阅读
    如何将Linux安装<b class='flag-5'>包</b>快速转成玲珑<b class='flag-5'>包</b>

    精通芯片接工艺:提升半导体封装可靠性

    随着半导体技术的不断发展,芯片接工艺作为微电子封装技术中的关键环节,对于确保芯片与外部电路的稳定连接、提升封装产品的可靠性和性能具有至关重要的作用。芯片接工艺涉及多种技术和材料,其工艺参数的精确控制对于保证接质量至关重要。
    的头像 发表于 02-17 11:02 1973次阅读
    精通芯片<b class='flag-5'>粘</b>接工艺:提升半导体封装可靠性

    移动电源鼓怎么回事及处理方法

    移动电源(充电宝)鼓是一个值得关注的安全问题,其鼓的原因主要包括以下几点:
    的头像 发表于 01-27 15:41 1.5w次阅读

    调试TCP协议连接的常用工具

    Wireshark 是一个开源的网络协议分析器,它可以捕获和分析网络上的数据。Wireshark 支持多种协议,包括TCP/IP、HTTP、FTP等,是调试TCP连接的首选工具。 功能特点
    的头像 发表于 01-22 09:59 5143次阅读

    TCP三次握手的常见问题及解决方案

    (同步-确认),和ACK(确认)。 1. 什么是TCP三次握手? TCP三次握手是TCP连接建立的过程,包括: SYN :客户端发送一个SYN到服务器以发起连接。 SYN-ACK :
    的头像 发表于 01-06 09:11 1832次阅读

    TCP三次握手的网络抓分析

    在计算机网络中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手过程建立两个通信实体之间的连接,确保数据传输的可靠性和顺序性。 TCP三次握手概述
    的头像 发表于 01-06 09:05 1131次阅读

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

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