IP 分片和组装的具体过程

在这里插入图片描述

• 16 位标识(id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的.

• 3 位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类似于一个结束标记.

• 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 除以 8 得到的. 因此, 除了最后一个报文之外(之前如果都是 8 的整数倍,最后一片的偏移量也一定是 8 的整数倍), 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).

• 注意:片偏移(13 位)表示本片数据在它所属的原始数据报数据区中的偏移量(以 8 字节为单位)

分片与组装的过程

分片

  1. 检查 MTU 限制

○ 当一个 IP 数据报的大小超过了网络的 MTU(最大传输单元)限制时,就需要进行分片。MTU 是数据链路层对 IP 层数据包进行封装时所能接受的最大数据长度。

  1. 分割数据报

○ IP 层将原始的 IP 数据报分割成多个较小的片段。

○ 对于每个片段,IP 层会设置相应的标识(Identification)、偏移量(Fragment Offset)和标志位(Flags)等字段。

○ 标识字段用于标识属于同一个数据报的不同分片,确保所有分片能够被正确地重新组装。

○ 偏移量字段指示了当前分片相对于原始数据报的起始位置,以 8 字节为单位。

○ 标志位字段包含了 3 个位,其中 MF(More Fragment)位用于指示是否还有更多的分片,DF(Do Not Fragment)位用于指示数据报是否允许进行分片。

  1. 添加 IP 头部

○ 每个分片都会加上自己的 IP 头部,与完整 IP 报文拥有类似的 IP 头结构,但MF 和 Fragment Offset 等字段的值会有所不同。

  1. 发送分片

○ 分片在传输过程中独立传输,每个分片都有自己的 IP 头部,并且各自独立地选择路由。

组装

  1. 接收分片

○ 当目的主机的 IP 层接收到这些分片后,会根据标识字段将属于同一个数据报的所有分片挑选出来。

  1. 排序与组装

○ 利用片偏移字段,IP 层会对属于同一个数据报的分片进行排序。

○ 当所有的分片都到达并正确排序后,IP 层会将这些分片重新组装成一个完整的 IP 数据报。

  1. 传递给上层协议

○ 组装好的 IP 数据报会传递给上层的协议进行处理。

注意:

• IP 分片对传输层是透明的,这意味着传输层无需关心数据是否被分片以及如何重新组装。

• 接收方如何得知自己收到的报文分片了?

• 接收方如何得知自己收到的分片收全了?

• 接收方如何组合形成完整的报文?

IP分片是网络层(IP层)的功能,对传输层(如TCP/UDP)透明,即传输层不直接参与分片和重组过程。以下是接收方处理IP分片的核心机制:

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

通过IP头部中的以下字段判断:

  • 分片控制字段
    • MF(More Fragments)标志位
      • MF=1:表示当前分片不是最后一个,后续还有分片。
      • MF=0:表示当前分片是最后一个。
    • Fragment Offset(分片偏移)
      • 表示当前分片在原始IP数据报中的偏移量(以8字节为单位)。
      • Fragment Offset ≠ 0MF=1,则说明该报文是分片。

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

通过以下条件综合判断:

  1. 所有分片的Identification字段相同
    IP头部中的Identification(标识符)唯一标识同一个原始数据报的所有分片。
  2. 分片覆盖完整的数据范围
    • 最后一个分片的MF=0
    • 分片的Fragment Offset和长度连续覆盖原始数据报(如:前一分片的Offset + Length = 下一分片的Offset)。
  3. 重组超时机制
    若在规定时间内未收到全部分片,丢弃已收到的分片(超时时间由系统实现决定,通常为30秒或60秒)。

3. 接收方如何重组分片?

重组流程如下:

  1. 缓存分片
    接收方根据Identification字段将属于同一数据报的分片暂存到重组缓冲区。
  2. 排序与去重
    根据Fragment Offset对分片排序,并丢弃重复分片(如因网络重传导致)。
  3. 完整性检查
    • 检查是否覆盖从Offset=0到最后一个分片的完整数据。
    • 确保所有分片的MFOffset逻辑连贯。
  4. 重组数据报
    按顺序拼接分片数据,去除IP头部(仅保留第一个分片的IP头部),生成完整的原始IP数据报。
  5. 提交上层协议
    将重组后的数据报交给传输层(如TCP/UDP)处理。

关键IP头部字段

字段作用
Identification唯一标识同一数据报的所有分片(通常由发送方生成)。
MF (More Fragments)标记是否为最后一个分片。
Fragment Offset当前分片在原始数据报中的位置(以8字节为单位)。
Total Length当前分片的总长度(IP头部+数据)。

示例:分片重组过程

假设原始IP数据报长度为4000字节(MTU=1500字节),分片如下:

  1. 分片1
    • Offset=0, MF=1, Length=1500(含IP头)。
    • 数据:字节0~1479(IP头占20字节)。
  2. 分片2
    • Offset=185(185×8=1480), MF=1, Length=1500
    • 数据:字节1480~2959。
  3. 分片3
    • Offset=370(370×8=2960), MF=0, Length=1040
    • 数据:字节2960~3999。

接收方按Offset排序后拼接数据,检测到MF=0时确认分片完整,重组为原始数据报。

为什么传输层无需关心分片?

  • 职责分离:IP层负责分片与重组,传输层只需处理完整的数据报。
  • 透明性:传输层的协议头部(如TCP/UDP头部)仅在第一个分片中出现,后续分片仅包含数据部分。

注意事项

  • 分片开销:分片会增加延迟和丢包风险(任一分片丢失会导致整个数据报丢弃)。
  • 避免分片
    • 传输层可通过Path MTU Discovery(路径MTU发现)调整报文大小。
    • 应用层可主动限制数据包大小(如UDP建议≤1472字节,预留IP+ICMP头空间)。

IP分片机制通过网络层透明化处理,确保了传输层无需感知底层分片细节,但需注意分片对性能和可靠性的潜在影响。

分片与组装过程的示意图

分片组装场景
在这里插入图片描述

在这里插入图片描述

分片组装过程

• 假设在 IP 层,有一个大小为 3000 字节的报文,如何分片?如何组装呢?

假设一个 3000字节的IP数据报(包括20字节IP头部,实际数据部分为2980字节)需要通过一个 MTU(最大传输单元)为1500字节 的网络链路传输。由于MTU限制了单个IP包的大小,因此需要进行分片。以下是分片和组装的详细过程:

1. 分片过程

IP分片的规则:

  • 每个分片必须包含IP头部(20字节),因此每个分片的最大数据部分 = MTU - IP头 = 1500 - 20 = 1480字节
  • 分片偏移量(Fragment Offset)以8字节为单位,因此每个分片的数据长度必须是8的倍数(不够则填充)。
  • MF(More Fragments)标志位
    • MF=1:表示还有后续分片。
    • MF=0:表示这是最后一个分片。

原始数据报

  • 总长度(Total Length) = 3000字节(IP头20 + 数据2980)。
  • 需要分片,因为 3000 > MTU (1500)

分片计算

由于每个分片最多承载1480字节数据,且偏移量按8字节单位计算:

  1. 第1个分片

    • 数据长度 = 1480字节(满足 1480 % 8 == 0)。
    • 偏移量(Fragment Offset) = 0 / 8 = 0
    • MF标志 = 1(还有后续分片)。
    • 分片总长度 = 20 (IP头) + 1480 (数据) = 1500字节
    • 剩余数据 = 2980 - 1480 = 1500字节
  2. 第2个分片

    • 数据长度 = 1480字节(仍然 ≤ 1480)。
    • 偏移量 = 1480 / 8 = 185
    • MF标志 = 1(仍有剩余数据)。
    • 分片总长度 = 20 + 1480 = 1500字节
    • 剩余数据 = 1500 - 1480 = 20字节
  3. 第3个分片

    • 数据长度 = 20字节(最后剩余部分)。
    • 偏移量 = (1480 + 1480) / 8 = 2960 / 8 = 370
    • MF标志 = 0(这是最后一个分片)。
    • 分片总长度 = 20 (IP头) + 20 (数据) = 40字节

分片结果

分片偏移量(Fragment Offset)MF标志数据长度分片总长度
10114801500
2185114801500
337002040

2. 接收方的组装过程

接收方需要缓存所有分片,并按照以下步骤重组原始数据报:

  1. 识别属于同一数据报的分片
    • 所有分片的 Identification 字段相同(由发送方生成,唯一标识这个数据报)。
  2. 检查分片是否完整
    • 第一个分片Offset=0MF=1(表示有后续分片)。
    • 中间分片Offset 递增,MF=1
    • 最后一个分片MF=0(表示结束)。
  3. 按偏移量排序并拼接数据
    • 第1个分片:数据 0~1479。
    • 第2个分片:数据 1480~2959。
    • 第3个分片:数据 2960~2979。
  4. 检查是否覆盖全部数据
    • 最后一个分片的 Offset + Length = 370×8 + 20 = 2960 + 20 = 2980,与原始数据长度一致。
  5. 重组完整IP数据报
    • 去除后续分片的IP头部,仅保留第1个分片的IP头部。
    • 拼接所有数据部分,得到 3000字节的原始数据报
  6. 提交给传输层(TCP/UDP)
    • 传输层看到的是完整的数据报,并不知道底层进行了分片。

3. 关键点总结

  • 分片由IP层完成,传输层(TCP/UDP)不感知分片
  • 接收方通过IdentificationMFFragment Offset判断分片关系
  • 所有分片必须全部到达才能重组,否则超时丢弃(通常30~60秒)。
  • 分片影响性能(增加延迟、丢包风险),应尽量避免(如使用Path MTU Discovery)。

为什么分片偏移量以8字节为单位?

  • 节省IP头部空间Fragment Offset 字段只有13位(最大 8191),以8字节为单位可表示最大 8191×8=65528 字节的偏移量,足够覆盖最大IP包(65535字节)。

如果某个分片丢失会怎样?

  • 接收方等待超时(如30秒)后丢弃所有已收到的分片
  • 传输层(如TCP)会触发超时重传,重新发送整个数据报(而非单个分片)。

ry)。

为什么分片偏移量以8字节为单位?

  • 节省IP头部空间Fragment Offset 字段只有13位(最大 8191),以8字节为单位可表示最大 8191×8=65528 字节的偏移量,足够覆盖最大IP包(65535字节)。

如果某个分片丢失会怎样?

  • 接收方等待超时(如30秒)后丢弃所有已收到的分片
  • 传输层(如TCP)会触发超时重传,重新发送整个数据报(而非单个分片)。

IP分片机制确保了大数据报能在不同MTU的网络中传输,但应尽量避免分片以提高效率。

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

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

相关文章

数据仓库OLTPOLAP维度讲解

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:大数据、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/…

OpenHarmony之编译配置白名单机制深度解析:构建系统的安全防线

一、白名单机制概述 在OpenHarmony的构建系统中,compile_standard_whitelist.json是一个关键的安全验证机制,它作为编译过程中的"守门人",确保只有经过验证的组件和依赖关系才能被纳入最终构建产物。这个机制是OpenHarmony构建系统…

backward怎么计算的是torch.tensor(2.0, requires_grad=True)变量的梯度

import torch import torch.nn as nn import torch.optim as optim# 一个参数 w 2 w torch.tensor(2.0, requires_gradTrue) # 预测值 y_pred w * 3 # 6 # 真实值 y_true torch.tensor(10.0) # 损失 (预测 - 真实)^2 loss (y_pred - y_true) ** 2 # (6-10)^2 16loss.b…

戴永红×数图:重构零售空间价值,让陈列创造效益!

风雨同舟,智赢未来。近日,湖南戴永红商业连锁有限公司(以下简称“戴永红”)正式携手数图信息科技有限公司,全面启动“可视化品类空间管理”项目。以数图可视化陈列系统为引擎,双方将共同推进企业零售管理的…

排查Redis数据倾斜引发的性能瓶颈

以下是针对 Redis 数据倾斜问题的完整排查与优化方案,结合实战案例说明如何提升吞吐量和响应速度:一、问题现象定位1. ​性能监控异常​# Redis集群节点负载差异 $ redis-cli -c cluster nodes | grep master e1d7b... 10.0.0.1:637916379 master - 0 16…

元宇宙的硬件设备:从 VR 头显到脑机接口

1 元宇宙的主流硬件设备1.1 VR 头显:沉浸式体验的核心入口VR 头显是当前进入元宇宙最主要的硬件设备,通过封闭的显示系统为用户营造沉浸式虚拟环境。主流 VR 头显采用双屏 LCD 或 OLED 显示技术,单眼分辨率已从早期的 1080P 提升至 4K 级别&a…

具身智能2硬件架构(人形机器人)摘自Openloong社区

青龙人形机器人: 硬件 身体全身自由度43,手部自由度6*2,电池续航3h,运动控制算法(zmp/slip/mpc/深度学习)MPC+WBC+强化学习,54Tops(FP16),具有路径建图和自主导航能力,感官系统深度视觉传感器*3全景环视*1,具备语音识别与声源定位,可扩展嗅觉传感器 OpenLoong通…

JavaScript 性能优化:new Map vs Array.find() 查找速度深度对比

前言在前端开发中,我们经常需要从数据集合中查找特定元素。对于小规模数据,使用 Array.find()方法简单直接,但当数据量增大时,性能问题就会显现。本文将深入对比 Map和 Array.find()在数据查找方面的性能差异,并通过实…

栈与队列leetcode题型总结

1. 常用表格总结数据结构常见应用场景时间复杂度(入/出/查)LeetCode 高频题栈(Stack)括号匹配、单调栈、DFS入栈 O(1) / 出栈 O(1) / 查顶 O(1)20 有效的括号, 155 最小栈, 739 每日温度队列(Queue)层序遍历…

云原生俱乐部-RH124知识点总结(3)

写到这RH124的内容已经过半了,虽然内容不多,但是还是不太好写。因为简单的命令不想写,至于理解上也没什么难度,不过还是要保证整体内容的都要讲到。这篇文章就把RH124剩下的内容都完结吧,主要还剩下配置和保护SSH、管理…

安装DDNS-go

wget https://github.com/jeessy2/ddns-go/releases/download/v6.12.2/ddns-go_6.12.2_linux_x86_64.tar.gz tar zxvf ddns-go_6.12.2_linux_x86_64.tar.gz sudo ./ddns-go -s install

机器学习深度学习 所需数据的清洗实战案例 (结构清晰、万字解析、完整代码)包括机器学习方法预测缺失值的实践

矿物数据.xls矿物种类:A,B,C,D,E(其中E数据只有一条,无法用于训练,直接剔除)特征:序号 氯 钠 镁 硫 钙 钾 碳 溴 锶 pH 硼 氟 硒 矿物类型此数据有&#xff1…

从基础到架构的六层知识体系

第1层:数学与逻辑基础(The Foundation)📌 计算机技术的根源;为算法分析、密码学、AI等提供理论支撑离散数学:集合、图论、逻辑、递归线性代数:机器学习、图形学基础概率与统计:数据分…

Flask 路由与视图函数绑定机制

Flask 路由与视图函数绑定机制 核心概念 在 Flask 框架中,路由(Route) 是连接 URL 路径与 Python 函数的桥梁,通过 app.route() 装饰器实现这种绑定关系,使得当用户访问特定 URL 时,对应的函数会被自动调用…

Spring 的 setter 注入可以解决某些类型的循环依赖问题

参考:https://blog.csdn.net/weixin_50055999/article/details/147493914?utm_sourceminiapp_weixin Setter 方法注入 (Setter Injection) 在类中提供一个 setter 方法,并在该方法上使用 Autowired、Resource 等注解。 代码示例 import org.springfr…

数据结构代码分享-5 链式栈

linkstack.c#include<stdio.h> #include<stdlib.h> #include"linkstack.h" //1.创建一个空的栈 void CreateEpLinkStack(linkstack_t **ptop) {*ptop NULL; } //2.入栈,ptop是传入的栈针的地址&#xff0c;data是入栈的数据 int pushLinkStack(linkstac…

数学建模Topsis法笔记

评价决策类-Topsis法学习笔记 问题的提出 生活中我们常常要进行评价&#xff0c;上一篇中的层次分析法&#xff0c;通过确定各指标的权重&#xff0c;来进行打分&#xff0c;但层次分析法决策层不能太多&#xff0c;而且构造判断矩阵相对主观。那有没有别的方法呢&#xff1f…

石英加速度计为何成为行业标杆?

在石油钻井、航空航天、工业自动化等领域&#xff0c;高精度、高可靠性的加速度测量至关重要。ER-QA-03F系列石英挠性加速度计凭借其卓越的性能和稳定的表现&#xff0c;成为静态与动态测试的理想选择。自2012年推出以来&#xff0c;该产品已交付数千台&#xff0c;并在石油钻井…

HP Pavilion G6 笔记本使用ventoy启动安装Ubuntu 22.04 桌面版

HP Pavilion G6 笔记本是很老的笔记本了&#xff0c;淘到一款&#xff0c;成色比较新&#xff0c;使用i5 3210 M cpu &#xff0c;内存是2G*2&#xff0c;正好手边有一条4G内存条&#xff0c;替换一条后扩充为6G内存&#xff0c;感觉可以再战10年&#xff01;&#xff08;当然6…

STM32G4 Park及反Park变换(二)实验

目录 一、STM32G4 Park及反Park变换(二)实验 1 Park及反Park变换 1.1 代码 1.2 上位机实验结果 附学习参考网址 欢迎大家有问题评论交流 (* ^ ω ^) 一、STM32G4 Park及反Park变换(二)实验 1 Park及反Park变换 本文介绍了基于STM32G4的Park及反Park变换实验过程。主要内容…