注:本文为 “IP 分片偏移量计算” 相关文章合辑。
中文引文,未整理去重。
英文引文,机翻未校。
计算机网络 —— IPv4 数据报的首部格式
花生酱拌面 于 2021-11-10 10:59:11 发布
IPv4 数据报的首部格式如下图所示:
IP 数据报由固定部分和可变部分组成,固定部分的长度为 20 字节,可变部分的长度是可变的,最大长度为 40 字节。
-
版本:占 4 比特,用于表示 IP 协议的版本,通信双方所使用的 IP 协议版本必须保持一致。当前广泛使用的版本号为 4。
-
首部长度:占 4 比特,用于表示 IP 数据报首部的长度,该字段的取值以 4 字节为单位。其最小取值为 5,这表示 IP 数据报首部仅包含 20 字节的固定部分;最大取值为 15,这表示 IP 数据报首部包含 20 字节的固定部分以及最大 40 字节的可变部分。
-
可选字段:长度范围为 1 至 40 字节,用于支持排错、测量、安全等功能。可选字段虽然增加了 IP 数据报的功能,但也增加了每个路由器处理 IP 数据报的开销。在实际应用中,可选字段很少被使用。
-
填充字段:为确保首部长度为 4 字节的整数倍,使用全 0 进行填充。
-
区分服务:占 8 比特,通过该字段的不同取值可以提供不同等级的服务质量。只有在使用区分服务时,该字段才会发挥作用,一般情况下该字段不被使用。
-
总长度:占 16 比特,用于表示 IP 数据报的总长度,即首部长度与数据载荷长度之和,其最大取值为 65535。
-
标识:占 16 比特,属于同一个数据报的各分片数据报应具有相同的标识。
-
标志:占 3 比特,其中 DF 位为 1 表示不允许分片,为 0 表示允许分片;MF 位用于表示后面是否还有分片,0 表示这是最后一个分片;保留位必须为 0。
-
片偏移:占 13 比特,用于指出分片数据报的数据载荷部分相对于其在原数据报中的位置偏移了多少个单位,片偏移以 8 字节为单位。
如上图所示,对一条 IP 数据报进行分片。
由于在将数据报封装成帧时,对数据报的大小存在限制,一般不大于 1500 字节。因此,将数据载荷分成 3 个部分,其长度分别为 1400 字节、1400 字节、800 字节。
为每个分片添加一个新的首部,这些首部的标识与原数据报首部的标识相同。除了第 3 个分片之外,其余首部的 MF 位为 1,表示不是最后一个分片。DF 位均为 0,表示允许分片。
片偏移是指分片后的各分片首字节相对于原本位置的偏移,该数值必须是 8 的整数倍,因此在进行分片时需要综合考虑各个分片的大小。
-
生存时间(TTL):占 8 比特,用于表示 IP 数据报的生存时间。每经过一个路由器,TTL 的值就减 1。当 TTL 的值为 0 时,该数据报将被丢弃。在前面介绍路由环路时,使用 TTL 来解决路由环路所带来的问题。
-
协议:占 8 比特,用于指明 IPv4 数据报的数据部分所对应的协议的数据单元。
常见的协议及其相应的协议字段如下
协议名称 ICMP IGMP TCP UDP IPv6 OSPF 协议字段值 1 2 6 17 41 89 -
首部检验和:占 16 比特,用于检测首部在传输过程中是否出现差错,其检验方法比 CRC 检验码简单,被称为因特网检验和。
-
源 IP 地址和目的 IP 地址:各占 32 比特,分别用于填写发送该 IP 数据报的源主机的 IP 地址和接收该 IP 数据报的目的主机的 IP 地址。
IP 报头中与分片相关的三个字段
1、 标识符( ldentifier ):16 bit
该字段与 Flags
和 Fragment Offest
字段联合使用, 对较大的上层数据包进行分段( fragment ) 操作。
路由器将一个包拆分后,所有拆分开的小包被标记相同的值
,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
2、 标记( Flags ):3 bit
该字段位解:
第 1 位不使用。
第 2 位是 DF( Don’t Fragment ) 位,DF 位设为 1 时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个 ICMP
错误信息。
第 3 位是 MF( More Fragments ) 位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的 IP 报文头中将 MF 位设为 1。
3、 片偏移( Fragment Offset ):13 bit
表示该 IP 报文在该组分片中的位置,接收端靠此来组装还原 IP 报文。img
假设原 IP 分组总长度为 L, 待转发链路的 MTU 为 M M M
若 L > M L>M L>M,且 D F = 0 DF=0 DF=0, 则可以 / 需要分片。
分片时每个分片的标识复制原 IP 分组的标识。
通常分片时,除最后一个分片,其他分片均分为 MTU 允许的最大分片。
一个最大分片可封装的数据应该是 8 的倍数,因此,一个最大分片可封装的数据为:
d = ⌊ M − 20 8 ⌋ × 8 \large d=\left\lfloor\frac{M - 20}{8}\right\rfloor × 8 d=⌊8M−20⌋×8 ( IP 首部长度固定部分 20 字节)
需要的总片数为:
n = ⌈ L − 20 d ⌉ \large n=\left\lceil\frac{L - 20}{d}\right\rceil n=⌈dL−20⌉
每片的片偏移字段取值为:img
F i = d 8 × ( i − 1 ) , 1 ≤ i ≤ n \large F_{i}=\frac{d}{8} × (i - 1),1\leq i\leq n Fi=8d×(i−1),1≤i≤n
每片的总长度字段为:
L i = { d + 20 1 ≤ i < n L − ( n − 1 ) d i = n L_{i}=\begin{cases}d + 20&1\leq i<n\\L-(n - 1)d&i=n\end{cases} Li={d+20L−(n−1)d1≤i<ni=n
每片的 MF 标志位为:
M F i = { 1 1 ≤ i < n 0 i = n \large MF_{i}=\begin{cases}1&1\leq i<n\\0&i=n\end{cases} MFi=⎩ ⎨ ⎧101≤i<ni=n
数据报分片举例
举例 1
举例 2
IPv4 与 IPv6 数据包分段处理比较:
比较项 | IPv4 | IPv6 |
---|---|---|
分段处理方 | 中间路由器可以对超过接口 MTU 的数据包进行再分段处理,且在转发过程中可能被多次分段 | 只有源端数据包发送方才能对数据包进行分段处理 |
超过 MTU 的处理方式 | 中间路由器进行再分段处理,降低数据包转发效率 | 如果源端需发送的数据包 PMTU 超过中间路由器转发的数据包接口的 MTU 值,数据包将被丢弃,并向源端发送 ICMPv6 的 “Packet Too Big” 消息 |
源端后续处理 | 无 | 源端收到 “Packet Too Big” 消息后,会调整其后续数据包的大小,以确保它们不超过丢包路由器的 MTU 值 |
IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
韩曙亮 于 2020-08-27 20:39:17 发布
一、最大传送单元 MTU
- 最大传送单元 MTU:MTU 是链路层可封装数据的上限。
- MTU 值:以太网的最大传送单元 MTU 是 1500 字节。
- 分片:链路层的数据部分,就是 IP 分组,该分组的 MTU 是 1500 字节,当网络层的 IP 分组超过 1500 字节,此时就要进行分片。
二、分片机制(标识、标志、片偏移)
- IP 数据报分片:要根据首部的标识、标志、片偏移进行相应处理。
- 标识:同一个 IP 数据报的分片,使用相同的标识;IP 数据报大小超过 MTU 时,将数据报分片,分片完成的 IP 数据报分片,其标识都是相同的。
- 标志:由 3 位组成,[48, 50],只有 2 位有意义
- 最高位:是保留位,没有意义
- 中间位:DF 位,Don’t Fragment;DF = 1 时,禁止分片;DF = 0 时,允许分片。
- 最低位:MF 位,More Fragment;MF = 1 时,后面还有分片;MF = 0 时,本分片就是该分组的最后一个分片,后面没有分片。只有 DF = 0 时,MF 才有意义。
- 片偏移:较长的分组的分片,中间的某个分片,在原来的 IP 分组中的相对位置;单位是 8 字节;也就是说除了最后一个分片,每个分片的长度是 8 字节的整数倍。
三、分片标识(Identification)
在 IP 协议中,分片标识是用来帮助接收端重新组装原始数据报的关键字段。
-
标识的产生:
- 当一个 IP 数据报被创建时,会分配一个唯一的分片标识(Identification),这个标识是一个 16 位的整数,其取值范围是 0 到 65535。这个值通常由发送主机的 IP 协议软件基于一个计数器来确定,每次创建一个新的 IP 数据报时,计数器增加,并将该值用作新数据报的分片标识。
-
分片过程中的标识不变性:
- 当一个 IP 数据报因为超过链路层的最大传输单元(MTU)而需要分片时,所有分片都会保留原始数据报的分片标识。这样做是为了确保接收端能够识别出这些分片都属于同一个原始数据报。
-
标识的作用和重要性:
- 接收端主机使用分片标识来重新组装分片。如果两个分片具有相同的标识,接收端就知道它们属于同一个原始数据报,并将它们组合在一起。没有这个标识,接收端就无法准确地确定哪些分片是相互关联的,也就无法正确地还原原始数据报。
这个机制确保了即使数据报在传输过程中被分片,接收端也能够正确地将它们重新组装成原始的数据报。
四、分片机制示例
- 分片机制示例:
- IP 数据报:首部 20 字节,数据部分 3800 字节
- 将其进行分片处理:每个分片不超过 1420 字节
- 标识:666
- 标志:DF = 0,表示允许分片;MF = 0,表示后续没有分片
- 片偏移量:0
- 分片后的结果是:分成三片
- 第一片:
- 分片数据:首部 1(20 字节) + 1400 字节数据部分
- 标识:666,同一个分组的分片,标识相同
- 标志:DF = 0,允许分片;MF = 1,后续还有分片
- 片偏移量:片偏移量是 0,单位是 8 字节,本片偏移量相当于 0 字节
- 第二片:
- 分片数据:首部 2(20 字节) + 1400 字节数据部分
- 标识:666,同一个分组的分片,标识相同
- 标志:DF = 0,允许分片;MF = 1,后续还有分片
- 片偏移量:片偏移量是 175,单位是 8 字节,本片偏移量相当于 1400 字节
- 第三片:
- 分片数据:首部 3(20 字节) + 1000 字节数据部分
- 标识:666,同一个分组的分片,标识相同
- 标志:DF = 0,允许分片;MF = 0,后续没有分片
- 片偏移量:片偏移量是 350,单位是 8 字节,本片偏移量相当于 2800 字节
- 片偏移量是从数据部分开始计数,数据部分的开始位置是 0 字节,其单位是 8 字节,片偏移量 1 代表 8 字节。
- 第一片:
四、IP 数据报首部中的相关数据长度单位
- IP 数据报首部中的相关数据长度单位:速记:一种(总长度)八片(片偏移)的首(首部长度)饰(四)。
- 总长度单位:1 字节
- 片偏移单位:8 字节
- 首部长度单位:4 字节
IP 数据报的分片 & 应用到每个分片中的 length, ID, fragflag,offset 字段的相关例题
土豆面包于 2021-01-19 15:51:36 发布
IP 分片
在 TCP/IP 分层中,数据链路层用 MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU 是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头。当发送的 IP 数据报的大小超过了 MTU 时,IP 层就需要对数据进行分片,否则数据将无法发送成功。
一个 IP 数据报的每个分片都具有自己的 IP 头部信息,它们都具有相同的标识值,但是具有不同的位偏移,且除了最后一个分片 fragflag=0 外,其他分片都将设置 fragflag=1 标志。此外,每个分片的 IP 头部的总长度字段将被设置为该分片的长度。
例如,以太网帧的 MTU 是 1500 字节,因此它的数据部分最大为 1480 字节 (IP 头部占用 20 字节)。
例题
假设一个路由器收到了如下所示的三个 IP 分片。由于下一跳的最大传输大小小于 1500 字节,所以路由器希望将这些分片合并成一个较大的分片,然后在发送到下一跳时再将其重新分片为几个分片。假设下一跳的最大传输大小为 1020 字节,分片 ID 设置为 20,请画出要发送到下一跳的所有分片,并标明每个分片对应的字段,包括 length, ID, fragflag, and offset.
解题过程:
-
我们使用三个较小的数据报来计算一个总的数据报。
Fragflag=1 表示它不是最后一个数据报,而 Fragflag= 0 表示它是最后一个数据报。head 是 20 bytes。因此,我们可以使用 length、fragflag 和 offset 来计算每个较小数据报数据段的大小:
通过计算,我们发现大数据报的总数据段为 1480+1480+1020=3980 bytes。
-
我们需要根据下一跳最大传输大小为 1020 字节对总的数据报进行切片。计算步骤如下表所示:
head section | length except head section | ID | fragflag | offset |
---|---|---|---|---|
20 | 1000 bytes | 20 | 1 | 0 |
20 | 1000 bytes | 20 | 1 | 1000/8=125 |
20 | 1000 bytes | 20 | 1 | 2000/8=250 |
20 | 980 bytes | 20 | 0 | 3000/8=375 |
所以我们可以画出所有将要被发送到下一跳的片段,结果如下所示:
IP 分片与重组的工作原理
努力的小雨 发表于 2023/12/13 13:02:14
IP 分片与重组是在数据包传输过程中起到关键作用的机制。当数据包的大小超过网络链路的 MTU(最大传输单元)限制时,IP 分片将数据包分割为多个较小的分片进行传输。这些分片在网络中独立传输,到达目的地后,通过 IP 重组机制将它们重新组合成完整的数据包。这种分片和重组的过程确保了大尺寸的数据包能够在网络中进行传输,同时保证了数据的完整性和可靠性。
IP 分片与重组
不同的数据链路具有不同的最大传输单元(MTU),例如 FDDI 数据链路的 MTU 为 4352 字节,以太网的 MTU 为 1500 字节。MTU 代表最大传输单元(Maximum Transmission Unit),指的是网络中可以传输的最大数据包大小。
FDDI(Fiber Distributed Data Interface)是一种高速局域网(LAN)标准,使用光纤作为传输介质。MTU(Maximum Transmission Unit)是指一个数据链路层协议所能传输的最大数据包大小。在 FDDI 网络中,MTU 的大小是 4352 字节。这意味着在 FDDI 网络中,数据链路层协议能够传输的最大数据包大小为 4352 字节。如果要传输的数据包超过这个大小,就需要进行分片,将数据包分割成适合 MTU 大小的多个分片进行传输,并在接收端进行重组。
对于以太网来说,MTU 的大小通常是 1500 字节。这意味着以太网可以传输最大为 1500 字节的数据包。如果数据包的大小超过了 MTU 的限制,那么数据包将被分片为更小的片段进行传输,并在目的地重新组装。分片后的 IP 数据报在重新组装时只能由目标主机进行,路由器不会进行重组操作。
TCP 报文段中 MSS 是最大段大小(Maximum Segment Size)的缩写,它在 TCP 协议中扮演着重要的角色。MSS 指的是在 TCP 连接中允许发送的最大数据段的大小。与 MTU 类似,MSS 也是用来限制数据包的大小,但是它是在传输层,即 TCP 协议层进行限制。TCP 协议通过将应用层的数据分成多个数据段来传输,而每个数据段的大小受到 MSS 的限制。
每种数据链路的 MTU 之所以不同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。
假设发送方要发送一个 4000 字节的大数据报,在以太网链路上传输,就需要将该数据报分片成 3 个小数据报进行传输。这是因为每个小数据报的大小不能超过 MTU 限制,即 1500 字节。接收方在收到这 3 个小数据报后,会根据每个数据报的序号和偏移量,将它们重组成原始的 4000 字节的大数据报。
~
在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废。为了避免这种情况,TCP 引入了 MSS,即在 TCP 层进行分片,而不是由 IP 层进行分片。这样做的好处是,TCP 可以更加精确地控制每个数据段的大小,避免了 IP 层分片可能引发的问题。
对于 UDP 协议来说,尽量不要发送一个大于 MTU 的数据报文。这是因为 UDP 是面向无连接的传输协议,它不提供像 TCP 那样的可靠性和重传机制。如果发送一个大于 MTU 的 UDP 数据报文,它将被 IP 层进行分片传输。一旦其中某个分片丢失,UDP 协议无法进行重传,导致数据的丢失。因此,为了确保数据的可靠传输,应尽量将 UDP 数据报文的大小控制在 MTU 之内,避免分片传输。
为什么 IP 层会分片,TCP 还要分段
由于在网络传输中,IP 层会自动对数据包进行分片,即使 TCP 层不对数据进行分段,数据包也会被 IP 层自动分片并正常传输。因此,TCP 为什么还需要进行分段呢?难道这不是多此一举吗?
假设有一份较大的数据在 TCP 层不进行分段,在传输过程中发生了丢包现象,TCP 会进行重传,但重传的单位却是整个大份数据(尽管 IP 层会将数据切分为多个小包,每个小包的长度为 MTU)。这是因为 IP 层并不关心数据的可靠性传输。
换句话说,在一台机器的传输层到网络层这条链路上,如果传输层对数据进行分段,那么 IP 层就不会再进行分片。如果传输层没有进行分段,那么 IP 层就有可能进行分片。
简单来说,TCP 对数据进行分段的目的是为了让 IP 层不再进行分片,并且在发生重传时只重传已经分段的小份数据。这样可以提高传输效率和可靠性。
TCP 分段了,IP 层就一定不会分片了吗
在上述讨论中,提到了在发送端进行 TCP 分段后,IP 层就不会再进行分片。然而,在整个传输链路中,可能还存在其他网络层设备,这些设备的最大传输单元(MTU)可能小于发送端的 MTU。因此,即使数据包在发送端已经进行了分段,但在经过这些设备的 IP 层时,仍会再次进行分片。最终,所有的分片将在接收端进行组装。
PMTU(Path Maximun Transmission Unit,路径最大传输单元)
如果能够确定整个链路上的最小 MTU,并以此长度发送数据,那么无论数据传输到哪个节点,都不会发生分片。这个整个链路上的最小 MTU 被称为路径 MTU(PMTU)。
当 IP 数据包到达某个路由器时,如果该路由器的 MTU 小于数据包长度,并且设置了 DF(Do not Fragment)标志为 1,该路由器将无法对数据包进行分片,只能将其丢弃。在这种情况下,路由器会生成一个 ICMP(Internet Control Message Protocol)错误消息,称为 “分片需要但被禁止(Fragmentation Needed But DF Set)”。该 ICMP 错误消息将被发送回源地址,并携带路由器的 MTU 值。发送端收到该 ICMP 错误消息后,可以根据其中的 MTU 值来调整发送的数据包大小,以避免再次发生被禁止分片的情况。
IP 分片是一种不得已的行为,应尽量避免在 IP 层进行分片,特别是在链路中的中间设备上进行分片。因此,在 IPv6 中,已经禁止了中间设备对 IP 报文进行分片,分片只能在链路的起始和终点进行。
Fragment Offset 片段偏移
by Rashmi Bhardwaj
When a packet on a network exceeds the MTU value in size then in order to get the packet delivered to the destination, it is broken down into smaller chunks or fragmented and delivered to the destination where the fragmented packets are again reassembled to form the original packet.
当网络上的数据包大小超过 MTU 值时,为了将数据包传送到目的地,它会被分解成更小的块或分段并传送到目的地,在那里,碎片化的数据包再次重组以形成原始数据包。
The source device must send some additional information in the IP header for the destination device to be able to reassemble the fragments of a packet to get the original packet.
源设备必须在 IP 报头中发送一些附加信息,以便目标设备能够重组数据包的片段以获取原始数据包。
Few of the fields in the IP header used for this purpose are
–用于此目的的 IP 标头中很少有字段是 –
Total Length Field: After fragmenting, this field indicates the length of each fragment, not the length of the overall message. Normally, the fragment size is selected to match the MTU value in bytes after subtracting the IP header size of 20 bytes or more.
总长度字段:分片后,此字段表示每个分片的长度,而不是整个消息的长度。通常,在减去 20 字节或更大的 IP 报头大小后,会选择分段大小以匹配 MTU 值(以字节为单位)。
Identification Number: All the fragments of the same packet have the same identification number to allow the receiving device to identify all the fragments of a single packet.
标识号:同一数据包的所有分片具有相同的标识号,以便接收设备识别单个数据包的所有分片。
Flags: It is a 3-bit field which is used to identify the fragments.
标志位:它是一个 3 位字段,用于标识片段。
-
bit 0: Reserved; must be zero
位 0:保留; 必须为零
-
bit 1: Don’t Fragment (DF)
位 1:不分段(DF)
-
bit 2: More Fragments (MF)
位 2:更多片段(MF)
The MF bit is set for all the fragments except the last one for which it is zero.MF 位是为除最后一个零的片段之外的所有片段设置的。
The DF bit is set to disable the fragmentation and in this case, if the packet size is greater than MTU value then it is dropped.DF 位设置为禁用分段,在这种情况下,如果数据包大小大于 MTU 值,则会丢弃该数据包。
Fragmentation Offset: This field helps the destination device to place the fragments in the proper sequence to build the original packet.
Fragmentation Offset:此字段可帮助目标设备按正确的顺序放置分段,以构建原始数据包。
The fragmentation offset value for the first fragment is always 0. The field is 13 bits wide, so the offset can be from 0 to 8191. Fragments are specified in units of 8 bytes, which is why fragment length must be a multiple of 8.
第一个片段的分片偏移值始终为 0。该字段为 13 位宽,因此偏移量可以从 0 到 8191。片段以 8 字节为单位指定,这就是为什么片段长度必须是 8 的倍数。
Let us take an example to understand the calculation for fragmentation offset:让
我们举个例子来了解分段偏移的计算:
Suppose we have a packet for 1700 bytes to be transmitted over an MTU of 1500 bytes.
假设我们有一个 1700 字节的数据包,要通过 1500 字节的 MTU 传输。
First fragment:
第一个片段:
-
Fragment Offset: 0
片段偏移量:0 -
ID : 1
-
MF = 1
-
DF = 0
-
Total Length : 1500 bytes
总长度 : 1500 字节 -
Data Payload = 1500 -20 bytes IP header = 1480
数据负载 = 1500 -20 字节 IP 报头 = 1480
Second Fragment:
第二个片段:
-
Fragment Offset: 185 (Calculation – Previous Offset + Previous Fragment Data transmitted/8)
片段偏移量:185(计算 – 前一个偏移量 + 传输的前一个片段数据 / 8) -
ID : 1
-
MF = 0
-
DF = 0
-
Total Length: 240 bytes
总长度:240 字节 -
Data Payload = 240 bytes – 20 byes of IP header
数据负载 = 240 字节 – 20 字节 IP 报头
Below is the diagram illustrating the fragmentation of packets as stated in the above computation –
下图说明了上述计算中所述的数据包分段 –
Properly Calculating IP Fragmentation Offsets
正确计算 IP 分段偏移量
February 29, 2024
What is IP Fragmentation? 什么是 IP 分片?
IP fragmentation is the process by which an IP datagram is broken down into smaller fragments when it needs to traverse a network path with a maximum transmission unit (MTU) smaller than the size of the original datagram. The purpose of fragmentation is to allow data packets to be transmitted over networks where intermediate hops may impose smaller limits on packet sizes than the original source and destination.
IP 分段是当 IP 数据报需要遍历最大传输单元 (MTU) 小于原始数据报大小的网络路径时,将 IP 数据报分解为更小分段的过程。分段的目的是允许数据包通过网络传输,其中中间跃点对数据包大小的限制可能比原始源和目标更小。
Fragmentation occurs when a router determines that an IP datagram is too large to be transmitted out an interface based on the MTU of the next network hop. For example, an 1500 byte IP datagram would be too large for an Ethernet frame which has a default MTU of 1492 bytes after accounting for Ethernet headers. In this case, the router would break the datagram into smaller fragments before forwarding them.
当路由器根据下一个网络跃点的 MTU 确定 IP 数据报太大而无法从接口传输出去时,就会发生分段。例如,1500 字节的 IP 数据报对于以太网帧来说太大了,因为在考虑以太网报头后,以太网帧的默认 MTU 为 1492 字节。在这种情况下,路由器会先将数据报分解为更小的片段,然后再转发它们。
Fragment Offsets Explained 片段偏移解释
The IP header contains fields used to control fragmentation and reassembly. This includes a 16-bit Fragment Offset field which indicates where a particular fragment belongs within the original datagram.
IP 标头包含用于控制分段和重组的字段。这包括一个 16 位片段偏移字段,该字段指示特定片段在原始数据报中的位置。
The Fragment Offset field specifies the starting position of the fragment in 8-byte blocks. This allows different fragments from the same original datagram to be reassembled in the proper order based on the offset. Offsets are calculated based on the position within the original datagram.
Fragment Offset 字段指定片段在 8 字节块中的起始位置。这允许根据偏移量以正确的顺序重新组装来自同一原始数据报的不同片段。偏移量是根据原始数据报中的位置计算的。
For example, consider an original 5000 byte IP datagram broken into five 1000 byte fragments. The first fragment would have an offset of 0, indicating it starts at the beginning. The second fragment would have an offset of 125 (1000 bytes divided by 8), the third fragment an offset of 250, and so on.
例如,考虑将一个原始的 5000 字节 IP 数据报分成五个 1000 字节的片段。第一个片段的偏移量为 0,表示它从开头开始。第二个片段的偏移量为 125(1000 字节除以 8),第三个片段的偏移量为 250,依此类推。
Fragmentation Offset Examples 分片偏移示例
Here is an example IP header for a fragmented packet, with arrows pointing to the fragmentation fields:
以下是分段数据包的 IP 标头示例,箭头指向分段字段:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |C|D|M| Fragment Offset | <- Fragmentation fields
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Let’s assume this fragment has an offset value of 125. Based on our example before, this means the fragment starts at byte 1000 of the original datagram (125 * 8).
假设此片段的偏移值为 125。根据我们之前的示例,这意味着片段从原始数据报的第 1000 字节 (125 * 8) 开始。
We can double check the calculation by taking the Total Length field (let’s say it’s 1000 bytes) and adding the offset in 8-byte blocks (125 * 8 = 1000 bytes). This verifies that our offset is correct.
我们可以通过获取 Total Length 字段(假设它是 1000 个字节)并将 8 字节块中的偏移量(125 * 8 = 1000 字节)相加来仔细检查计算。这验证了我们的偏移量是正确的。
When reassembling, the destination host will buffer out-of-order fragments until all are received, then order them by Fragment Offset to reconstruct the original datagram.
重新组装时,目标主机将缓冲无序片段,直到收到所有片段,然后通过片段偏移对它们进行排序以重建原始数据报。
Verifying Fragment Offset Calculations 验证片段偏移计算
There are several tools that can help analyze IP traffic and fragmentation, including packet sniffers like Wireshark and tcpdump. These tools capture and decode network traffic, clearly displaying IP header details including fragmentation fields and offsets.
有几种工具可以帮助分析 IP 流量和分片,包括 Wireshark 和 tcpdump 等数据包嗅探器。这些工具捕获和解码网络流量,清晰显示 IP 标头详细信息,包括分段字段和偏移量。
By examining packet captures of fragmented traffic, you can check that calculated offset values match what is contained in real packet fragments. If offsets do not match, it indicates an issue with fragmentation logic that needs to be investigated.
通过检查分段流量的数据包捕获,您可以检查计算出的偏移值是否与实际数据包分段中包含的偏移值匹配。如果偏移量不匹配,则表明存在需要调查的分片逻辑问题。
Incorrect offset values or missing fragments will result in incomplete or corrupted reassembly at the destination. Carefully auditing offsets helps identify and troubleshoot these kinds of problems.
不正确的偏移值或缺失的片段将导致目标处的重组不完整或损坏。仔细审核偏移有助于识别和解决此类问题。
Special Considerations 特别注意事项
There are some additional factors to keep in mind when working with IP fragmentation:
在处理 IP 分片时,还有一些其他因素需要牢记:
-
MTU Discovery - Path MTU discovery helps determine maximum packet sizes to avoid unnecessary fragmentation. Tools like ping and traceroute can probe paths to find optimal MTUs.
MTU 发现 - 路径 MTU 发现有助于确定最大数据包大小,以避免不必要的分段。ping 和 traceroute 等工具可以探测路径以找到最佳 MTU。 -
Encrypted Traffic - Encryption headers increase packet sizes, which may trigger more fragmentation. Plan for this when evaluating MTUs.
加密流量 - 加密标头会增加数据包大小,这可能会触发更多分片。在评估 MTU 时对此进行规划。 -
Performance - Too much fragmentation can negatively impact network latency and throughput. Tune MTUs to optimize performance.
性能 - 过多的分片可能会对网络延迟和吞吐量产生负面影响。调整 MTU 以优化性能。
via:
-
计算机网络——IPv4 数据报的首部格式_ipv4 数据包首部长度-优快云博客
https://blog.youkuaiyun.com/m0_56561130/article/details/121242945 -
【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )_ip分片详解及例题-优快云博客 韩曙亮 于 2020-08-27 20:39:17 发布
https://blog.youkuaiyun.com/shulianghan/article/details/108267740 -
解密 IP 分片与重组:数据传输中的关键技术-云社区-华为云 努力的小雨 发表于 2023/12/13 13:02:14
https://bbs.huaweicloud.com/blogs/417749 -
IP 数据报的分片 & 应用到每个分片中的 length, ID, fragflag,offset 字段的相关例题 - 优快云 博客 土豆面包于 2021-01-19 15:51:36 发布
https://blog.youkuaiyun.com/qq_40177015/article/details/112842832 -
Fragment Offset - Rashmi Bhardwaj
https://ipwithease.com/fragmentation-offset/ -
Properly Calculating Ip Fragmentation Offsets - February 29, 2024
https://networkengineering101.com/properly-calculating-ip-fragmentation-offsets/
— -
IP Fragmentation Calculator
https://mdahshan.github.io/IPFCalc/