Socket TCP/IP协议数据传输过程中的粘包和分包问题

news2024/11/19 15:34:04

Socket TCP/IP协议数据传输过程中的粘包和分包问题

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:

在这里插入图片描述
下面对上面的图进行解释:
1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。
2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲buffer,然后由缓冲buffer最后刷到数
据链路层的,那么就有可能把数据包2的一部分数据结合数据包1的全部被一起发送出去了,这样在服务器端就有可能出现这样的情况,导致读取的数据包包含了数据包2的一部分
数据,这就产生粘包,当然也有可能把数据包1和数据包2全部读取出来。
3.分包情况:意思就是把数据包2或者数据包1都有可能被分开一部分发送出去,接着发另外的部分,在服务器端有可能一次读取操作只读到一个完整数据包的一部分。
4.在数据包发送的情况下,有可能后面的数据包分开成2个或者多个,但是最前面的部分包,黏住在前面的一个完整或者部分包的后面,也就是粘包和分包同时产生了。

二:产生上情况的内部原因有下面几点:

1.数据发送端发送数据给缓冲buffer太大,导致发送一个完整的数据包被分几次发送给缓存buffer,然而缓冲buffer等到数据满了以后会自动把数据发送的数据链路层去,这样就
导致分包了。
2.TCP协议定义有一个选项叫做最大报文段长度(MSS,Maximum Segment Size),该选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长
度。在一定程度上MSS应该能尽可能多地承载用户数据,用于在传输通路上又可能避免分片,但是在复杂的网络环境下确定这个长度值非常困难,那么在这样的情况下在传输过
程中产生分包,粘包就很常见了
3.以太网,IP,TCP,UDP数据包分析
4.数据帧的有效载荷(payload)比以太网的最大传输单元(MTU)大的时候,进行了IP分片。

三:解决数据分包和粘包的基本策略如下

1.消息定长,比如定一个100,那么读取端每次读取数据就截取100个长度的数据,然后交给业务成去做解析
2.在消息的尾部加一些特殊字符,那么在读取数据的时候,只要读到这个特殊字符,就认为已经可以截取一个完整的数据包了,这种情况在一定的业务情况下实用。
3.读取缓存的数据是不定长的,所以我们把读取到的数据添加到我们自己的一个byte[]数组中,然后根据我们的业务逻辑来找到指定的特殊协议头部,协议长度,协议尾部,然后
从我们的byte[]中获取一个完整的数据包,然后再对数据包进行业务解析就可以得到正确结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PowerBI 开发 第23篇:共享数据集

Power BI共享数据集的优点是:只要数据集刷新,那么引用该数据集的报表都会自动刷新,节省了报表数据刷新的时间和算力,缺点是:使用共享数据集的报表,虽然可以新增Measure(Measure仅存在于本地报表中&#xff…

The baby-bust economy “婴儿荒”经济 | 经济学人20230603版社论双语精翻

2023年6月3日《经济学人》(The Economist)封面文章暨社论(Leaders)精选:《“婴儿荒”经济》(“The baby-bust economy”)。 baby-bust即“婴儿荒”(生育低谷)&#xff0c…

Unity Shader Graph Ase三者分别有什么不一样的地方?

什么是Shader? 着色器 (Shader) 应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务的时使用的指令,用于计算机图形的颜色或明暗。但近来,它也能用于处理一些特殊的效果,或者视频后处理。通俗的说&#xf…

机器学习:基于AdaBoost算法模型对信用卡是否违约进行识别

系列文章目录 作者:i阿极 作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒…

低代码开发重要工具:jvs-form(表单引擎)2.1.7功能清单及新增功能介绍

jvs-form 2.1.7 版本功能清单 在低代码开发平台中,表单是用于收集和编辑数据的页面。它通常用于创建、更新或查看单个记录的详细信息。 jvs-form是jvs快速开发平台的8大引擎的其中之一,它的特点: 与动态模型联动,支持动态的调整…

Python心经(6)

目录 callable super type()获取对应类型 isinstance判断对象是否是某个类或者子类的实例 issubclass,判断对象是不是类的子孙类 python3的异常处理 反射: 心经第三节和第五节都写了些面向对象的,这一节补充一…

黑苹果 或者 Mac 因 mds资源占用过高,导致频繁死机

开机后不久,风扇狂转,温度升高,然后死机,关机。 1. 使用 “Apple 诊断”测试 Mac 先看看硬件层面是否有问题。 使用“Apple 诊断”测试 Mac。 这款 Mac 的处理器是 Intel ,开启 Mac,然后在 Mac 启动时立…

java的File

一、File (一)新建File对象 File对象表示一个路径,可以是文件路径,也可以是文件夹路径;这个路径可以是存在的,也可以是不存在的。 File类常见的构造方法: 例如: 注意:因…

母线差动保护(一)

与其他的主设备保护相比,母线保护的要求更为苛刻。当变电站母线发生故障时,如不及时切除故障,将会损坏众多电力设备,破坏系统的稳定性,甚至导致电力系统瓦解。如果母线保护拒动,也会造成大面积的停电。因此…

微服务外网部署灵活配置方案(不改代码适配apm和日志中心)

1.综述 之前微服务在进行部署时,有关日志中心和apm相关的配置都是放在代码相应的配置文件中的。 日志中心: /src/main/resources/logback-spring.xml /PIPELINE/docker/flume/hosts apm: /PIPELINE/docker/apm/apm_agent_dev.config /PIPELINE/docker/apm/ap…

TensorFlowLite 声音识别

开发 添加tensorflow的核心依赖 implementation org.tensorflow:tensorflow-lite-task-audio:0.4.0将训练模型放到main/assets文件夹下 在build.gradle中配置 因为打包时tflite文件可能会被压缩,所以需要配置如下 buildFeatures {viewBinding true}androidResources {noComp…

2023 开放原子全球开源峰会高峰论坛成功举办

6 月 11 日,以 “开源赋能,普惠未来” 为主题的 2023 开放原子全球开源峰会高峰论坛在北京成功举办。工业和信息化部相关司局、北京市经济和信息化局、北京经济技术开发区管理委员会相关领导出席并致辞。 北京市经济和信息化局副局长王磊在致辞中表示&am…

4、5类LSA案例

拓扑 需求 实现PC1和PC3互联互通 配置步骤 1)配置接口信息 - 配置PC的IP地址 - 配置路由器的接口 2)配置OSPF单区域 - 创建ospf进程,定义router-id - 指定相应区域 - 宣告网段进入ospf 3)配置OSPF多区域 4) R6配置去往PC3的静…

Matlab论文插图绘制模板第103期—分组散点图

在之前的文章中,分享了Matlab散点图的绘制模板: 进一步,再来分享一下分组散点图的绘制模板。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行下载。有需要的朋友可以…

【裸机开发】按键输入实验

目录 一、硬件原理分析 二、寄存器分析 1、时钟源初始化 2、设置 IO 复用 3、初始化 IO 复用引脚(设置电气属性) 4、初始化GPIO 三、汇编代码(start.s) 四、公共头文件(imx6u.h) 四、C 代码编写 …

【6.13 代随_56day】 两个字符串的删除操作、编辑距离

两个字符串的删除操作、编辑距离 两个字符串的删除操作1.方法图解步骤代码 编辑距离1.方法图解步骤代码 两个字符串的删除操作 力扣连接:583. 两个字符串的删除操作(中等) 1.方法 确定递推公式 当word1[i - 1] 与 word2[j - 1]相同的时候 …

STL之list

目录 list模拟实现一. list的基本框架二. list_node类1.构造函数2.其他函数 三. 迭代器(iterator)1.结构2. 构造函数3. 运算符重载operator-> 四.反向迭代器1.结构2.构造函数3.运算符重载 五. list常用方法及实现1. 默认构造函数a.empty_init 2.迭代器…

8. WebGPU 平移变换

我们将开始编写与顶点缓冲区文章中的示例类似的代码,但这次将绘制单个 F 而不是一堆圆,并使用索引缓冲区来保持数据更小。 让我们在像素空间而不是裁剪空间中工作,就像 Canvas 2D API 我们将制作一个 F,将从 6 个三角形构建它 …

啥?PCB拼版对SMT组装有影响!

PCB为什么要拼版? 拼版主要是为了满足生产的需求,有些PCB板太小,不满足做夹具的要求,所以需要拼在一起进行生产。 拼版也可以提高SMT贴片的焊接效率,如只需要过一次SMT,即可完成多块PCB的焊接。 同时也可…

你知道ai绘画工具都有哪些吗?ai画图的软件分享给你

大家好!你有没有想过,如果我们能有一种神奇的工具,可以帮助我们实现想象中的绘画作品,该有多好呢?现在,随着人工智能的发展,我们可以借助ai绘画工具来探索艺术的奇妙世界了!不过你是…