|
|
|
@ -8,14 +8,14 @@ TCP 是个 “流” 协议,所谓流,就是没有界限的一串数据。TC
|
|
|
|
|
|
|
|
|
|
![avatar](../../../images/Netty/TCP粘包拆包问题.png)
|
|
|
|
|
|
|
|
|
|
假设客户端依次发送了两个数据包 DI 和 D2 给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下 4 种情况。
|
|
|
|
|
假设客户端依次发送了两个数据包 D1 和 D2 给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下 4 种情况。
|
|
|
|
|
|
|
|
|
|
1. 服务端分两次读取到了两个独立的数据包,分别是 D1 和 D2,没有粘包和拆包;
|
|
|
|
|
2. 服务端一次接收到了两个数据包,DI 和 D2 粘合在一起,被称为 TCP 粘包;
|
|
|
|
|
3. 服务端分两次读取到了两个数据包,第一次读取到了完整的 DI 包 和 D2 包的部分内容,第二次读取到了 D2 包 的剩余内容,这被称为 TCP 拆包;
|
|
|
|
|
2. 服务端一次接收到了两个数据包,D1 和 D2 粘合在一起,被称为 TCP 粘包;
|
|
|
|
|
3. 服务端分两次读取到了两个数据包,第一次读取到了完整的 D1 包 和 D2 包的部分内容,第二次读取到了 D2 包 的剩余内容,这被称为 TCP 拆包;
|
|
|
|
|
4. 服务端分两次读取到了两个数据包,第一次读取到了 D1 包的部分内容,第二次读取到了 D1 包的剩余内容 和 D2 包的整包。
|
|
|
|
|
|
|
|
|
|
如果此时服务端 TCP 接收滑窗非常小,而 数据包 DI 和 D2 比较大,很有可能会发生第 5 种可能,即服务端分多次才能将 D1 和 D2 包 接收完全,期间发生多次拆包。
|
|
|
|
|
如果此时服务端 TCP 接收滑窗非常小,而 数据包 D1 和 D2 比较大,很有可能会发生第 5 种可能,即服务端分多次才能将 D1 和 D2 包 接收完全,期间发生多次拆包。
|
|
|
|
|
|
|
|
|
|
### TCP 粘包/拆包发生的原因
|
|
|
|
|
|
|
|
|
|