TCP粘包和拆包

什么是粘包和拆包?

当发送包同时发送两个数据包时,接收包只收到了一个数据包,其中包含了两个数据包的信息,这种现象为粘包。这种情况下,接收方无法分清两个数据包的界限,很难处理

当发送包同时发送两个数据包时,接收方也收到了两个数据包。但是这两个数据包,一个是不完整的,一个是多出来一块,这种现象为拆包。

为什么会发送粘包和拆包?

  • 要发送的数据包大于TCP发送缓存区剩余大小,就会发生拆包
  • 要发送的数据包大于最大报文长度,就会发生拆包
  • 要发送的数据包小于TCP发送方缓冲区剩余大小,就会发生粘包
  • 接收方的应用未及时读取接收缓存区剩余大小,会发生粘包

如何解决?

消息定长:

发送方将数据包设置为相同的长度,这样接收方每次都将接收缓存区的数据按相应长度进行拆分

设置消息边界:

接收方就可以通过消息边界将数据分隔开

将消息分为消息头和消息体:

在消息头中包含消息长度

posted @ 2020-04-20 17:24  ashen1999  阅读(154)  评论(0编辑  收藏  举报