(计算机网络)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 分隔头和体。

相关推荐
明天也要努力学习9 小时前
HTTP 协议的基本格式和 fiddler 的用法
网络协议·http·fiddler
LCG米14 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
Tel1992530800416 小时前
温度湿度信号转WiFi/MQTT/Modbus TCP采集模块 无线传输
网络·网络协议·tcp/ip·工业自动化·工控设备
lazy H18 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
Linux运维技术栈18 小时前
WAF部署在防火墙后面,获取不到真实IP怎么办?
服务器·网络·tcp/ip·安全·防火墙·waf
低慢小uav19 小时前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发
德迅云安全-上官21 小时前
德迅游戏盾:面向 TCP 业务的分布式云安全防护方案
分布式·tcp/ip·游戏
星恒随风1 天前
Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind
linux·服务器·笔记·学习·tcp/ip
|_⊙1 天前
应用层协议HTTP与HTTPS
网络·网络协议·http
秦禹辰1 天前
ClipSketch AI把视频改造成图文漫画:选关键帧、生成手绘分镜、融合IP形象并自动写小红书文案
人工智能·tcp/ip·音视频