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年云南省地理标志产品品牌价值榜发布:52个产品品牌价值过亿
中医传统拔火罐,不是人人都适合。你对拔火罐了解多少呢
被抑郁症“侵蚀”的生活,你了解多少?
最受欢迎的恋爱互动游戏推荐
古代瘟疫经常发生,医疗水平很低,古人如何应对瘟疫?
带状疱疹神经痛怎样治疗
北京首都机场防疫政策升级:过境免签延至10天,60个口岸适用
首次乘机攻略:北京首都机场全解析
锂离子动力电池的pack生产全流程深度解析
中科院近物所研究新“膜”法 提升锂电池安全性
手机位置设置攻略:开启服务、选择模式、管理权限、提高准确性与注意事项
各种手术流程中的创新技术和安全操作
王俊凯演技获赞,《蛟龙行动》大年初一燃爆影院
胡亚捷:用深情演绎父爱,以坚守诠释演员责任
《泪珠缘》原著深度解析:天虚我生的言情世界
原华李小萌演绎母女情深,《我的泪珠儿》背后趣闻揭秘!
婆媳大战如何影响娃的情商?
外用治疗带状疱疹的药物有哪些
当仁不让的故事
成都牛王庙:古今交融的魅力之地
成都牛王庙:一座城市的牛文化传奇
低盐饮食真的能降血压吗?真相揭秘!
减盐饮食:舒张压高的救星?
最新研究:等长运动降压效果优于有氧运动
比索洛尔成新宠?舒张压高治疗新趋势
宾馆空调按钮操作指南:如何调节室内温度与舒适度
斯坦福大学开发新型AI算法,首次成功模拟大脑视觉系统