说说 TCP的粘包、拆包

分析&回答

拆包和粘包是在socket编程中经常出现的情况,

  • 在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包 成一个tcp报文发送出去,这就是所谓的粘包
  • 如果通讯的一端发送的数据包超过一次tcp报文所能传输的最大值时,就会将一个数据包拆成多个 最大tcp长度的tcp报文分开传输,这就叫做拆包

MTU

泛指通讯协议中的最大传输单元。一般用来说明TCP/IP四层协议中数据链路层的最大传输单元,不同类型的网络MTU也会不同,我们普遍使用的以太网的MTU是1500,即最大只能传输1500字节的数据帧。可以通过ifconfig命令查看电脑各个网卡的MTU。

MSS

指TCP建立连接后双方约定的可传输的最大TCP报文长度,是TCP用来限制应用层可发送的最大字节数。如果底层的MTU是1500byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte。

TCP粘包/拆包发生的原因

问题产生的原因有三个,分别如下。

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

粘包问题的解决策略

由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,可以归纳如下。

  1. 消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
  2. 在包尾增加回车换行符进行分割,例如FTP协议;
  3. 将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度;
  4. 更复杂的应用层协议。

喵呜面试助手:一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

相关推荐
听到微笑2 分钟前
MCP传输协议演进:从SSE到Streamable HTTP
网络·网络协议·http
徒 花4 分钟前
HCIP学习05 链路聚合(Eth-Trunk)+ VRRP
服务器·网络·学习·hcip
kyle~9 分钟前
工程数学---机器人变化矩阵求解
网络·矩阵·机器人
爱学习的小囧9 分钟前
VCF 9 实验室网络部署全攻略:从硬件连接到配置实操
开发语言·网络·php
xiaoyaohou1111 分钟前
015、Neck结构改进(三):路径聚合网络(PANet)的增强策略
网络·yolo
大地的一角25 分钟前
(计算机网络)数据链路层
网络·计算机网络
工控空释28 分钟前
西门子通讯
网络
哇蛙蛙38 分钟前
H3CNE--23.ACL
服务器·网络·经验分享·网络协议·tcp/ip·h3cne
xiaoyaohou1139 分钟前
011、骨干网络改进(二):MobileNet、ShuffleNet等轻量骨干的适配
网络·深度学习·机器学习
IT枫斗者1 小时前
MSE Nacos Prompt 管理:AI Agent 配置的工程化治理实践
网络·人工智能·websocket·网络协议·prompt·jar