Netty-LengthFieldBasedFrameDecoder-功能和参数说明

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异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值