Netty学习 | 豆包MarsCode AI刷题

68 阅读2分钟

Netty通信过程中编解码技术

粘包/拆包问题

如何获取一个完整的网络包? 了解TCP最基本的拆包/粘包问题以及常用的解决方案

为什么有拆包/粘包

在网络通信过程中,每次可以发送的数据包大小是受限制的 如MTU传输单元大小、MSS最大分段大小、滑动窗口等

如果一次传输的网络包数据大小超过传输单元大小,数据会拆为多个数据包发送 如果每次请求的网络包数据都很小,TCP采用的Nagle算法会对此作出优化。

MTU最大传输单元和MSS最大分段大小

MTU(Maxitum Transmission Unit)是链路层一次最大传输数据的大小,一般来大小为1500byte MSS(Maximum Segement Size)指TCP最大报文段长度,是传输层一次发送最大数据的大小

image.png

滑动窗口

也被称为通告窗口 是数据接收方设置的窗口大小 接收方会把窗口大小告诉发送方 以此限制发送方每次发送数据的大小

TCP报文如何确保数据包按次序到达且不丢数据

所有的数据帧都是有编号的,TCP会对多个报文段回复一个ACK 假设有三个报文段A、B、C,发送方先发送了B、C,接收方必须等待A报文段到达

如果一定时间内仍未等到A报文段,那么B、C也会被丢弃,发送方会发起重试 如果A已接受到A报文段,那么将会回复发送方一次ACK确认

Nagle算法

定义为TCP/IP拥塞控制方法 主要解决频繁发送小数据包而带来的网络拥塞问题

拆包/粘包解决方案

image.png 唯一方法:定义应用层的通信协议

消息长度固定 每个数据报文都需要一个固定的长度,当发送方的数据小于固定长度时,则需要空位补齐

如上五条数据,一共需要发送4个报文

特定分隔符 在每次发送报文的尾部加上特定分隔符,接收方就可以根据特殊分隔符进行消息拆分

消息长度+消息内容(最常用的方法)

Netty实现自定义通信协议

通信协议时通信双方商量好的借口暗语 在TCP网络编程中,发送方和接收方的数据包格式都是二进制,发送方将对象转化成二进制流发送给接收方,接收方获得二进制数据后需要知道如何解析成对象,所以协议时双方能够正常通信的基础

自定义协议优点: 极致性能 扩展性 安全性