一、粘包
1.1、粘包现象
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 限制后,会将数据切分发送,就会造成半包。
三、粘包与半包现象的本质原因
四、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 算法产生的缘由。
- 该算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送。