当前位置: 首页 > news >正文

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

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

http://www.lryc.cn/news/157167.html

相关文章:

  • PowerToys安装
  • Unity——LitJSON的安装
  • YOLOv5:对yolov5n模型进一步剪枝压缩
  • 大数据(八):Pandas的基础应用详解(五)
  • 【算法】归并排序 详解
  • linux 进程隔离Namespace 学习
  • 【MySQL】事务 详解
  • 爬虫到底难在哪里?
  • linux常用命令行整理
  • python字符串相关
  • JavaScript学习笔记01
  • golang 通用的 grpc http 基础开发框架
  • FSK解调技术的FPGA实现
  • Matlab图像处理-高斯低通滤波器
  • 文件上传之图片马混淆绕过与条件竞争
  • 代码随想录二刷day16
  • 【开发】安防监控/视频存储/视频汇聚平台EasyCVR优化播放体验的小tips
  • 力扣(LeetCode)算法_C++—— 只出现一次的数字
  • Windows配置SonarQube代码审查工具详细步骤(附带IDEA SonarLint插件使用)
  • 【Unity3D】UI Toolkit元素
  • Task :app:compileDebugKotlin FAILED
  • Android——数据存储(一)(二十一)
  • 机器学习课后习题 ---数学基础回顾
  • CS420 课程笔记 P4 - 以16进制形态编辑游戏文件
  • 计算机毕设之Python的高校成绩分析(含文档+源码+部署)
  • 【Sentinel】核心API-Entry与Context
  • HashMap源码阅读解惑
  • 如何解决前端传递数据给后端时精度丢失问题
  • 使用Maven创建父子工程
  • Vue+elementUI 导出word打印