Netty篇:拆包与粘包

本文深入探讨了TCP协议中的粘包与拆包问题,解释了这一现象的原因,并提出了多种解决策略,包括消息定长、分隔符分割、消息头长度标识等方法。同时,介绍了Netty框架提供的四种解码器,用于高效处理TCP数据包的拆分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP粘包/拆包


问题描述

       TCP是个“流”协议,所谓流,就是没有界限的一串数据。一个业务上完整的包可能会被TCP拆分成过个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。


解决策略

(1)消息定长,每个报文大小固定,不够则空位补齐

(2)在包尾增加回车换行符进行分割

(3)将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度;

(4)更复杂的应用层协议


netty解决方案

Netty提供了4种解码器来解决,分别如下:


       1.固定长度的拆包器 FixedLengthFrameDecoder,每个应用层数据包的都拆分成都是固定长度的大小


       2.行拆包器 LineBasedFrameDecoder,每个应用层数据包,都以换行符作为分隔符,进行分割拆分

       3.分隔符拆包器 DelimiterBasedFrameDecoder,每个应用层数据包,都通过自定义的分隔符,进行分割拆分


       4.基于数据包长度的拆包器 LengthFieldBasedFrameDecoder,将应用层数据包的长度,作为接收端应用层数据包的拆分依据。按照应用层数据包的大小,拆包。这个拆包器,有一个要求,就是应用层协议中包含数据包的长度


参考:

《Netty权威指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值