IP分片与组装

IP 分片是 TCP/IP 协议栈中网络层(IP 层)的核心机制,目的是解决 “IP 报文长度超过数据链路层 MTU 限制” 的传输问题 —— 确保大型 IP 数据报能通过不同 MTU 的网络链路(如以太网、PPP 链路)成功送达目标主机。以下从核心背景、关键字段、分片过程、组装过程、注意事项、实例演示六个维度详细讲解:

为什么需要 IP 分片

1. MTU 的定义

MTU(最大传输单元)是数据链路层(如以太网、WiFi)对 “封装后的 IP 数据包” 的最大数据长度限制(单位:字节),代表该链路单次能传输的最大 IP 数据报尺寸(不含数据链路层头部)。

  • 常见 MTU 值:以太网默认 1500 字节(最常用)、PPP 链路默认 1500 字节、部分窄带链路(如卫星网)可能低至 576 字节。

2. 分片的触发条件

当 IP 层收到上层协议(如 TCP、UDP)传递的 IP 数据报时,会先检查其总长度

  • 若总长度 ≤ 出接口 MTU:直接转发,无需分片;
  • 若总长度 > 出接口 MTU:且 IP 头部 “禁止分片(DF)” 标志未置 1,则触发分片;
  • 若总长度 > 出接口 MTU:且 DF 标志置 1(禁止分片),IP 层会丢弃该报文,并向源主机发送 “ICMP 不可达(需要分片但被禁止)” 报文。

IP 头部中与分片相关的核心字段

IP 分片和组装的逻辑完全依赖 IP 头部的 3 个关键字段(文档中已提及,此处细化解释),需先明确其作用:

字段名称位数核心作用
16 位标识(ID)16唯一标识源主机发送的一个原始 IP 数据报。同一原始报文的所有分片,ID 字段值完全相同,用于接收方分组。
3 位标志(Flags)3- 第 0 位:保留(未使用);- 第 1 位(DF):禁止分片(1 = 禁止,0 = 允许);- 第 2 位(MF):更多分片(1 = 后续还有分片,0 = 当前是最后一个分片)。
13 位片偏移(Fragment Offset)13指示当前分片在 “原始 IP 数据报的数据部分” 中的偏移位置,单位是 8 字节(即实际偏移字节数 = 片偏移值 × 8)。用于接收方排序分片。

关键约束

由于片偏移以 8 字节为单位,因此:

  • 除最后一个分片外,所有分片的数据部分长度必须是 8 的整数倍(确保分片拼接后数据连续);
  • 片偏移的最大值为 2¹³ - 1 = 8191,对应实际偏移字节数 = 8191 × 8 = 65528 字节,与 IP 头部 “总长度” 字段(16 位,最大 65535 字节)匹配(65528 + 7 字节 = 65535,最后一个分片可不足 8 字节)。

IP 分片的具体过程(发送方侧)

1. 计算分片阈值

首先确定 “单个分片的数据部分最大长度”:分片阈值 = 出接口 MTU - IP 头部固定长度(默认 20 字节,无选项字段时)→ 例:以太网 MTU=1500 字节,则分片阈值 = 1500 - 20 = 1480 字节(每个分片的数据部分最多 1480 字节)。

2. 分割原始数据报

将原始 IP 数据报拆分为多个片段,遵循规则:

  • 原始 IP 头部的 “版本、源 IP、目的 IP、协议” 等核心字段保留不变;
  • 每个分片的数据部分长度 ≤ 分片阈值,且除最后一个分片外,其余分片数据长度必须是 8 的整数倍;
  • 原始数据报的 “数据部分” 被连续分割,无重叠、无遗漏。

3. 为每个分片构建新 IP 头部

每个分片都会生成独立的 IP 头部(并非复用原始头部),关键调整如下:

  • 标识(ID):与原始数据报的 ID 保持一致(确保接收方识别为同一组分片);
  • 标志(Flags):
    • 除最后一个分片外,其余分片的 MF 位 = 1(表示 “还有更多分片”);
    • 最后一个分片的 MF 位 = 0(表示 “分片结束”);
    • DF 位 = 0(分片后自动置为允许分片);
  • 片偏移:按 “当前分片数据在原始数据中的起始位置 ÷ 8” 计算(单位:8 字节);
  • 总长度:当前分片的 IP 头部长度 + 数据部分长度(每个分片的总长度 ≤ MTU);
  • 首部检验和:重新计算(因头部字段已修改)。

4. 独立发送分片

每个分片都是 “独立的 IP 数据包”,会:

  • 各自封装到数据链路层帧中(如以太网帧);
  • 独立选择路由(可能经过不同路径到达目标主机);

只要有一个丢包了,tcp就需要对整个数据包重传,然后再走一遍上面的流程,所以看出分片增大了丢包概率,一个包丢包率1%,把他拆成三个包丢包率就是3%了。


IP 分片的组装过程(接收方侧)

接收方的 IP 层会按以下 3 步完成组装(仅在目标主机执行,中间路由器不组装分片):

1. 分片分组(按 ID 聚合)

接收方收到 IP 数据包后,根据 “标识(ID)+ 源 IP + 目的 IP + 协议” 四元组,将属于同一原始数据报的所有分片归为一组 —— 核心依据是 “ID 相同”(同一原始报文的分片 ID 一致)。

2. 分片排序(按片偏移排序)

对同一组内的分片,按 “片偏移” 字段升序排列:→ 片偏移 = 0 的分片是第一个分片(原始数据的起始部分);→ 片偏移最大且 MF=0 的分片是最后一个分片(原始数据的末尾部分)。

3. 完整性检查与拼接

  • 完整性判断:当收到 “MF=0” 的最后一个分片后,计算 “所有分片的数据长度之和” 是否等于 “原始数据总长度”(通过最后一个分片的片偏移 + 数据长度推导),确认无分片丢失;
  • 数据拼接:将排序后的分片数据部分连续拼接,还原原始数据报的 “数据部分”;
  • 恢复原始 IP 头部:用原始数据报的核心字段(版本、源 IP、目的 IP 等)构建完整 IP 头部,丢弃各分片的独立头部信息;
  • 传递给上层:将组装后的完整 IP 数据报传递给上层协议(如 TCP、UDP)——IP 分片对传输层完全透明,TCP/UDP 无需感知分片过程,仅接收完整数据。

IP 分片的关键注意事项

  1. 传输层透明性:TCP、UDP 等传输层协议看不到分片过程,仅接收组装后的完整数据;若某一分片丢失,IP 层不重传,需依赖 TCP 的重传机制(UDP 无重传,会导致数据丢失)。
  2. 中间路由器不组装:分片仅在发送方拆分、目标主机组装,中间路由器仅转发分片(可能因链路 MTU 更小而再次分片,但需遵循分片规则)。
  3. 分片丢失的影响:只要有一个分片丢失,整个原始数据报就无法组装,需等待上层协议重传(TCP 会重传完整原始报文,UDP 则直接丢失数据)。
  4. 禁止分片的场景:若 IP 头部 DF 位 = 1(禁止分片),则报文超过 MTU 时会被丢弃,常见于 “路径 MTU 发现(PMTUD)” 机制(TCP 通过 DF 位探测路径上的最小 MTU,避免分片)。

实例演示:3000 字节 IP 报文的分片过程

假设场景:原始 IP 数据报总长度 = 3000 字节(其中 IP 头部 20 字节,数据部分 2980 字节),发送方出接口 MTU=1500 字节(以太网默认),无 IP 选项字段。

1. 计算分片阈值

分片阈值 = MTU - IP 头部长度 = 1500 - 20 = 1480 字节(每个分片的数据部分最大 1480 字节,且 1480 是 8 的整数倍:1480 ÷ 8 = 185)。

2. 分片数量与参数计算

原始数据部分 = 2980 字节,需拆分为 3 个分片(前 2 个分片数据长度 = 1480 字节,最后 1 个 = 2980 - 1480×2=20 字节),各分片参数如下:

分片序号数据部分长度片偏移(值)片偏移(实际字节)MF 位分片总长度(头部 + 数据)
11480 字节00×8=0120 + 1480 = 1500 字节
21480 字节185185×8=1480120 + 1480 = 1500 字节
320 字节370370×8=2960020 + 20 = 40 字节

3. 组装逻辑(接收方侧)

  • 按 ID 分组:3 个分片的 ID 相同,归为一组;
  • 按片偏移排序:分片 1(0)→ 分片 2(185)→ 分片 3(370);
  • 完整性检查:分片 3 的 MF=0(最后一个分片),且数据总长度 = 1480+1480+20=2980 字节(与原始数据长度一致);
  • 拼接数据:0~1479 字节(分片 1)→ 1480~2959 字节(分片 2)→ 2960~2979 字节(分片 3),还原原始数据,再加上原始 IP 头部,传递给上层协议。

常见问题解答

1. 接收方如何得知报文被分片?

两种判断依据:

  • 分片的 MF 位 = 1(表示还有后续分片);
  • 片偏移值>0(表示当前分片不是原始报文的起始部分)。只要满足其一,即可判定为分片。

2. 接收方如何得知分片收全了?

当收到 “MF=0” 的最后一个分片后,通过以下公式验证:所有分片的数据长度之和 = 最后一个分片的片偏移 ×8 + 最后一个分片的数据长度→ 例:1480+1480+20 = 370×8 + 20 = 2960 + 20 = 2980 字节(与原始数据长度一致),则判定收全。

3. 接收方如何组合形成完整报文?

  • 按 “ID + 源 IP + 目的 IP + 协议” 分组;
  • 按片偏移升序排序;
  • 连续拼接所有分片的数据部分;
  • 用原始报文的核心字段(版本、源 IP、目的 IP 等)构建完整 IP 头部,最终形成原始 IP 数据报。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1167892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery 版本文件及相关信息汇总

一、核心结论​ 截至2025年1月,jQuery 的最新稳定版本为 3.7.1(2023年7月发布),4.0 版本仍处于测试阶段(2025年8月发布 Release Candidate 1,未正式推出)。当前主流使用的版本为 3.x 系列&…

python基于django框架的健康档案网站的设计与实现

目录健康档案网站的设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!健康档案网站的设计与实现摘要 基于Django框架的健康档案网站旨在为用户提供便捷的个人健康数据管…

ARP欺骗的原理与防御措施

ARP 欺骗(也叫 ARP 毒化)的核心是利用ARP 协议无身份验证的漏洞(主机收到 ARP 应答时,会直接更新自身 ARP 缓存表,不管是否发送过对应请求),让攻击者(图中 “主机 M”)伪…

python基于django框架的大学生平时成绩管理系统 四个角色45s2bez3

目录系统概述角色功能设计技术实现应用价值关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 Python基于Django框架的大学生平时成绩管理系统是一个多角色协作的在线平台&am…

springboot基于微信小程序的粤语文化传播平台的设计与开发

背景分析随着全球化与数字化发展,地域文化面临同质化冲击,粤语作为岭南文化的重要载体,其传承与传播需求日益凸显。微信小程序凭借低门槛、高普及率(覆盖超10亿用户)及社交属性,成为文化传播的高效工具。Sp…

百考通AI开题报告功能:让开题写作从“压力源”变为“加速器”

对无数学生而言,开题报告曾是毕业路上的“拦路虎”——选题反复修改、结构混乱不清、方法描述空洞、文献堆砌无逻辑……不仅耗费大量时间精力,还常常因不符合导师或学院要求而被打回重写。如今,百考通AI平台推出的“开题报告”写作功能&#…

JavaScript 中实现 a.js调用 b.js函数教程

以下是 JavaScript 中实现 a.js调用 b.js函数的 5 种主流方法,涵盖不同场景和最佳实践:一、全局函数暴露(基础方案)1. 实现步骤b.js(定义全局函数):// 定义全局可访问的函数 window.sharedFunct…

springboot基于微信小程序的云浮市特色农产品交易的设计与实现

背景分析随着移动互联网和电子商务的快速发展,微信小程序凭借其轻量化、即用即走的特点,成为农产品线上交易的重要载体。云浮市作为广东省农业重要产区,拥有丰富的特色农产品资源(如无核黄皮、南药、肉桂等)&#xff0…

JavaScript 中定义全局变量的教程

以下是 JavaScript 中定义全局变量的 5 种核心方法及最佳实践,结合不同场景和注意事项:一、基础定义方式1. 隐式全局声明(不推荐)// 直接赋值(未使用声明关键字) myGlobal "value";特点&#xf…

python基于django框架的新能源汽车之家系统设计与实现

目录新能源汽车之家系统设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!新能源汽车之家系统设计与实现摘要 该系统基于Django框架开发,旨在为用户提供新能…

springboot基于小程序的智能雨伞借取管理系统设计实现

背景分析近年来,共享经济模式快速发展,共享雨伞作为细分领域,解决了突发降雨场景下的用户需求。传统雨伞借取方式存在人工管理效率低、租赁点分散、用户操作繁琐等问题。SpringBoot框架结合微信小程序的技术方案,能够构建高效、智…

【实践】利用 Prettier 格式化打包后的代码?修 BUG 的隐藏神器!

在日常开发中,我们习惯用 Prettier 统一源码风格。但你是否想过——它还能用来“抢救”打包后的压缩代码?当线上出问题、控制台报错指向一行上万字符的 app.xxx.js 时,Prettier 可能就是你快速定位 Bug 的“救命稻草”! 本文将手…

springboot基于微信小程序的考研资源共享平台的设计与实现

背景分析随着考研竞争日益激烈,考生对高质量学习资源的需求急剧增长。传统资源获取方式存在信息分散、更新滞后、付费门槛高等痛点。微信小程序凭借10亿级用户基础与即用即走的特性,成为资源聚合的理想载体。SpringBoot框架的快速开发能力与微服务架构优…

python基于django水上乐园售票管理系统

目录基于Django的水上乐园售票管理系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Django的水上乐园售票管理系统摘要 该系统采用Django框架开发,旨在实现水…

本科生开题报告PPT规范

摘要: 本贴描述本科生开题报告 PPT 的若干规范. 1. 基本风格 采用浅色背景模板图片为主, 文字为辅字号不能小于 20 号每页不能有大段的话, 只能分成若干点,每点不超过 2 行具体 (可以用例子), 不能泛泛而谈 (计算机发展, AI 发展之类废话) 2. 对题目的详细解释 开题…

python基于django人口户籍管理系统设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着城市化进程的加快和人口流动性的增强,传统的人工户籍管理方式已难以满足现代社会的需求。为提高户籍管…

springboot基于微信小程序的丽江市旅游分享平台

背景分析丽江市作为中国著名的旅游目的地,拥有丰富的自然景观和文化遗产,吸引了大量国内外游客。传统的旅游信息获取方式存在信息分散、更新不及时等问题,游客难以全面了解实时旅游动态和个性化推荐内容。微信小程序因其无需下载安装、使用便…

python基于django付费自习室系统的设计与实现

目录基于Django的付费自习室系统的设计与实现关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Django的付费自习室系统的设计与实现 随着教育需求的增长和学习效率要求的提升&am…

python基于django助农商城设计与实现

目录摘要关键词关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着互联网技术的快速发展,电子商务在农业领域的应用日益广泛。基于Django框架的助农商城系统旨在为…

python基于django助学贷款平台

目录基于Django的助学贷款平台摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Django的助学贷款平台摘要 助学贷款平台基于Django框架开发,旨在为学生提供便捷的…