基于Netty的RPC架构笔记8之自定义数据包协议

         由于数据在网络传输过程中,因为客户端和服务端没有约定好一个数据结构,就有可能粘包现象或分包现象,这样就需要定义数据包协议

比如我要传递一句话:I want to learn English    and you?

粘包现象就是 I want  tolearn  English   and you?

分包现象就是I want                              to learn English    and you?

       粘包和分包出现的原因是:没有一个稳定数据结构,

     一般解决办法就是采取分隔符 如 I want to learn English|and you?|

    另一种方法就是长度 + 数据23I want to learn English13give me a tea

   然后一般基于netty开发程序都会定义数据包格式,格式如下

 /**
 * 
 * <pre>
 * 数据包格式
 * +——----——+——-----——+——----——+——----——+——-----——+
 * | 包头 | 模块号  | 命令号 |  长度  |   数据  |
 * +——----——+——-----——+——----——+——----——+——-----——+
 * </pre>
 * 包头4字节
 * 模块号2字节short
 * 命令号2字节short
 * 长度4字节(描述数据部分字节长度)
 * 
 *
 */

 Netty中的 FrameDecoder 这个decoder可以协助我们解决粘包分包问题

1问:消息如何在管道中流转?当前的一个handler如何往下面的一个handler传递一个对象?

答:一个管道中会有多个handler,handler往下传递对象的方法是sendUpstream(event)

2为什么FrameDecoder return的对象就是往下传递的对象

答:还是调用了sendUpstream

3 buffer里面数据未被读取完怎么办? 为什么return null就可以缓存buffer?

答:cumulation缓存 FrameDecoder里面的cumulation其实就是一个缓存的buffer对象

4由于数据包格式包头+长度+数据,假如有的用户每次传输长度都是Intger.max,这种数据包,通常被称为socket攻击,字节流式攻击

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值