Netty进阶——粘包与半包(现象分析)

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty进阶——粘包与半包(现象分析)相关的知识,希望对你有一定的参考价值。

目录

一、粘包

1.1、粘包现象

  • 发送 abc def,接收 abcdef

1.2、粘包原因

  • 应用层:接收方 ByteBuf 设置太大(Netty 默认 1024)。
  • 滑动窗口:假设发送方 256 bytes 表示一个完整报文,但由于接收方处理不及时且窗口大小足够大,这 256 bytes 字节就会缓冲在接收方的滑动窗口中,当滑动窗口中缓冲了多个报文就会粘包。
  • Nagle 算法:会造成粘包。

二、半包

2.1、半包现象

加粗样式 - 发送 abcdef,接收 abc def

2.2、半包原因

  • 应用层:接收方 ByteBuf 小于实际发送数据量。
  • 滑动窗口:假设接收方的窗口只剩了 128 bytes,发送方的报文大小是 256 bytes,这时放不下了,只能先发送前 128 bytes,等待 ack 后才能发送剩余部分,这就造成了半包。
  • MSS 限制:当发送的数据超过 MSS 限制后,会将数据切分发送,就会造成半包。

三、粘包与半包现象的本质原因

  • 本质是因为 TCP 是流式协议,消息无边界。

四、MSS 限制的了解

  • 链路层对一次能够发送的最大数据有限制,这个限制称之为 MTU(maximum transmission unit),不同的链路设备的 MTU 值也有所不同,例如:以太网的 MTU 是 1500、FDDI(光纤分布式数据接口)的 MTU 是 4352。
  • MSS 是最大段长度(maximum segment size),它是 MTU 刨去 tcp 头和 ip 头后剩余能够作为数据传输的字节数

五、Nagle 算法的了解

  • 即使发送一个字节,也需要加入 tcp 头和 ip 头,也就是总字节数会使用 41 bytes,非常不经济。因此为了提高网络利用率,tcp 希望尽可能发送足够大的数据,这就是 Nagle 算法产生的缘由。
  • 该算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送。

以上是关于Netty进阶——粘包与半包(现象分析)的主要内容,如果未能解决你的问题,请参考以下文章

Netty进阶——粘包与半包(代码示例)

Netty进阶——粘包与半包(短链接方式解决粘包问题)

Netty进阶——粘包与半包(短链接方式解决粘包问题)

Netty进阶——粘包与半包(固定长度方式解决粘包问题)

Netty进阶——粘包与半包(固定长度方式解决粘包问题)

透过现象看本质,我找到了Netty粘包与半包的这几种解决方案。