当前位置: 首页 > news >正文

TCP/IP的分包粘包

TCP/IP的分包粘包

  • 分包粘包介绍
  • 导致分包粘包的原因
    • 导致TCP粘包的原因:
    • 导致TCP分包的原因:
    • 避免分包粘包的措施

分包粘包介绍

因为TCP为了减少额外开销,采取的是流式传输,所以接收端在一次接收的时候有可能一次接收多个包。而TCP粘包就是发送方的若干个数据包到达接收方的时候粘成了一个包。多个包首尾相接,无法区分。当然还有可能是分包情况,同一个包,两次才能接收到。

导致分包粘包的原因

导致TCP粘包的原因:

  1. 发送端等待缓冲区满才进行发送,造成粘包
  2. 接收方来不及接收缓冲区内的数据,造成粘包
  3. 由于TCP协议在发送较小的数据包的时候,会将几个包合成一个包后发送

导致TCP分包的原因:

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

避免分包粘包的措施

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

相关文章:

  • 盘点:查快递教程
  • TransGPT 开源交通大模型开源
  • gitignore文件使用方法(gitignore教程)(git status --ignored)(git check-ignore -v <file>)
  • mybatis拼接sql导致的oom报错 GC报错
  • 如何通俗理解扩散模型?
  • 【C#】并行编程实战:并行编程中的模式
  • Apache Kafka 入门教程
  • python皮卡丘编程代码教程,用python打印皮卡丘
  • shell脚本:数据库的分库分表
  • AtCoder Beginner Contest 312(A~D)
  • SQL中Partition的相关用法
  • 微服务——Docker
  • 测试|测试用例方法篇
  • 负载均衡的策略有哪些? 负载均衡的三种方式?
  • 二十三章:抗对抗性操纵的弱监督和半监督语义分割的属性解释
  • curator实现的zookeeper可重入锁
  • 抽象工厂模式——产品族的创建
  • 【C语言初阶篇】自定义类型结构体我不允许还有人不会!
  • 重大更新|Sui主网即将上线流动性质押,助力资产再流通
  • day3 驱动开发 c语言编程
  • 【字节跳动青训营】后端笔记整理-3 | Go语言工程实践之测试
  • 【Android】Recyclerview的缓存复用
  • 机器学习:混合高斯聚类GMM(求聚类标签)+PCA降维(3维降2维)习题
  • libuv库学习笔记-processes
  • c++ 给无名形参提供默认值
  • NO1.使用命令行创建Maven工程
  • 深度学习入门(一):神经网络基础
  • 网络知识整理
  • 如何有效地使用ChatGPT写小说讲故事?
  • 原生求生记:揭秘UniApp的原生能力限制