1、LengthFieldBasedFrameDecoder作用
Netty提供的一个基于header+body模式的自定义长度解码器,可以解决TCP粘包拆包问题。
2、什么是TCP粘包、拆包
TCP连接建立之后,通信双方在交互过程中接收到的数据包可能包含多个请求(消息),或者接收完一次数据包之后还需要读取另外一次或多次。
一个数据包包含多个请求的情况就是TCP粘包,由多个数据包组成一个请求的情况则是拆包。
3、粘包、拆包产生的原因
- 粘包
a、发送方引起的,这通常是由TCP协议会在发送缓冲区满之后再发出去,这样使得多个不同的数据包一起发送给接收端
b、接收方引起的,当时接收方用户应用程序不能及时处理,接收到的数据包会堆积在系统缓存区,用户进程根据预先设定大小从系统接收缓冲区读取时,就有可能一次读取到多个数据包。 - 拆包
a、发送方引起的,如果发送方的消息很大的时候,可能是IP分片导致(MTU每次传输大小),一个数据包被拆分成多个数据包发送。
4、如何解决粘包
- 固定的分割符,接收方每次通过分割符来读取数据包,实现类DelimiterBasedFrameDecoder。
- 固定长度,接收方每次读取固定长度的数据包,实现类FixedLengthFrameDecoder。
- 自定义长度,数据包由包头和包体组成,接收方先读取包头中的长度,根据读取到的长度再去读取指定长度的包体,实现类LengthFieldBasedFrameDecoder。
5、LengthFieldBasedFrameDecoder构造参数含义
- byteOrder:字节顺序,读取header内长度时,所使用的顺序。
- maxFrameLength:整个数据包的最大长度,超过这个长度的消息会被丢弃
- lengthFieldOffset:header包内长度的起始偏移位
- lengthFieldLength:header包内长度占几个字节
- lengthAdjustment:header和body之间的字节数
- initialBytesToStrip:读取完整个数据包之后,需要丢弃的数据包从第一位开始的字节数。
- failFast:如果某个数据包不合法,是否马上抛出异常,默认true,如果改成false可能导致OOM异常。