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

从“碎片化”到“完美重组”:IP报文的分片艺术

前言
        在网络通信中,当IP层需要传输的数据包大小超过数据链路层的MTU限制时,就必须进行分片处理。本文将完整解析IP分片的工作机制,包括分片字段的作用、如何减少分片,以及分片报文的组装原理。

IP报头解析请参考:子网划分核心原理 (网络原理1)-CSDN博客

        在上一期的IP报头解析文章中,我们遗留了几个关键字段未作详述,即16位标识符、3位标志位以及13位片偏移量。这些字段实际上与IP分片和组装机制紧密相关,本章将对此展开详尽讲解。

一、什么是分片技术?

        由于物理介质等因素的限制,数据链路层规定从上层接收下来的完整报文大小不超过MTU(最大的传送单元),标准通常是1500字节就像寄包裹时不能超过1kg,需要我们分成小块寄

        如果从IP层传下来的超过MTU就需要分片发送。到了对端IP层会再进行组装。

        分片并不是一件好事,分片会增加丢包率——任意一个分片丢失都会导致整个报文失效。举个例子,假设报文的丢包率为1%,而一个报文被分成10份。要保证每一个报文都收到,才算不丢包,那么丢包率就变为1-99%^10,最后丢包率变为10%左右。

        所以分片和组装不是主流,是被迫为之,不是“原罪”。既然分片有显著弊端,如何减少?关键在哪一层控制?

        为什么说IP分片是被迫为之,传输层并不关心报文大小,只管将数据传给网络层,最终必须交付给对端传输层。而数据链路层的标准是不能超过1500字节,那么网络层夹在中间就很为难,需要自己解决这个问题,所以有了分片技术,在IP层分片交付到对端IP层在进行组装。分片技术的分与组均由网络层独立完成,与其他层解耦。

        所以要减少分片,即IP层的工作。那么就要从数据链路层的下手。

        怎么控制传输层数据量减少分片?MTU为1500字节,去掉IP报头20字节,那么从传输层传输下来的报文就要控制在1480字节以下。去掉传输层报头20字节,那么从发送缓存区取的报文就要控制在1460字节(称为MSS 最大段尺寸)以下。

        而数据发送多少又跟滑动窗口有关。滑动窗口里面的数据是分段发送的,而不是大块数据一次性发送,就是在控制数据发送量减少分片。

关于滑动窗口讲解:TCP协议可靠性设计的核心机制与底层逻辑-CSDN博客

注意:不同链路层有自己的 MTU,网络层需要兼容。

二、IP报头分片字段作用:

  • 16位标识:相同报文分出来的分片包标识相同,不同报文及它们的分片包不同。该字段是用来把分片包分类的。
  • 3位标志:
    • 第1位:未来功能扩展是使用。
    • 第2位:是否禁止分片(1表示禁止分片,被禁止分片的报文超过MTU直接丢包),通常都是设位0。
    • 第3位:更多分片。表示是否有更多分片,1表是有更多分片,0表示最后一分片。
  • 13位片偏移:表示当前分片包在第一个分片包的相对偏移位置。

三、如何分片和组装?

接下来讲解分片是如何组装的,理解如何组装,如何分片自然就能理解。

首先需要甄别出是否是分片报文?

        看3位标志的第三位,如果是1,那么它100%是分片报文。如果是0我们还不能确定,需要继续看13位片偏移,如果不为0则就是分片报文(而且是最后一片)。对立的,如果3位标第3位为0,且13位片偏移为0则不是分片报文。

        确定它是分片报文后,通过16位标识把它分类(相同报文的放在一起)。

怎么判断分片报文是否已经收全了?(或是否有丢失?)

划分为三种情况检测,第一片,中间片,最后一片。

  • 如果有13位片偏移为0的分片报文,则第一片没有丢失。
  • 3位标志的第三位,如果是0的分片报文,则最后一片没有丢失。
  • 判断中间片是否丢失可以把所有分片报文按13位片偏移排序(升序),13位片偏移+自己的报文长度就是下一片的13位片偏移,如果找不到对应的片,那就是丢失了。

如何组装?

        按13位片偏移升序排序后直接拼接就好。

非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!74c0781738354c71be3d62e05688fecc.png

http://www.dtcms.com/a/307460.html

相关文章:

  • 从遮挡难题到精准测量:激光频率梳技术如何实现深孔 3D 轮廓的 2um 级重复精度?
  • 《Java 程序设计》第 15 章 - 事件处理与常用控件
  • 【Python修仙编程】(二) Python3灵源初探(9)
  • 无人机飞控系统3D (C++)实践
  • Coze Studio概览(四)--Prompt 管理功能详细分析
  • React的基本语法和原理
  • 力扣 Pandas 挑战(6)---数据合并
  • 融媒体中心网络安全应急预案(通用技术框架)
  • 【Debian】4-‌2 Gitea搭建
  • 专业鼠标点击器,自定义间隔次数
  • 前端核心技术Node.js(五)——Mongodb、Mongoose和接口
  • [mind-elixir]Mind-Elixir 的交互增强:单击、双击与鼠标 Hover 功能实现
  • 解决宇道项目关于接收日期格式yyyy-MM-dd HH:mm:ss后端自动转为1970-01-01 00:00:00的问题
  • 思途JSP学习 0731
  • 红黑树×协程×内存序:2025 C++后端核心三体问题攻防手册
  • LeetCode Hot 100:42. 接雨水
  • MCU中的RTC(Real-Time Clock,实时时钟)是什么?
  • 聊聊接口测试依赖第三方数据测试策略
  • mysql主从搭建(docker)
  • Verilog与SytemVerilog差别
  • 【爬虫实战】使用Python和JS逆向基于webpack的游戏平台
  • vue 中 props 直接解构的话会数据丢失响应式
  • 在 CentOS 7 安装中文字体
  • 法国声学智慧 ,音响品牌SK (SINGKING AUDIO) 重构专业音频边界
  • vue+ts 基础面试题 (二)
  • 正向运动学(Forward Kinematics,简称FK)和逆向运动学(Inverse Kinematics,简称IK)
  • Java项目:基于SSM框架实现的校园活动资讯网管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • 分类-鸢尾花分类
  • 佳维视工业显示器在除尘与过滤设备中的应用
  • 7800系列三端固定式线性稳压器的典型应用电路