首页 > 其他分享 >TCP 粘包拆包

TCP 粘包拆包

时间:2023-03-18 20:22:54浏览次数:43  
标签:字节 TCP 粘包 发送 分包 长度 拆包 消息

TCP 粘包拆包

粘包问题

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

短连接分包

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

TCP 发送机制

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

  • TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去
  • 由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(push)操作
  • 发送方的一个计时器期限到了,这时把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去

长连接分包

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

  • 消息长度固定
  • 使用特殊的字符或字符串作为消息的边界,例如 HTTP 协议的 headers 以“\r\n”为字段的分隔符
  • 在每条消息的头部加一个长度字段,这恐怕是最常见的做法
  • 利用消息本身的格式来分包,例如 XML 格式的消息中 <root>...</root> 的配对,或者 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)
  • 数据一次就全部到达

标签:字节,TCP,粘包,发送,分包,长度,拆包,消息
From: https://www.cnblogs.com/xiaobingch/p/17231654.html

相关文章

  • Tcp/ip协议
    Tcp/ip协议Tcp:1.传输控制协议2.可靠的,面向连接的协议3.传输效率低because每次发送的请求报文都需要回应,So安全且低效TCP支持的应用协议主要有:Telnet,FTP,SMTP等UDP:1.......
  • TCP/IP网络编程 -- (十二)I/O复用
    TCP/IP网络编程--(十二)I/O复用如果为了并发使用多进程服务器,代价很大。因为创建进程需要大量的运算和内存空间,并且相互之间的数据交换也要用管道这种相对复杂的方法复用......
  • tcp实现聊天
    客户端1publicclassA{2publicstaticvoidmain(String[]args)throwsIOException{3Stringguo="你好啊";4intport=8888;5......
  • TCP/IP
    telnet:检查端口是否打开。telnet的一个最大作用就是检查一个端口是否处于打开,使用的命令是telnet[domainnameorip][port],这条命令能告诉我们到远端server指定端口......
  • C#-TCP协议通讯(一)-TCPClientHelper
    一、TCPClinet知识点1、创建TCPClient客户端发送消息示例:///<summary>///发送消息-未做粘包和拆包处理///</summary>///<param......
  • TCP/IP网络编程 -- (十)多进程服务器端
    TCP/IP网络编程--(十)多进程服务器端10.1进程概念及应用为了提高客户端的平均满意度,通常会使用并发服务器的方法,并且网络程序中数据通信时间比CPU运算时间大,因此向多个......
  • TCP/IP网络编程 -- (十一)进程间通信
    TCP/IP网络编程--(十一)进程间通信进程间通信基本概念因为两个进程间具有完全独立的内存空间,因此通信需要特殊的方式通过管道实现进程间通信管道并非进程的资源,与soc......
  • TCP 三次握手,给我长脸了噢
    大家好,我是小富~个人资源分享网站:FIRE本文收录在Springboot-Notebook面试锦集前言之前有个小伙伴在技术交流群里咨询过一个问题,我当时还给提供了点排查思路,是个典型......
  • 【转载】Socket 与 TCP 四次挥手(下)
    [转载](https://demonlee.tech/archives/2208002)Socket与TCP四次挥手(下)Demon.Lee2022年08月21日206次浏览本文实践环境:Operat......
  • 自定义TCP协议,私有TCP协议以及TCP协议安全性提高升级
    tcp协议是最底层的,一般来说无需修改,直接使用。但是在某些场景下,直接使用会带来一些安全性的问题:比如物联网设备。物联网设备需要经常的发送消息到服务器,如果直接使用标准T......