第一章Netty,bytebuffer黏包半包(核心点理解)
基于前文对 ByteBuffer 核心机制(position/limit)、状态控制(flip/compact)及网络协议处理(Scattering/Gathering)的讨论,粘包和半包是 TCP 流式协议在应用层必须解决的核心问题。ByteBuffer 通过其指针管理和内存操作特性,提供了高效的解决方案。一、现象定义与成因粘包 (Sticky Packet):现象:发送方连续发送两个小包(如 “A” 和 “B”),接收方一次性读到了 “AB”。成因:TCP 为了优化性能,使用 Nagle 算法将多个小数据包合并发送;或接收方应用层读取不及时,内核缓冲区累积了多个包。半包 (Half Packet):现象:发送方发送一个大包(如 “HelloWorld”),接收方第一次只读到了 “Hel”,剩下的 “loWorld” 在下次读取中获得。成因:接收方缓冲区大小不足、MTU(最大传输单元)限制导致 IP 分片、或网络拥塞。二、ByteBuffer 解决策略核心思路:在应用层建立消息边界。常用方法有“固定长度”、“分隔符”和“长度字段”。其中长度字段法最通用且高效。1. 核心逻辑:累积与解析利用 ByteBuffer 的 compact() 方法保留未处理完的数据,并结合 mark/reset 或绝对读写预读长度。状态流转图:接收数据 - 存入 Buffer - 检查是否有完整 Header - 检查 Body 是否齐全 - 提取业务数据 - Compact 剩余数据2. 代码实现示例(长度字段法)importjava.nio.ByteBuffer;publicclassTcpUnpackingDemo{privateByteBufferbuffer=ByteBuffer.allocate(1024);publicvoidprocessInput(ByteBufferincomingData){// 1. 将新数据追加到累积缓冲区// 注意:实际场