(计算机网络)TCP 粘包与拆包

什么是粘包和拆包?

  • 粘包:指多条应用层消息在接收方一次性读到,数据"粘"在一起,无法区分消息边界。

    • 例子:客户端连续发送 [Hello][World],接收方一次 recv() 得到 [HelloWorld]
  • 拆包 :指一条应用层消息被 TCP 拆成多段传输,接收方需要多次 recv() 才能拼凑完整。

    • 例子:客户端发送 [HelloWorld],接收方第一次 recv() 得到 [Hello],第二次得到 [World]

一、为什么会出现粘包和拆包?

TCP 是面向字节流的协议,它只保证数据有序、不丢、不重复,但不会保留应用层消息的边界。

因此:

  • 应用层发送的多条消息,可能被 TCP 合并在一起(粘包)。

  • 一条消息可能被拆成多个数据包传输(拆包)。


二、粘包与拆包的场景

1. 粘包现象

客户端连续发送两条消息:

复制代码
[Hello]
[World]

服务端可能一次 recv() 收到:

复制代码
[HelloWorld]

👉 多条消息粘在一起。

2. 拆包现象

客户端发送一条很大的消息:

复制代码
[HelloWorldHelloWorld... 很长的数据]

服务端可能第一次收到:

复制代码
[HelloW]

第二次收到:

复制代码
[orldHello...]

👉 一条消息被拆开。


三、产生原因

  1. TCP 无消息边界:只是一条连续的字节流。

  2. Nagle 算法:小包会合并传输。

  3. 接收端读取不及时:缓冲区积累数据,导致粘在一起。

  4. 消息过大:超过 MTU 或 TCP 缓冲区,只能拆分。


四、解决方案

1. 定长消息

  • 每条消息固定大小,例如 1024 字节,不够补齐。

  • 缺点:浪费空间。

2. 分隔符

  • 在消息末尾加特殊字符(如 \n\r\n)。

  • 类似 HTTP 协议用 \r\n\r\n 分隔头和体。

相关推荐
2401_873479407 分钟前
SOC告警日志中IP归属不明怎么办?部署IP离线库三步提升响应效率
网络·网络协议·tcp/ip
电子科技圈1 小时前
先进封装、芯粒架构和3D集成——先进异构集成亟需兼具标准化与定制化能力的互联及总线IP解决方案
tcp/ip·设计模式·架构·软件构建·代码规范·设计规范
德迅云安全-上官2 小时前
德迅云安全游戏盾与DDoS高防IP对比:差异、优势及选型指南
tcp/ip·游戏·ddos
想学好C++的oMen3 小时前
socket编程UDP
网络协议·udp
GitLqr13 小时前
玩转 WebSocket:从原理到 Flutter 实战
websocket·网络协议·flutter
微硬创新15 小时前
耐达讯自动化 CC-Link IE 转 PROFINET网关在污水厂智能化升级实战
人工智能·物联网·网络协议·自动化·信息与通信
TlSfoward20 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
2501_916007471 天前
深入理解HTTPS对称与非对称加密机制及Charles抓包实践
网络协议·http·ios·小程序·https·uni-app·iphone
2501_916008891 天前
HTTPS 抓包遇到证书绑定怎么办,使用 TraceEagle 解除 App 证书校验
网络协议·计算机网络·http·网络安全·ios·adb·https
不是光头 强1 天前
接口性能优化报告
网络协议·性能优化·rpc