Netty通信过程中编解码技术
- 粘包/拆包问题
- 为什么有拆包/粘包
- MTU最大传输单元和MSS最大分段大小
- 滑动窗口
- TCP报文如何确保数据包按次序到达且不丢数据
- Nagle算法
- 拆包/粘包解决方案
- Netty实现自定义通信协议
- 通信协议设计
- Netty如何实现自定义通信协议
粘包/拆包问题
如何获取一个完整的网络包?
了解TCP最基本的拆包/粘包问题以及常用的解决方案
为什么有拆包/粘包
在网络通信过程中,每次可以发送的数据包大小是受限制的
如MTU传输单元大小、MSS最大分段大小、滑动窗口等
- 如果一次传输的网络包数据大小超过传输单元大小,数据会拆为多个数据包发送
- 如果每次请求的网络包数据都很小,TCP采用的Nagle算法会对此作出优化。
MTU最大传输单元和MSS最大分段大小
MTU(Maxitum Transmission Unit)是链路层一次最大传输数据的大小,一般来大小为1500byte
MSS(Maximum Segement Size)指TCP最大报文段长度,是传输层一次发送最大数据的大小
滑动窗口
也被称为通告窗口
是数据接收方设置的窗口大小
接收方会把窗口大小告诉发送方
以此限制发送方每次发送数据的大小
TCP报文如何确保数据包按次序到达且不丢数据
所有的数据帧都是有编号的,TCP会对多个报文段回复一个ACK
假设有三个报文段A、B、C,发送方先发送了B、C,接收方必须等待A报文段到达
Nagle算法
定义为TCP/IP拥塞控制方法
主要解决频繁发送小数据包而带来的网络拥塞问题
拆包/粘包解决方案
唯一方法:定义应用层的通信协议
消息长度固定
每个数据报文都需要一个固定的长度,当发送方的数据小于固定长度时,则需要空位补齐
如上五条数据,一共需要发送4个报文
特定分隔符
在每次发送报文的尾部加上特定分隔符,接收方就可以根据特殊分隔符进行消息拆分
消息长度+消息内容(最常用的方法)
Netty实现自定义通信协议
通信协议时通信双方商量好的借口暗语
在TCP网络编程中,发送方和接收方的数据包格式都是二进制,发送方将对象转化成二进制流发送给接收方,接收方获得二进制数据后需要知道如何解析成对象,所以协议时双方能够正常通信的基础
自定义协议优点:
通信协议设计
较为通用的协议示例:
Netty如何实现自定义通信协议