zoukankan      html  css  js  c++  java
  • Netty解决粘包/半包问题

    粘包与半包

    在TCP协议中,数据流的传输是没有接线与分割的,数据块的划分根据缓冲区大小来决定,在数据包传输过程中,多个小数据包合并成一个大包进行传输,也可能一个数据包被划分成多个小包进行传输,这就是粘包与半包。可能性如下
    TCP粘包与半包

    产生原因:

    • 应用程序write写入的字节大小 大于 套接字发送缓冲区大小
    • 进行MSS大小的TCP分段
    • 以太网帧的payload大于MTU进行IP分片

    一般解决方案

    1. 定长消息,例如每个报文长度固定,不够补空格
    2. 使用回车换行符分割,在包尾加上分割符,例如Ftp协议
    3. 消息分割,头为长度(消息总长度或消息体长度),通常头用一个int32表示
    4. 复杂的应用层协议

    Netty解决方案

    通过添加数据解码器对数据进行拆分处理。

    特殊分隔符解码器

    LineBasedFrameDecoder

    ch.pipeline().addLast(new LineBasedFrameDecoder(1024));
    

    DelimiterBasedFrameDecoder

    ByteBuf delimiter = Unpooled.copiedBuffer("&".getBytes());
    ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,c delimiter));
    

    定长数据解码器

    FixedLengthFrameDecoder

    ch.pipeline().addLast(new FixedLengthFrameDecoder(1024));
    

    基于数据头部不定长数据解码器

    LengthFieldBasedFrameDecoder

    ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX, 0, 4););
    
  • 相关阅读:
    Unity Animation扩展方法总结
    Unity 离线建造系统
    Unity 任意区域截屏创建Sprite
    Unity ugui拖动控件(地图模式与物件模式)
    Unity 极简UI框架
    Unity 芯片拼图算法
    Unity Procedural Level Generator 基础总结与功能优化
    MANIFEST.MF是个什么?
    外包程序员怎么办?
    文件上传transferTo一行代码的bug
  • 原文地址:https://www.cnblogs.com/nickhan/p/13222492.html
Copyright © 2011-2022 走看看