粘包/拆包解决方案

154 阅读1分钟

拆包/沾包问题

TCP是面向字节流的协议,在发送方发送的若干包数据到接收方接收时,这些数据包可能会被粘成一个数据包,而从接收缓冲区看,后一包数据的头紧接着前一包数据的尾,这就形成沾包问题

但如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP 就会将其拆分为多次发送,这就是拆包问题,也就是将一个大的包拆分为多个小包进行发送,接收端接收到多个包才能组成一个完整数据。

解决方案

对于粘包和拆包问题,通常可以使用这四种解决方案:

  1. 使用固定数据长度进行发送,发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0等填充到指定长度再发送。
  2. 发送端在每个包的末尾使用固定的分隔符,例如##@##。如果发生拆包需等待多个包发送过来之后再找到其中的##@##进行合并。如果发送沾包则找到其中的##@##进行拆分。
  3. 将消息分为头部和消息体,头部中保存整个消息的长度,这种情况下接收端只有在读取到足够长度的消息之后,才算是接收到一个完整的消息。
  4. 通过自定义协议进行粘包和拆包的处理。