IPv4 分组与分片

IP 定义了数据传送的基本单元——IP 分组(也称 IP 数据报)及其确切的数据格式,也包括一套规则,指明分组如何处理、错误怎样控制,还包含非可靠投递的思想以及与此关联的路由选择的思想。

本页的计算只围绕三个长度字段展开,它们的单位各不相同:首部长度以 4B 为单位,总长度以 1B 为单位,片偏移以 8B 为单位。 真题考过首部各字段的含义(2011、2012)、分片影响哪些字段(2011)、分片计算(2021)和 TTL(2014、2024)。王道明确说明不需要背首部格式,需要时题目会给出,但每个字段的意义和单位必须熟悉。

机制

IPv4 分组的格式

一个 IP 分组由首部和数据部分组成。首部前一部分的长度固定,共 20B,是所有 IP 分组必须具有的;在首部固定部分的后面是一些可选字段,其长度可变,用来提供错误检测及安全等机制。

行(每行 32 位)字段(位数)
第 1 行版本(4)· 首部长度(4)· 区分服务(8)· 总长度(16)
第 2 行标识(16)· 标志(3)· 片偏移(13)
第 3 行生存时间(8)· 协议(8)· 首部检验和(16)
第 4 行源地址(32)
第 5 行目的地址(32)
可变部分可选字段(长度可变)+ 填充

各重要字段的含义如下:

  1. 版本:占 4 位,指 IP 的版本,IPv4 数据报中该字段的值是 4。
  2. 首部长度:占 4 位,以 4B 为单位,最大可表示的首部长度为 60B(B)。最常用的首部长度是 20B(B),该字段的值是 5,此时不使用任何可选字段。所以 IP 首部前两个十六进制数字往往是 0x45,解题时可用于定位 IP 数据报的开始位置。
  3. 总长度:占 16 位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 B。以太网帧的最大传送单元(MTU)为 1500B,因此当一个 IP 数据报封装成帧时,数据报的总长度(首部加数据)一定不能超过下面的数据链路层的 MTU 值。
  4. 标识:占 16 位,是一个计数器,每产生一个数据报就加 1,并赋值给标识字段。它不是”序号”,因为 IP 是无连接服务。当一个数据报的长度超过网络 MTU 时必须分片,此时每个数据报片都复制一次标识号,以便能正确地重装成原来的数据报。
  5. 标志:占 3 位。最低位为 MF,MF=1 表示后面还有分片,MF=0 表示最后一个分片;中间的一位是 DF,只有当 DF=0 时才允许分片。
  6. 片偏移:占 13 位,指出较长的数据报在分片后,某片在原数据报中的相对位置,以 8B 为偏移单位。所以除最后一个分片外,每个分片的数据长度一定是 8B 的整数倍。
  7. 生存时间(TTL):占 8 位,数据报在网络中可通过的路由器数的最大值,标识数据报在网络中的寿命,以确保数据报不会永远在网络中循环。路由器在转发数据报前,先将 TTL 减 1;若 TTL 被减为 0,则该数据报必须丢弃(TTL 字段的分析与计算 2014、2024 年考过)。丢弃时路由器还要向源主机发送 ICMP 时间超过报文(4.2.7)。
  8. 协议:占 8 位,指出此数据报携带的数据使用何种协议,即数据部分应上交给哪个协议处理,如 TCP、UDP 等。值为 6 表示 TCP,值为 17 表示 UDP。
  9. 首部检验和:占 16 位,只检验数据报的首部,不包括数据部分,不检验数据部分可减少计算的工作量。数据报每经过一个路由器,其首部中的某些字段(如生存时间、总长度、标志、片偏移、源/目的地址)都可能发生变化,因此每个路由器都要重新计算首部检验和。计算方法与 UDP 和 TCP 的检验和相同(5.2.2 UDP 检验)。
  10. 源地址:占 4B,标识发送方的 IP 地址。
  11. 目的地址:占 4B,标识接收方的 IP 地址。

分析 IP 首部时,IP 地址通常用十六进制表示,要注意其与十进制之间的转换:每两个十六进制数字对应点分十进制的一段,例如 C0 A8 01 01 即 192.168.1.1。

IP 数据报分片

一个链路层数据帧能承载的最大数据量称为最大传送单元(MTU)。因为 IP 数据报被封装在链路层的帧中,所以链路层的 MTU 严格地限制了 IP 数据报的长度;而且在 IP 数据报的源与目的地路径上的各段链路可能使用不同的链路层协议,有不同的 MTU。例如,以太网的 MTU 为 1500B,而许多广域网的 MTU 不超过 576B。当 IP 数据报的总长度大于链路 MTU 时,就需要将 IP 数据报中的数据分装在多个较小的 IP 数据报中,这些较小的数据报称为片。

片在目的地的网络层被重新组装。 目的主机使用 IP 首部中的标识、标志和片偏移字段来完成对片的重组:

  • 创建一个 IP 数据报时,源主机为该数据报加上一个标识号;路由器将一个数据报分片时,形成的每个片都具有原始数据报的标识号。目的主机收到来自同一发送主机的一批数据报时,可通过检查标识号来确定哪些数据报属于同一个原始数据报的片。
  • 标志位只有后 2 位有意义:只有当 DF=0 时,该 IP 数据报才可被分片;MF=1 表示相应的原始数据报还有后续的片,MF=0 表示这是最后一个片。
  • 目的主机在对片进行重组时,使用片偏移字段来确定片应放在原始 IP 数据报的哪个位置。

分片时会影响首部中的哪些字段 2011 年考过:每个片的总长度、标志(MF)、片偏移、首部检验和都与原数据报不同;标识、源地址、目的地址、协议原样复制。

计算模板

分片计算

  1. 求每片最多携带多少数据:首部长度。先减首部,再向下取到 8 的倍数。
  2. 依次切分原数据部分:原数据长度 = 原总长度 − 首部长度。前面各片都取上一步的最大值,剩下的给最后一片。
  3. 每片的片偏移 = 该片数据在原数据部分中的起始字节号 ÷ 8。
  4. 每片的总长度 = 首部长度 + 该片数据长度。
  5. 标志:DF=0;除最后一片外 MF=1,最后一片 MF=0。

王道正文的例子:一个长 4000B 的 IP 数据报(首部 20B,数据部分 3980B)到达一个路由器,需要转发到一条 MTU 为 1500B 的链路上。每片最多携带 B 数据,于是 3980B 数据分到 3 个片中:

片数据字节范围数据长度总长度片偏移MFDF
10~14791480B1500B010
21480~29591480B1500B10
32960~39791020B1040B00

三个片的标识都与原数据报相同(例如都是 777)。

错题复盘:每片数据先减首部、再向下取 8 的倍数:MTU 为 800B 时每片最多 776B

2021 年统考真题(王道 4.2.8 第 67 题):若路由器向 MTU=800B 的链路转发一个总长度为 1580B 的 IP 数据报(首部长度为 20B)时进行了分片,且每个分片尽可能大,则第 2 个分片的总长度字段和 MF 标志位的值分别是(A. 796,0 B. 796,1 C. 800,0 D. 800,1)。答案 B。

每片最多装 B 数据,但除最后一片外数据长度必须是 8 的倍数,只能取 776B。原数据部分 B,,需要分成 3 片:

片数据长度总长度片偏移MF
1776B796B01
2776B796B971
38B28B1940

选 800 是漏了”8 的倍数”这一步;选 MF=0 是以为只分了 2 片,没有算出最后还剩 8B。

边界

片偏移给的是数据部分的位置,不含首部,单位 8B。 第 2 片的片偏移 185 表示它的数据从原数据部分的第 字节开始,与首部长度无关。

错题复盘:片偏移以 8B 为单位,指的是该片数据在原数据中的位置

王道 4.2.8 第 8 题:下列关于 IP 分组的分片与组装的描述中,错误的是(A. IP 分组头中与分片和组装相关的字段是:标识、标志与片偏移 B. IP 分组规定的最大长度为 65535B C. 以太网的 MTU 为 1500B D. 片偏移的单位是 4B)。答案 D。

片偏移标识该分片所携带数据在原始分组所携带数据中的相对位置,以 8B 为单位;4B 是首部长度字段的单位。三个长度字段的单位最容易互相串:首部长度 4B、总长度 1B、片偏移 8B。

同组的第 9、11 题是这个单位的两种用法:片偏移为 100,表示该片数据部分的第 1 个字节是原数据部分的第 800 个字节(从 0 编号);若该片总长度为 100B、首部长度字段为 5(20B),则数据部分 80B,最后一个字节的编号是 879。

MTU 限制的是 IP 数据报的总长度(首部 + 数据),不是数据部分。 所以求每片的数据量时要先减去首部。

分片可以在源主机或途中任何一个路由器进行,重组只在目的主机进行。 中间路由器不重组,因为各个片可能走不同的路径。

若被分片的数据报本身已经是一个片(MF=1),它的最后一个子片仍要 MF=1。 只有原始数据报的最后一片才标 MF=0。

标识不是序号。 IP 是无连接的,标识只用来把同一原始数据报的片归到一起,不表示先后顺序。

首部检验和只管首部。 数据部分出错 IP 不负责检测,由上层(TCP/UDP 的检验和)处理。

错题复盘:DF=1 而分组超过 MTU 时,丢弃并用 ICMP 终点不可达报文报告源主机

王道 4.2.8 第 10 题:下列关于 IP 分组分片基本方法的描述中,错误的是(A. IP 分组长度大于 MTU 时,就必须对其进行分片 B. DF=1,分组的长度又超过 MTU 时,则丢弃该分组,不需要向源主机报告 C. 分片的 MF 值为 1 表示接收到的分片不是最后一个分片 D. 属于同一原始 IP 分组的分片具有相同的标识)。答案 B。

若分组长度超过 MTU:DF=1 时丢弃该分组,并且要用 ICMP 终点不可达报文向源主机报告差错;DF=0 时进行分片,MF=1 表示后面还有分片。B 错在”不需要报告”。

A 说的是超过 MTU 的分组不能原样通过,王道视为正确;DF=1 时不能分片,结果就是丢弃并报告。只有在 ICMP 规定不发送差错报告的那几种场合,才会丢弃而不报告(4.2.7)。

口径差异:DF 位与路径 MTU 发现

教材口径:DF=1 且数据报超过 MTU 时,路由器丢弃该数据报,并用 ICMP 终点不可达报文向源主机报告。

工程口径:这条 ICMP 报文的具体含义是”需要分片但设置了 DF”,现代操作系统的 TCP 通常主动把 DF 置 1,靠这条报文探测整条路径上最小的 MTU(路径 MTU 发现),然后自己把报文段切小,避免在路由器上分片。IPv6 更进一步,路由器根本不分片(4.3.1)。另外,首部中的”区分服务”8 位在标准中已细分为 6 位 DSCP 和 2 位 ECN。

对照速查

说法对错
IP 首部固定部分 20B,最长 60B✅
首部长度字段值为 5 时首部长 5B❌(B)
总长度字段以 4B 为单位❌(1B)
片偏移以 8B 为单位✅
标识字段是 IP 数据报的序号❌
MF=1 表示后面还有分片✅
DF=1 时允许分片❌(DF=0 才允许)
首部检验和检验整个数据报❌(只检验首部)
每经过一个路由器都要重新计算首部检验和✅
协议字段为 6 表示 UDP❌(6 是 TCP,17 是 UDP)
片在途中的路由器上重组❌(只在目的主机重组)

考点

  • 首部 20B 固定 + 最多 40B 可选;三个长度单位 4B / 1B / 8B
  • 标识复制、DF=0 才分、MF=1 还有后续;分片影响总长度、MF、片偏移、检验和(2011)
  • 分片计算:每片数据 (2021)
  • TTL 每跳减 1,减到 0 丢弃并发 ICMP 时间超过(2014、2024)
  • 协议字段 6 = TCP,17 = UDP;检验和只管首部,每跳重算

链接