如何解决TCP拆包粘包问题

Posted kancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决TCP拆包粘包问题相关的知识,希望对你有一定的参考价值。

TCP协议是可靠的,数据包一定会到达(99.9%的情况下),而且是按顺序到达。

TCP是“流”协议,所谓“流”协议,就是没有界限,没有分割的一串数据。TCP会根据缓冲区实际情况进行划分,一个完整的包可能会拆分成多个包进行发送,也有可能把多个小包封装成一个大的数据包发送,这就是TCP粘包/拆包。

技术图片


发生原因

  • 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
  • 应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
  • 接收方法不及时读取套接字缓冲区数据,这将发生粘包。

解决方案

无论拆包还是粘包本质问题都是无法区分包界限,解决包界限的问题主要有以下几种方式:

  1. 消息数据的定长,比如定长100字节,不足补空格,接收方收到后解析100字节数据即为完整数据。但这样的做的缺点是浪费了部分存储空间和带宽。
  2. 消息数据使用特定分割符区分界限,比如使用换号符号做分割。
  3. 把消息数据分成消息头和消息体,消息头带消息的长度,接收方收到后根据消息头中的长度解析数据。

在实际开发中很多网络框架对TCP拆包粘包问题的解决做了很多支持,比如netty中LineBasedFrameDecoder解析器就是利用换号符号做分割。


参考文档

【1】浅谈TCP拆包粘包问题
【2】TCP粘包/拆包
【3】TCP粘包,拆包及解决方法






以上是关于如何解决TCP拆包粘包问题的主要内容,如果未能解决你的问题,请参考以下文章

Netty——解决TCP粘包、拆包

实战说明TCP协议栈的数据包拆包粘包问题

Netty_03_ByteBuf和网络中拆包粘包问题及其解决

Netty_03_ByteBuf和网络中拆包粘包问题及其解决

Netty框架之编解码机制二(自定义协议)

Netty框架之编解码机制二(自定义协议)