粘包分包分析

消息如何在管道中流通?

  • 一个管道中存在多个Handler(事件处理器),消息在通道中通过Handler以事件的形式进行传递。
  • handler往下传递对象的方法是:sendUpstream(event)

粘包现象:两个数据包连在一起,导致无法区分。
分包现象:一个数据包中的数据被间隔。
粘包和分包出现的原因是:没有一个稳定数据结构。

FraneDecoder

  • Netty借助继承frameDecoder协助解决粘包、分包问题
  • frameDecoder内部调用了sendUpstream(event)方法,将多次经过Handler的数据融汇成指定的稳定数据结构。
  • 如果数据不完整,内部使用cumulation缓存(一个缓存的buffer对象),解决粘包、分包问题。

此时需要避免2个问题:
1.客户端故障使得请求不完整,造成数据的紊乱
2.被socket攻击,把请求长度设置很大,进行字节流式攻击
因此,要控制好cumulation的大小,同时使用包头标识,进行分包操作。

Netty粘包分包分析_数据