我们使用 TCP 协议在传输数据的时候,如果数据块比较大,就会考虑将其切分。把一个大的数据包进行切割成一个个小的数据包发送。这时候就会遇到拆包和粘包的问题。
比如说在这里客户端发送了两个数据包 D1 和 D2 到服务端,在传输的时候就可能会遇到下列问题:
- 情况1(正常):D1 和 D2 正常发送,每次发送一个整包。
- 情况2(拆包):D1 数据包比较大,D2 比较小。第一次发送 D1 的一部分,第二次发送 D1 剩下的和 D2 整包。
- 情况2(粘包):D1 和 D2 数据包都比较小,一次发送两个整包。
- 情况4(拆包):D1 数据包比较小,D2 比较大。第一次发送 D1 整包和 D2 一部分,第二次发送 D2 剩下的。这叫拆包。
- 情况5(拆包):D1 和 D2 数据包都比较大,这时候分开发。
TCP 在接受数据的时候,有一个滑动窗口来控制接受数据的大小,这个滑动窗口你就可以理解为一个缓冲区的大小。缓冲区满了就会把数据发送。数据包的大小是不固定的,有时候比缓冲区大,有时候小。这时候就会出现上面的现象。
解决的思路很简单,也就是每次发送一个数据包的时候,添加一个标识符,读的时候一直读到这个标识符才表示一个完整的数据包。也就是换行符“\n”。
// TODO