IPv4三个难点

这两个问题其实刚好连在一起了。

第 7 题的本质,不是“把十六进制全部老老实实转成十进制”,而是“利用十六进制和二进制的天然对应关系,直接做前缀匹配”;第 8 题的本质,不是“LAN1 包含 LAN2~LAN5”,而是“整个 /23 地址块被切成 5 个彼此独立的子网,其中 LAN1 只是其中一个子网,而且是路由器互连用的中转网段”。

下面分开讲。


一、第 7 题里,十六进制和十进制到底怎么快速转换

先记一个最核心的对应:

每 1 位十六进制 = 4 位二进制

所以:

  • A = 10
  • B = 11
  • C = 12
  • D = 13
  • E = 14
  • F = 15

1)十六进制转十进制,最快的方法

两位十六进制 XY

XY(十六进制) = X × 16 + Y

例如:

  • C4 = 12 × 16 + 4 = 196
  • 5E = 5 × 16 + 14 = 94
  • 68 = 6 × 16 + 8 = 104

所以:

  • C4.5E.13.87
    可以看成十进制的
    196.94.19.135

但这里要注意:这题其实通常没必要全部转成十进制再做。


2)十进制转十六进制,最快的方法

做“除 16 取余”。

例如 94

  • 94 ÷ 16 = 5 ... 14
  • 14 对应 E
  • 所以 94 = 5E

例如 196

  • 196 ÷ 16 = 12 ... 4
  • 12 对应 C
  • 所以 196 = C4

二、第 7 题更快的做法:根本不用完整转十进制

这题是 CIDR 最长前缀匹配,而且题目里的地址本来就是十六进制写的,所以最省时间的方法是:

直接按“十六进制位数”看前缀

因为:

  • /4 = 比较 1 个十六进制位
  • /8 = 比较 2 个十六进制位
  • /12 = 比较 3 个十六进制位
  • /16 = 比较 4 个十六进制位
  • /20 = 比较 5 个十六进制位
  • /24 = 比较 6 个十六进制位

这在考场上特别好用。


三、第 7 题怎么做

题目路由表是:

  • C4.50.0.0/12 -> A
  • C4.5E.10.0/20 -> B
  • C4.60.0.0/12 -> C
  • C4.68.0.0/14 -> D
  • 80.0.0.0/1 -> E
  • 40.0.0.0/2 -> F
  • 00.0.0.0/2 -> G

注意原则:匹配多个时,选前缀最长的。


1)C4.5E.13.87

先看:

匹配 C4.50.0.0/12 -> A

/12 比较前 3 个十六进制位。

  • 路由项:C45
  • 目标地址:C45

匹配,说明可到 A。

匹配 C4.5E.10.0/20 -> B

/20 比较前 5 个十六进制位。

  • 路由项:C45E1
  • 目标地址:C45E1

也匹配,说明也可到 B。

/20/12 更长,所以选 B


2)C4.5E.22.09

匹配 C4.50.0.0/12 -> A

  • 前 3 个十六进制位:C45
  • 目标地址也是 C45

匹配。

匹配 C4.5E.10.0/20 -> B

  • 路由项前 5 位:C45E1
  • 目标地址前 5 位:C45E2

不匹配。

所以这一项不能走 B,只能走 A


3)C3.41.80.02

前面几个 C4... 显然都不匹配。

再看 80.0.0.0/1 -> E

/1 表示只看最高 1 位二进制。

  • C3 的第一位二进制是 1,因为 C=1100

所以匹配 80.0.0.0/1,走 E


4)5E.43.91.12

看前几个 C4... 都不匹配。

再看:

80.0.0.0/1 -> E

5E 的最高位是 0,因为 5 = 0101
所以不匹配 E。

40.0.0.0/2 -> F

/2 看最高两位。
5 的二进制是 0101,最高两位是 01,正好对应 40.0.0.0/2

所以走 F


第 7 题答案

  1. C4.5E.13.87B
  2. C4.5E.22.09A
  3. C3.41.80.02E
  4. 5E.43.91.12F

四、第 7 题里最值得背下来的“速判技巧”

1)前缀刚好是 4 的倍数时,直接按十六进制位比较

这是最重要的。

比如:

  • /12 就比前 3 个十六进制位
  • /20 就比前 5 个十六进制位

2)/1/2 这种就看第一位十六进制数字

因为 1 位十六进制 = 4 位二进制,所以第一位十六进制数字就能看出最高几位。

第一位十六进制数字与最高两位二进制的对应关系:

  • 0 ~ 3:最高两位是 00
  • 4 ~ 7:最高两位是 01
  • 8 ~ B:最高两位是 10
  • C ~ F:最高两位是 11

所以:

  • 00.0.0.0/2 覆盖第一位十六进制是 0~3
  • 40.0.0.0/2 覆盖第一位十六进制是 4~7
  • 80.0.0.0/1 覆盖最高位为 1,也就是第一位十六进制是 8~F

3)不是 4 的倍数的前缀,要特别小心

比如这题的 /14

/14 不是整 4 位,所以不能只机械地看 3 个十六进制位,而要多看 2 位二进制。

C4.68.0.0/14 的范围其实是:

C4.68.0.0 ~ C4.6B.FF.FF

因为第二个字节 68

  • 68 = 01101000
  • 保留前 6 位 011010
  • 后 2 位可变成 00, 01, 10, 11
  • 所以第二个字节可以是:68, 69, 6A, 6B

这一类题经常拿来设陷阱。


五、第 8 题你真正困惑的点:LAN1 为什么“不包含” LAN2~LAN5

这个地方非常典型,很多人第一次学子网划分都会混。

先说结论

LAN1 并不是 LAN2~LAN5 的“父网”或者“外层网”。

这题里:

  • 30.138.118.0/23 才是整个自治系统拿到的“总地址块”
  • 然后把这个总地址块再切成 5 个子网
  • 这 5 个子网分别分给:
    • LAN1
    • LAN2
    • LAN3
    • LAN4
    • LAN5

所以它们是 并列关系,不是“包含关系”。


六、LAN1 在图里到底是什么

图里的 LAN1 是下方那条横线,它连接了几台路由器。

这说明:

LAN1 是一个“路由器之间互联的局域网/骨干网段/中转网段”。

而上面的 LAN2、LAN3、LAN4、LAN5 则是这些路由器连接出去的其他局域网。

也就是说:

  • LAN1 是一个独立子网
  • LAN2 是一个独立子网
  • LAN3 是一个独立子网
  • LAN4 是一个独立子网
  • LAN5 是一个独立子网

它们互相之间靠路由器转发,不是靠“LAN1 包住它们”。


七、是不是“一个路由有两个地址,一个给外面看,一个给里面看”

这个说法有一点接近,但考研里更准确的表达不是这个。

更准确的说法是:

路由器的每一个接口,都属于一个不同的 IP 子网;每个接口都要配置该子网中的一个 IP 地址。

比如图里左边那台路由器:

  • 它接到 LAN1 的那个接口,要有一个 LAN1 网段的 IP
  • 它接到 LAN2 的那个接口,还要有一个 LAN2 网段的 IP

所以它至少有两个三层地址。

中间那台也是一样。

右边那台更明显,它可能连接:

  • LAN1
  • LAN4
  • LAN5

那它就会有 3 个接口地址。

所以这里不是简单地说“一个内部地址、一个外部地址”,而是:

一台路由器有几个三层接口,通常就有几个不同子网下的 IP 地址。

这个和 NAT 里的“内网地址/外网地址”不是一回事,这里考的是普通路由与子网划分。


八、第 8 题怎么划分

题目给总块:

30.138.118.0/23

/23 表示总共 2^(32-23) = 512 个地址。
范围是:

30.138.118.0 ~ 30.138.119.255


1)先确定每个 LAN 至少需要多大的块

LAN2 到 LAN5 的主机数分别是:

  • LAN2:91
  • LAN3:150
  • LAN4:3
  • LAN5:15

另外 LAN1 也要分地址,因为 LAN1 上挂了 3 个路由器接口。

所以可以这样算:

局域网需要的主机/接口数至少需要地址数应分配前缀
LAN3150至少 152/24
LAN291至少 93/25
LAN515至少 17/27
LAN43至少 4 或 5/29
LAN13 个路由接口至少 5/29

这里解释一下:

  • /24 有 256 个地址,254 个可用
  • /25 有 128 个地址,126 个可用
  • /27 有 32 个地址,30 个可用
  • /29 有 8 个地址,6 个可用

2)按“从大到小”划分,这是变长子网划分的标准做法

一种完全正确的划分方式是:

  • LAN3:30.138.118.0/24
  • LAN2:30.138.119.0/25
  • LAN5:30.138.119.128/27
  • LAN4:30.138.119.160/29
  • LAN1:30.138.119.168/29

这 5 个子网互不重叠,而且都包含在总块 30.138.118.0/23 里。


九、为什么这种划分是对的

因为整个 /23 先被“切块”:

  • 先拿一个 /24 给 LAN3
  • 剩下部分里再切一个 /25 给 LAN2
  • 再切一个 /27 给 LAN5
  • 再切两个 /29 分别给 LAN4 和 LAN1

本质上就是在一个大地址池里做切分。

关键点

不是 LAN1 里再去套 LAN2~LAN5。

而是:

30.138.118.0/23
这个大块
→ 切成多个并列的小块
→ 分给不同 LAN


十、把这个拓扑用一句话说清楚

如果按考研术语来表达,这题其实是在说:

一个自治系统内部有 5 个独立的 IP 子网,其中 LAN1 是互连各路由器的骨干网段,LAN2~LAN5 是挂在路由器上的用户局域网;整个自治系统从上级获得一个 /23 地址块,再通过 VLSM 划分给各个局域网。

这句话一旦想通,LAN1 不包含 LAN2~LAN5 就不奇怪了。


十一、这类题最容易错在哪里

最常见的三个误区:

1)把物理连接关系误认为 IP 包含关系

图上 LAN2~LAN5 好像“挂在” LAN1 上,于是就误以为 LAN1 是它们的上层网段。
这是错的。

物理上连接在一起,不代表 IP 子网是包含关系。
路由器一隔开,就是不同子网。


2)忘了 LAN1 也需要地址

很多人只给 LAN2~LAN5 分,忘了下方骨干 LAN1 也需要一个独立网段。
这是做题时很常见的漏项。


3)以为路由器只有一个 IP

路由器是三层设备,每个接口一个网段、一个地址
所以它当然可以同时出现在多个子网里。


十二、以后碰到类似题怎么快速识别

以后只要看到这种图:

  • 下方一条总线/一个共享网段,连着多个路由器
  • 每个路由器再往上连不同 LAN

就要立刻意识到:

  1. 下方那条线本身就是一个子网
  2. 每个上方 LAN 也是一个子网
  3. 所有这些子网都是从总地址块里切出来的
  4. 它们之间是并列,不是嵌套
  5. 一台路由器会在多个子网里各有一个接口地址

如果按 408 做题角度总结成最短记忆版,就是这两句:

第 7 题:十六进制 CIDR 优先按“1 位十六进制 = 4 位二进制”做前缀匹配,能不转十进制就不转。
第 8 题:LAN1 不是 LAN2~LAN5 的父网,而是 5 个并列子网中的一个骨干互连网段。

这两题确实是 408 里比较“烦”的那一类:表面上像是在考一个 IP 首部,实际上把链路层、网络层、分片、长度、地址表示法、字段偏移,全揉在一起了。
但这类题并不是靠“硬背一大串格式”去做,而是靠“按字节顺序机械拆字段”。一旦形成固定步骤,题目就会稳定很多。


第10题怎么做

题目给出的 IPv4 首部是:

45 00 00 54 00 03 58 50 20 06 FF F0 7C 4E 03 02 B4 0E 0F 02

IPv4 标准首部最少 20B,字段顺序固定,所以直接按顺序切:

  • 45:版本 + 首部长度
  • 00:区分服务
  • 00 54:总长度
  • 00 03:标识
  • 58 50:标志 + 片偏移
  • 20:TTL
  • 06:协议
  • FF F0:首部校验和
  • 7C 4E 03 02:源 IP
  • B4 0E 0F 02:目的 IP

先看源 IP 和目的 IP

把 16 进制按字节转十进制:

源 IP:7C 4E 03 02

  • 7C = 124
  • 4E = 78
  • 03 = 3
  • 02 = 2

所以源 IP 是 124.78.3.2

目的 IP:B4 0E 0F 02

  • B4 = 180
  • 0E = 14
  • 0F = 15
  • 02 = 2

所以目的 IP 是 180.14.15.2

这就是第 1 问答案。


再看数据部分长度

首字节 45

  • 高 4 位 4 表示 IPv4
  • 低 4 位 5 表示首部长度 = 5 个 32 位字
  • 一个 32 位字 = 4B
  • 所以首部长度 = 5 × 4 = 20B

总长度字段是 00 54

0x0054 = 84

而 IPv4 的“总长度” = 首部 + 数据

所以数据部分长度:

84 - 20 = 64B

这就是第 2 问答案。


再看是否分片、偏移量多少

关键字段是 58 50

它是 16 位,其中:

  • 前 3 位:标志位
  • 后 13 位:片偏移

第一步:转二进制理解结构

0x5850

58 = 0101 1000
50 = 0101 0000

合起来:

0101100001010000

按“3 位标志 + 13 位片偏移”切开:

  • 标志位:010
  • 片偏移字段:1100001010000

第二步:判断是否分片

标志位 010 的含义是:

  • 保留位 = 0
  • DF = 1
  • MF = 0

再看片偏移字段:

1100001010000 = 0x1850 = 6224

只要片偏移不为 0,说明这不是第一个分片,分组已经发生过分片。
又因为 MF=0,说明这是最后一个分片

所以从“机械解题”的角度,这个分组是已经分片的

第三步:偏移量的单位换算

这里是最容易错的点。

IP 首部中的“片偏移”字段,单位不是字节,而是 8B

也就是说:

  • 片偏移字段值 = 6224
  • 实际字节偏移 = 6224 × 8 = 49792B

所以这问最稳妥的写法应该是:

  • 已分片
  • 片偏移字段值为 6224
  • 若换算成实际字节偏移量,则为 49792B

这里要特别提醒一个细节

这组数据里有一个不太协调的地方:

  • DF=1 表示“不允许分片”
  • 但片偏移又不为 0,说明它像是一个分片

严格按协议语义,这种组合本身是矛盾的。
但考试里这种题通常默认“按字段值机械解析”,不要自己去改题。也就是说,仍然按:

  • 偏移不为 0 → 已分片
  • MF=0 → 最后一个分片

来答。


第10题答案汇总

第 10 题答案可以直接写成:

  1. 源 IP 地址:124.78.3.2,目的 IP 地址:180.14.15.2
  2. 数据部分长度:64B
  3. 该分组已分片;片偏移字段值为 6224,实际字节偏移量为 6224 × 8 = 49792B;且 MF=0,说明它是最后一个分片

第11题怎么做

第 11 题给的是一帧的前 64B 十六进制数据:

00 1d 72 98 1d fc 00 00 5e 00 01 01 88 64 11 00
75 89 01 92 00 21 45 00 01 90 f0 bf 40 00 33 06
f3 15 da c7 66 28 da cf 3d d3 00 50 c4 8f dc a6
a2 96 23 4c 44 69 50 18 00 0f 76 3d 00 00 90 b5

题目还告诉:

  • 主机 A 的 IP 地址是 218.207.61.211
  • 主机 A 的 MAC 地址是 00:1d:72:98:1d:fc

这题关键在于:
先从链路层看,再往网络层剥。


第一步:先看以太网帧头

以太网帧头前 14B:

  • 前 6B:目的 MAC
  • 接着 6B:源 MAC
  • 再 2B:类型

所以前 14B 是:

  • 目的 MAC:00 1d 72 98 1d fc
  • 源 MAC:00 00 5e 00 01 01
  • 类型:88 64

题目给的 A 的 MAC 是 00:1d:72:98:1d:fc,正好等于目的 MAC。
说明这帧是发给 A 的。

那么这一跳把帧发给 A 的那个设备,就是 A 所在网段的网关路由器接口。
因此该接口的 MAC 地址就是帧的源 MAC:

00:00:5e:00:01:01

这就是第 1 问答案。


第二步:判断以太网负载里是什么

类型字段是 88 64,这不是普通 IPv4 的 08 00,而是 PPPoE Session。

接下来几个字节:

  • 11 00
  • 75 89
  • 01 92
  • 00 21

这里的 00 21 是 PPP 协议字段,表示里面封装的是 IPv4。

所以真正的 IP 首部要从 45 00 开始看。

也就是说,这题不是“以太网直接封装 IP”,而是:

以太网 → PPPoE → PPP → IPv4

这就是它看起来很跨章节的原因。


第三步:从 45 00 开始解析 IP 首部

45 00 开始:

45 00 01 90 f0 bf 40 00 33 06 f3 15 da c7 66 28 da cf 3d d3

拆字段:

  • 45:IPv4,首部长度 5 × 4 = 20B
  • 00
  • 01 90:总长度
  • f0 bf
  • 40 00:标志 + 片偏移
  • 33:TTL
  • 06:TCP
  • f3 15
  • da c7 66 28:源 IP
  • da cf 3d d3:目的 IP

先把总长度转十进制:

0x0190 = 400

首部长度仍然是 20B

所以 IP 数据部分长度:

400 - 20 = 380B

这就是第 2 问答案。


第四步:判断路由器会不会分片

题目说:若该分组需要被转发到一条 MTU = 380B 的链路上,路由器做什么?

这里比较的是 IP 分组总长度 与 MTU。

  • 当前 IP 总长度 = 400B
  • 新链路 MTU = 380B

显然 400 > 380,正常来说要分片。

但再看 IP 首部中的标志 + 片偏移字段:40 00

0x4000 的二进制最高 3 位是 010

也就是:

  • DF = 1
  • MF = 0
  • 片偏移 = 0

这表示:禁止分片

所以路由器不能分片转发,只能:

  • 丢弃该 IP 分组
  • 向源主机发送 ICMP 差错报文,说明“需要分片但 DF 置 1”

这就是第 3 问答案。


第11题答案汇总

第 11 题可以直接写成:

  1. 网关路由器相应端口的 MAC 地址是 00:00:5e:00:01:01
  2. IP 分组所携带的数据量为 380B
  3. 因为该 IP 分组总长度为 400B,大于下一跳链路的 MTU=380B,本应分片;但首部中 DF=1,禁止分片,所以路由器将丢弃该分组,并向源主机发送 ICMP 差错报文

这类“链路层 + 网络层混合大题”到底怎么做

这种题最怕的不是知识点多,而是做题时顺序乱。
一乱就会把字段看串,把长度减错,把偏移单位忘掉。

比较稳的做法其实就四步。

第一步:先判断当前看到的是哪一层的首部

见到一长串十六进制,先不要急着算。先问自己:

现在这一串,是不是直接就是 IP 首部?

如果题目说“某 IP 分组首部如下”,那就直接按 IPv4 首部格式拆。
如果题目说“某主机收到一个帧,前 64B 如下”,那就必须先按链路层拆:

  • 前 6B 目的 MAC
  • 后 6B 源 MAC
  • 再 2B 类型

只有定位到 IP 首部真正从哪里开始,后面才不会乱。

第 11 题就是典型:
如果一上来把最前面的 00 1d 72 ... 当成 IP 首部,后面全错。


第二步:长度题一律先抓“总长度”和“首部长度”

IPv4 长度题的核心就是两个字段:

  • 首字节低 4 位 → 首部长度
  • 总长度字段 → IP 分组总长度

然后固定公式:

数据长度 = 总长度 - 首部长度

这里特别容易和链路层长度混淆。
以太网帧长度、IP 分组总长度、IP 数据部分长度,这三者不是一回事。


第三步:分片题必须单独盯住“标志 + 片偏移”16 位

无论题目多复杂,分片只看这 16 位。

拆法固定:

  • 前 3 位:标志位
  • 后 13 位:片偏移字段

判断时记住三句话:

  1. 片偏移 = 0MF = 0,通常表示未分片
  2. 片偏移 ≠ 0MF = 1,就说明和分片有关
  3. 片偏移字段的单位是 8B,不是 1B

所以考试里最稳妥的写法不是只写一个数,而是写双层结果:

  • 片偏移字段值 = 某某
  • 实际字节偏移 = 某某 × 8 = 某某 B

这样几乎不会丢分。


第四步:遇到 MTU,先比“IP 总长度”,再看 DF

一看到 MTU,就自动进入这个判断流程:

  1. 先取 IP 总长度
  2. 判断是否大于下一跳链路 MTU
  3. 若不大于,直接转发
  4. 若大于:
    • DF = 0 → 可以分片后转发
    • DF = 1 → 不能分片,只能丢弃并发 ICMP 差错报文

这个流程在第 11 题里就是标准应用。


这类题最容易错的地方

1. 把“片偏移字段值”和“实际偏移字节数”混为一谈

这是最常见错误。

比如片偏移字段是 100,并不表示偏移了 100B,
而是表示偏移了 100 × 8 = 800B

所以做题时最好脑子里始终分成两层:

  • 字段存的值
  • 实际字节偏移量

2. 把 IP 总长度和数据长度混淆

总长度 包含首部。
很多题一看到 0x0190 = 400 就直接写“数据长度 400B”,这是错的。

必须减去 IP 首部长度。


3. 在“帧”里直接找 IP 地址,没有先过 MAC 和类型字段

这种错在跨层题里特别多。

题目一说“收到一个帧”,第一反应必须是:

先看目的 MAC、源 MAC、类型字段。
只有找到网络层报文真正从哪里开始,后面才有意义。


4. 看到 DF=1 就直接说“未分片”

这也不对。

DF 的意思是“不允许继续分片”,
它不等于“当前这个报文一定不是某个分片”。

严格做题还是要结合:

  • DF
  • MF
  • 片偏移

一起判断。


建议记住的一个固定做题模板

以后遇到这种十六进制报文题,直接套这个顺序:

  1. 先判断给的是帧还是 IP 首部
  2. 如果是帧,先拆 MAC 和类型字段
  3. 找到 IP 首部起点后,看 版本/IHL
  4. 用总长度和首部长度求数据长度
  5. 标志 + 片偏移 判断是否分片
  6. 片偏移记得乘 8B 才是实际字节偏移
  7. 如果问 MTU,就比较 IP 总长度和 MTU,再看 DF

这套流程一旦熟了,题目再长,本质上也只是“按固定偏移读字段”。


IPv4 首部十六进制报文题速解模板

这类题表面上是在考“会不会看十六进制”,本质上考的是:能不能把 IPv4 首部格式按字节顺序机械拆开。只要顺序稳定,这类题其实非常适合拿分。真正容易失分的,不是不会,而是做题时字段看乱了、单位忘了、长度减错了。

平时整理时,我更倾向于把它当成一个固定流程,而不是零散知识点去背。考试里拿到一串 IPv4 首部十六进制数据,先不要急着逐字节硬翻译,而是先按标准首部结构切字段。IPv4 最小首部长度是 20B,也就是前 20 个字节一定可以先按下面的顺序读:

第1字节:版本 + 首部长度
第2字节:区分服务
第3~4字节:总长度
第5~6字节:标识
第7~8字节:标志 + 片偏移
第9字节:TTL
第10字节:协议
第11~12字节:首部校验和
第13~16字节:源IP地址
第17~20字节:目的IP地址

如果题目明确说“给出的是 IPv4 分组首部”,那就直接从这里开始拆。若题目给的是“某帧的前若干字节”,就不能一上来直接按 IPv4 首部套,而要先看链路层头部,把 IP 首部真正的起点找出来。这一点在跨章节题里非常关键。

一、先做的第一件事:看第 1 个字节

首字节最重要,因为它一下就把两个高频考点都定下来了。

例如首字节是 45,就拆成:

  • 高 4 位:4,表示 IPv4
  • 低 4 位:5,表示首部长度是 5 个 32 位字

而 1 个 32 位字 = 4B,所以首部长度就是:

5 × 4 = 20B

这一步非常关键,因为后面求数据部分长度、判断有没有选项字段,全部依赖它。

也就是说,看到 45,脑子里要立刻形成两个结论:

  • 这是 IPv4
  • 首部长度 20B,没有选项字段

若低 4 位不是 5,比如是 6、7,则说明首部长度分别是 24B、28B,说明首部里带了选项字段。

二、长度类题只抓两个量

IPv4 中和长度有关,最常考的就是两个字段:

  • 首部长度
  • 总长度

总长度字段是第 3~4 字节,表示整个 IP 分组长度,也就是:

总长度 = 首部 + 数据

因此只要题目问“数据部分长度”“IP 分组携带的数据量”“净荷长度”,统一都用:

数据长度 = 总长度 - 首部长度

例如:

  • 首部长度 = 20B
  • 总长度 = 0x0054 = 84

那么数据长度就是:

84 - 20 = 64B

这类题最容易错的地方,是把“总长度”直接当成“数据长度”,或者把链路层帧长和 IP 总长度混在一起。要记住,IPv4 首部里的总长度只管 IPv4 分组本身,不管以太网首部,也不管帧尾 FCS。

三、地址类题最机械,也最容易白白失分

源 IP 地址固定是第 13~16 字节,目的 IP 地址固定是第 17~20 字节。
做法非常机械:每个字节单独转成十进制,再用点号连接。

比如:

7C 4E 03 02

转换时不要整段一起算,只按字节拆:

  • 7C = 124
  • 4E = 78
  • 03 = 3
  • 02 = 2

所以地址就是:

124.78.3.2

目的 IP 同理。
这种题本质上没有思维难度,只有细心程度,最好的习惯就是“一字节一字节地换”,不要图快。

四、分片题一定盯住“第 7~8 字节”

分片相关的所有判断,核心都在这 16 位里。这个字段由两部分组成:

  • 前 3 位:标志位
  • 后 13 位:片偏移

也就是说,拿到这两个字节后,第一反应不是直接算十进制,而是先意识到它要拆成“3 + 13”的结构。

三个标志位中,最常用的是后两个:

  • DF:是否允许分片
  • MF:后面是否还有分片

其中:

  • DF = 1 表示不允许分片
  • MF = 1 表示后面还有分片
  • MF = 0 表示这已经是最后一个分片,或者根本没分片

但考试里真正容易出错的,不是 DF 和 MF,而是“片偏移的单位”。

五、片偏移字段的单位不是字节,而是 8B

这是分片题的头号陷阱,几乎每年都有人在这里出错。

IP 首部中的片偏移字段,表示的是“当前分片数据部分相对于原始数据部分起点的偏移量”,但它存的不是字节数,而是以 8B 为单位的数值。

也就是说:

实际字节偏移 = 片偏移字段值 × 8

例如某题中第 7~8 字节解析后,片偏移字段值为 6224,那么真正的字节偏移量应该写成:

6224 × 8 = 49792B

因此,凡是题目问“偏移量是多少”,最稳的写法都不是只写一个数字,而是写双层结论:

  • 片偏移字段值为 6224
  • 实际字节偏移量为 49792B

这样基本不会因为单位问题丢分。

六、如何快速判断“是否已经分片”

这个问题在题里出现频率很高,判断逻辑其实并不复杂。

通常可以这样把握:

  • 如果 片偏移 = 0MF = 0,一般说明未分片
  • 如果 片偏移 ≠ 0,说明它一定不是第一个分片,已经处于分片状态
  • 如果 MF = 1,说明后面还有分片,也说明发生了分片

也就是说,只要出现下面任一种情况,通常都可以认定“和分片有关”:

  • 片偏移 ≠ 0
  • MF = 1

如果还要进一步判断它是第几个分片,可以这样理解:

  • 片偏移 = 0MF = 1:第一个分片
  • 片偏移 ≠ 0MF = 1:中间分片
  • 片偏移 ≠ 0MF = 0:最后一个分片

这是很典型的 408 考法。

七、遇到 MTU 题,固定按一个流程走

只要题目里出现了 MTU,基本就是在考“路由器是否需要分片,以及能不能分片”。

这里不要发散,固定按下面的顺序判断:

先比 IP 分组总长度和 MTU 的大小。

如果:

IP 总长度 ≤ MTU

那么可以直接转发,不需要分片。

如果:

IP 总长度 > MTU

那么原则上需要分片。接着再看 DF 位:

  • DF = 0:允许分片,路由器可以分片后转发
  • DF = 1:不允许分片,路由器不能转发该分组,只能丢弃,并向源主机发送 ICMP 差错报文

这里必须注意,比较的是 IP 总长度MTU,不是 IP 数据长度,也不是链路层帧长。

八、真正做题时的完整速解流程

考试里拿到一道 IPv4 首部十六进制题,我更建议直接套下面这个做题顺序:

先看首字节,判断版本和首部长度。
再看总长度字段,得到整个 IP 分组长度。
然后用“总长度 – 首部长度”算出数据部分长度。
接着定位源 IP 和目的 IP,逐字节转十进制。
再看“标志 + 片偏移”字段,判断是否分片、是不是最后一个分片。
如果题目问偏移量,记得把片偏移字段值再乘 8,得到实际字节偏移。
如果题目出现 MTU,再把 IP 总长度和 MTU 比较,并结合 DF 判断“分片转发”还是“丢弃并发送 ICMP”。

把这个流程固定下来之后,题目哪怕给一长串十六进制,看起来再乱,本质也只是照着模板往下填空。

九、一个可以直接套用的答题模板

考试时如果想写得快一些,可以直接按这个格式组织答案:

1. 第1字节为 XX:
   - 版本 = X
   - 首部长度 = X × 4 = XXB

2. 总长度字段为 XXXX:
   - 总长度 = XXB

3. 数据部分长度:
   - 数据长度 = 总长度 - 首部长度 = XXB

4. 源IP地址:
   - XX.XX.XX.XX

5. 目的IP地址:
   - XX.XX.XX.XX

6. 标志 + 片偏移字段为 XXXX:
   - DF = X
   - MF = X
   - 片偏移字段值 = XX
   - 实际字节偏移量 = XX × 8 = XXB

7. 若涉及 MTU:
   - 若总长度 > MTU,且 DF=0,则分片转发
   - 若总长度 > MTU,且 DF=1,则丢弃并发送 ICMP 差错报文

这个模板的好处在于,它把常考点全部串起来了。题目无论怎么变,核心都绕不开这几个字段。

十、最后把最容易错的点再压一遍

复习这类题时,我通常会反复提醒自己三件事。

第一,首部长度的单位是“4B”,不是 1B。
首字节低 4 位如果是 5,表示的是 5 个 32 位字,所以要乘 4 才得到字节数。

第二,片偏移字段的单位是“8B”,不是 1B。
字段值和真实字节偏移量不是同一个东西。

第三,MTU 比较的是 IP 总长度,而不是数据长度。
这个地方一混,后面整题就容易错。

如果把这三个单位问题压住,这类题大多数时候都能做对。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇