粘包问题

在 TCP 这种字节流协议上做应用层分包是网络编程的基本需求。分包指的是在发生一个消息(message)或一帧(frame)数据时,通过一定的处理,让接收方能从字节流中识别并截取(还原)出一个个消息。因此,“粘包问题”是个伪命题

短连接分包

对于短连接的 TCP 服务,分包不是一个问题,只要发送方主动关闭连接,就表示一个消息发送完毕,接收方 read() 返回0,从而知道消息的结尾

TCP 发送机制

为了提高 TCP 的传输效率,TCP 有一套自己的发送机制

TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去

由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(push)操作

发送方的一个计时器期限到了,这时把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去

长连接分包

对于长连接的 TCP 服务,分包有四种方法

消息长度固定

使用特殊的字符或字符串作为消息的边界,例如 HTTP 协议的 headers 以“rn”为字段的分隔符

在每条消息的头部加一个长度字段,这恐怕是最常见的做法

利用消息本身的格式来分包,例如 XML 格式的消息中 ... 的配对,或者 JSON 格式中的 { ... } 的配对。解析这种消息格式通常会用到状态机(state machine)

复杂的分包

假如消息格式非常简单,“消息”本身是一个字符串,每条消息有一个4字节的头部,以网络序存放字符串的长度。消息直接没有间隙,字符串也不要求以 '0' 结尾

发送两条消息“hello”和“smartboy”,打包后的字节流共有21字节

0x00, 0x00, 0x00, 0x05, 'h', 'e', 'l', 'l', 'o',

0x00, 0x00, 0x00, 0x08, 's', 'm', 'a', 'r', 't', 'b', 'o', 'y'

假设数据最终都全部到达,数据解析逻辑至少能正确处理以下各种数据到达的次序

一个字节一个字节到达

数据分两次到达,第一次收到2个字节,不足消息的长度字段

数据分两次到达,第一次收到4个字节,刚好够长度字段,但是没有 body

数据分两次到达,第一次收到8个字节,长度完整,但 body 不完整

数据分两次到达,第一次收到9个字节,长度完整,但 body 也完整

数据分两次到达,第一次收到10个字节,第一条消息的长度完整、body 也完整,第二条消息长度不完整

请自行移动和增加分割点,一共有超过 100 万种可能(221-1)

数据一次就全部到达

php tcp 粘包,TCP 粘包拆包相关推荐

  1. UDP和TCP 的半包、粘包、拆包

    ###简介 tcp是以流式发送数据的,数据之间无明显界限,只能人为的划分数据包的边界 在发送过程中 会因为缓冲区太小在传输超大包时 出现"半包" 会因为接收端消费速度太慢,导致数据 ...

  2. [网络知识]TCP协议中的粘包与拆包

    在平时客户端socket开发中,如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题. 我们都知道TCP属于传输层 ...

  3. TCP 粘包、半包 Netty 全搞定

    什么是粘包和半包? 粘包的主要原因: • 发送方每次写入数据 < 套接字缓冲区大小 • 接收方读取套接字缓冲区数据不够及时 半包的主要原因: • 发送方写入数据 > 套接字缓冲区大小 • ...

  4. tcp业务层粘包和半包理解及处理

    tcp粘包处理 tcp是流式传输的,是安全的, 可靠的,顺序的. udp是数据报协议,是不可靠的. 面试中经常被问到tcp粘包是如何处理的,通过百度和自己的理解,这里做笔记记录. 如果有不对,请指正~ ...

  5. TCP粘包、半包原理及解决方案

    引言:TCP协议是网络通信协议中十分重要的协议,相比于UDP协议来说,它是一个可靠的传输协议,并且是一个面向数据流的协议:所谓面向数据流,其实是指数据传输是以流式的方式传输,这些传输的数据就像一条河里 ...

  6. 深入理解什么是TCP 粘包?粘包警察是什么梗?

    一.前言 ​本文围绕 TCP 协议展开,先来回顾下 TCP 协议的特点: TCP 是面向连接的传输层协议. 每一条 TCP 连接只有两个端点,每一条 TCP 连接只能是点对点的(一对一). TCP 提 ...

  7. TCP利用封包和解包解决“粘包”问题

    本文参考自徐晓鑫<后台开发>,给出一个可实际应用的demo,该demo核心在于封包和解包的思想,以及自定义发送.接收数据. 一.TCP粘包现象 what? TCP是个"流&quo ...

  8. TCP 协议如何解决粘包、半包问题

    TCP 协议是流式协议 很多读者从接触网络知识以来,应该听说过这句话:TCP 协议是流式协议.那么这句话到底是什么意思呢?所谓流式协议,即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标 ...

  9. 完美解决Python套接字编程时TCP断包与粘包问题

    首先,来看一个代码,使用TCP协议,发送端发送一句话,接收端接收并显示,运行完全正常. 接下来,把客户端代码稍微修改一下,连续发送多个数据, 按照正常的想法,在服务端输出的信息应该是分为多行的,这样才 ...

  10. socket 网络通信(基于tcp协议)以及粘包解决方案

    socket 网络通信(基于tcp协议)以及粘包解决方案 参考文章: (1)socket 网络通信(基于tcp协议)以及粘包解决方案 (2)https://www.cnblogs.com/amiee- ...

最新文章

  1. 从头到尾彻底解析Hash表算法
  2. APP Store案例数据分析
  3. Python之max(num, key=lambda x:x[0])用法的详细解析
  4. Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
  5. 【多态】向上转型调用方法的规则
  6. 常用的数据结构_三分钟了解区块链常用数据结构「默克尔树」
  7. MacOS安装pip失败,提示:SyntaxError: invalid syntax
  8. js小数运算出现多为小数问题_js小数计算小数点后显示多位小数的实现方法
  9. linux sonar 安装教程,Linux下为Sonarqube安装中文插件
  10. Go语言基础进阶—程序结构—命名
  11. 四处收集拼接的html学习笔记
  12. 【ACWing】671. DDD
  13. 连行为艺术家都开始直播带货了
  14. at命令不生效 linux_linux中at命令详解
  15. 面试字节跳动经历。。。
  16. 工具提取MP4中的音视频
  17. MT6737 Android N 平台 Audio系统学习----录音到播放录音流程分析
  18. 泛泰SKYA850黑砖QHSUSB_DLOAD救砖教程(操作篇)[2013.6.3更新]
  19. Linux文件系统架构
  20. 我在做开源芯片 | 人物志

热门文章

  1. 用MATLAB进行灰度图像灰度值的处理
  2. 分区和分片的区别_MySql分表、分库、分片和分区知识点介绍
  3. 庆阳顺盛铝合金模板CAD系统
  4. 如何做好电商运营?倍赞网:这十个步骤必须懂
  5. 软件开发的步骤和流程
  6. 15. RDMA之RoCE Soft-RoCE
  7. sql 删除重复数据 只保留一条
  8. [Python] Codecombat 攻略 Sarven 沙漠 (1-43关)截止至36关
  9. 互联网公司有哪些“逼死人”的制度?
  10. DSP模块之:EDMA