什么是 TCP 粘包/拆包

什么是 TCP 粘包?

TCP 粘包 (Nagle's Algorithm) 指的是发送方发送的多个数据包,在接收端看起来就像是一个大的数据包。简单来说,就是多个独立的报文被“粘”在一起了

这通常发生在以下情况:

  • 发送方发送频率快,数据量小:当发送方以极快的速度发送多个小数据包时,TCP 协议的 Nagle 算法会为了提高网络利用率,将这些小数据包缓存起来,直到积累到一定大小或者收到接收方的 ACK 确认后,才一次性发送出去
  • 接收方读取速度慢:当接收方应用程序从缓冲区读取数据时,如果一次性读取了多个数据包,就会发生粘包

举个例子:

假设客户端连续发送了两个数据包,内容分别是 “Hello”“World”

  1. 发送方将 “Hello” 发送出去
  2. 发送方很快又发送 “World”,但此时网络可能拥塞,或 Nagle 算法正在等待
  3. TCP 将这两个数据包合并,一次性发送给接收方
  4. 接收方在接收缓冲区中收到的是 “HelloWorld”

接收端的应用程序在读取时,无法区分出这是两个独立的消息,因此造成了粘包问题

什么是 TCP 拆包?

TCP 拆包与粘包相反,指的是一个完整的数据包被拆分成多个小数据包进行发送

这通常发生在以下情况:

  • 发送的数据包过大:当发送的数据包超过 TCP 缓冲区的最大值时,TCP 会自动将其拆分为多个数据包进行传输
  • 网络传输过程中出现拥塞:网络拥塞时,路由器或防火墙可能会对数据包进行分片(fragmentation)。

举个例子:

假设客户端发送了一个 2000 字节的数据包,但网络 MTU(最大传输单元)是 1500 字节

  1. 发送方将 2000 字节的数据包拆分为两个数据包:第一个 1500 字节,第二个 500 字节
  2. 接收方在接收缓冲区中先收到 1500 字节的数据,然后又收到 500 字节的数据

接收端应用程序在读取时,可能只读取到一部分数据,导致无法获得一个完整的消息,从而造成拆包问题

Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:13:25

results matching ""

    No results matching ""