Netty 06 | 粘包 分包

简介

网络传输都是转换为 2 进制进行传输

  • 粘包
    client 发送 2个 请求:hello hello
    server 接收到 2个 请求:
    hellohe
    llo
    或者 多个请求收到合并为一个请求
  • 分包
    client 发送1个请求: hello
    server 接收到:
    2个请求
    he
    llo

解决

通过标识标志位

定义一个稳定的结构 length + hello

  • client
    发送: length + data
  • server
    接收:根据 length 判断数据的完整性
    利用 FrameDecoder 来缓存数据 buffer。
    MyDecoder extends FrameDecoder
    if (完整){
    读取
    } else {
    等待数据完整。
    }

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

  • 最终还是调用了sendUpstream 。
    FrameDecoder extends SimpleChannelUpstreamHandler implements LifeCycleAwareChannelHandler

为什么return null就可以缓存buffer

缓存在 Chinnelbuffer cumulation 中

buffer里面数据未被读取完怎么办?

FrameDecoder 中 cumulation 缓存读完,跳出。

容错,如果 Client 发送到一半宕机了

设置超时。
心跳机制,查看此channel 是否存在,
消息中是否还有未处理信息。

防止 Socket 攻击

  • 原因:
    数据结构:包头+长度+数据
    Intger.max
    把长度定义的很大,这种数据包,通常被称为socket攻击,字节流式攻击。
  • 解决办法:
    1. 定义最大的 byte 大小。
      清除现在可读大bytes .buffer.skipBytes(buffer.readableBytes());
      还是没有办法判断何时 channel 数据是开始。
    2. 定义包头
      找到起始点。
      while (true){ //
      if 包头 break;
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值