聊聊Netty[粘包与半包问题]

通过本篇文章,你可以了解到

  • 什么是粘包与半包
  • 解决粘包与半包的基本思路与策略
  • Netty 是如何解决粘包与半包问题(解码器)

什么是粘包与半包

TCP是一个流式传输协议,其数据是没有边界的,对于发送方来讲就是讲一个一个数据发送到接收端,接收端读取io缓冲区,根据不同的解析协议来解析实际的数据

粘包

见下图,比如下图的一个tcp包中的内容就是我们要发送的一个数据。我们一共发送了两个数据,但是接收端解析处理之后把两个数据合并了。这就是粘包。

####### 粘包的本质原因

  • 发送方写入的数据 < 套接字缓冲区大小
  • 接收方读取套接字缓存区不够及时
半包

半包简单讲,就是我们发送了一个AB,但是接收读取的时候,只拿到了一部分数据(就是一半)。

半包
  • 发送方写入数据 > 套接字缓冲区大小
  • 发送的数据大于协议的MTU(Maximum Tranmission Unit) 最大传输单元

解决粘包与半包的基本思路有策略

思路其实从分析本质原因的时候,就可以留意到实际的问题本质是:接受端在解析数据的时候如何识别一条数据的边界

实际的解决策略见下图[图片来源于见参考]

Netty 是如何解决粘包与半包问题(解码器)

Netty 根据上面的封装成帧的方案提供了三种实现方式

  • FixedLengthFrameDecoder(固定长度)
  • DelimiterBasedFrameDecoder(分隔符)
  • LengthFieldBasedFrameDecoder(固定长度存储内容的长度信息)
    • 因为其比较复杂,响应的Netty有其对应的Decoder(解码器)

参考