说说 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. 更复杂的应用层协议。

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

相关推荐
wasp5209 小时前
做了技术管理后,我发现技术和管理其实可以兼得
java·运维·网络
赖small强9 小时前
【Linux 网络基础】HTTPS 技术文档
linux·网络·https·tls
雲烟10 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
Yue丶越10 小时前
【C语言】数据在内存中的存储
c语言·开发语言·网络
Altair123111 小时前
nginx的https的搭建
运维·网络·nginx·云计算
李宥小哥11 小时前
Redis10-原理-网络模型
开发语言·网络·php
Umi·11 小时前
iptables的源地址伪装
运维·服务器·网络
在路上看风景11 小时前
6.4 LANS
网络
阿巴~阿巴~13 小时前
自定义协议设计与实践:从协议必要性到JSON流式处理
服务器·网络·网络协议·json·操作系统·自定义协议
独行soc18 小时前
2025年渗透测试面试题总结-264(题目+回答)
网络·python·安全·web安全·网络安全·渗透测试·安全狮