TCP的粘包和拆包
创作时间:
作者:
@小白创作中心
TCP的粘包和拆包
引用
1
来源
1.
https://menma.top/unity/2156.html
为什么会产生粘包?
因为TCP是面向流,没有边界,而操作系统在发送TCP数据时,会通过缓冲区来进行优化,例如缓冲区为1024个字节大小。
如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。
如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包。
关于粘包和拆包可以参考下图的几种情况:
上图中演示了以下几种情况:
- 正常的理想情况,两个包恰好满足TCP缓冲区的大小或达到TCP等待时长,分别发送两个包;
- 粘包:两个包较小,间隔时间短,发生粘包,合并成一个包发送;
- 拆包:一个包过大,超过缓存区大小,拆分成两个或多个包发送;
- 拆包和粘包:Packet1过大,进行了拆包处理,而拆出去的一部分又与Packet2进行粘包处理。
UDP不会产生粘包
粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。
常见的解决方案
对于粘包和拆包问题,常见的解决方案有四种:
- 发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0或空等进行填充到指定长度;
- 发送端在每个包的末尾使用固定的分隔符,例如\r\n。如果发生拆包需等待多个包发送过来之后再找到其中的\r\n进行合并;例如,FTP协议;
- 将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息;
- 通过自定义协议进行粘包和拆包的处理。
Netty对粘包和拆包问题的处理
Netty 对解决粘包和拆包的方案做了抽象,提供了一些解码器(Decoder)来解决粘包和拆包的问题。如:
- LineBasedFrameDecoder:以行为单位进行数据包的解码;
- DelimiterBasedFrameDecoder:以特殊的符号作为分隔来进行数据包的解码;
- FixedLengthFrameDecoder:以固定长度进行数据包的解码;
- LenghtFieldBasedFrameDecode:适用于消息头包含消息长度的协议(最常用);
基于 Netty 进行网络读写的程序,可以直接使用这些 Decoder 来完成数据包的解码。对于高并发、大流量的系统来说,每个数据包都不应该传输多余的数据(所以补齐的方式不可取),LenghtFieldBasedFrameDecode 更适合这样的场景。
热门推荐
2024年电动车新政解读:改装禁令与上牌制度全面实施
电动车改装后不允许上路?很多人误解了,这6种改装是合法的
2024中央财经大学hnd咨询方式有什么 申请流程有哪些
赵云究竟是虚构的还是真实存在的?史籍中是如何记载的?
中国车企跟特斯拉学了个寂寞:大压铸其实没那么好?
掌握这6个喝水时间段,提升燃脂效率
Chrome浏览器如何更新到最新版本
心情低落韩语怎么写?
孩子早餐喝粥营养不够?不妨这样搭配
喝粥养胃适合所有人?专家解读:这些误区要注意
安全门的材料与外观设计
反恐安全措施:保障公众生命财产安全
贵港深度游自驾攻略:全景路线、必游景点及实用 tips 一网打尽
烹饪400-450度高温下的美食艺术与技巧
新能源车为啥还有12V小电瓶?
六亲缘薄是好事还是坏事?解析六亲缘薄的含义
糯米的花式做法,比粽子好吃,比烧麦馋人
个人独资企业注销流程是什么?
突破治疗瓶颈:贝莫苏拜单抗联合安罗替尼和化疗为晚期食管癌患者带来显著生存获益
女性遭遇家庭暴力时该如何应对?
宝宝起名:周易起名常用的字
过敏性休克,为什么不用肾上腺素?
新质生产力重塑时尚产业格局,广州白马采购节开幕
宝宝嘴里有溃疡怎么办
胸腔积液胸膜增厚是什么病
买卖合同最新版:全面解析合同条款与法律责任
4小时改善抑郁?这款抗抑郁药真这么神奇?深度解析来了!
三吨人民币到底值多少钱?
探秘《赛博朋克2077》主角背景设定 游戏中主角的身世
坚定意志:如何培养决心的科学方法