Chapter 4-2:IP、编址、分片、NAT 与 IPv6 的网络层逻辑

Chapter 4-2:IP、编址、分片、NAT 与 IPv6 的网络层逻辑

Chapter 4-2 的主线是网络层中的 IP 协议本身。上一节 Chapter 4-1 更关注数据平面的整体结构:路由器如何查表、如何通过交换结构搬运分组、如何排队和调度。本节则进入更具体的问题:IP 数据报长什么样,为什么会被分片,IP 地址到底分配给谁,子网和 CIDR 如何组织地址空间,主机如何自动获得网络配置,NAT 如何缓解 IPv4 地址不足,以及 IPv6 为什么要重新设计地址和头部格式。

这一节的核心不是背字段名,而是理解一条机制链:

1
2
3
4
5
6
7
8
9
10
11
12
13
传输层 segment

封装为 IP datagram

放入链路层 frame

受 MTU 限制,必要时分片

根据目标 IP 和转发表逐跳转发

通过子网、CIDR、路由聚合减少地址和路由管理成本

借助 DHCP、NAT、IPv6 处理配置和地址规模问题

❗ 本节核心结论: IP 地址体系的核心不是“给机器编号”,而是“给接口编号,并用前缀、掩码和路由表项把接口组织成可转发、可聚合、可扩展的网络结构”。

1. IP 数据报:网络层传输的基本单位

IP 数据报是网络层传输的基本单位。传输层把 TCP segment 或 UDP segment 交给网络层后,网络层会在外面加上 IP 头部,形成 IP datagram。

一个典型封装关系是:

1
2
3
4
IP datagram
├── IP header
└── payload
└── TCP segment / UDP segment

其中,IP 头部保存网络层转发和控制所需的信息,例如:

  • 源 IP 地址;
  • 目的 IP 地址;
  • 版本号;
  • 头部长度;
  • 数据报总长度;
  • TTL;
  • 上层协议字段;
  • 首部校验和;
  • 分片相关字段;
  • 可选项。

这些字段不是装饰,而是为了让网络层能够回答几个关键问题:

问题 对应字段
这个数据报从哪里来? 源 IP 地址
这个数据报要到哪里去? 目的 IP 地址
这个数据报还能在网络中存在多久? TTL
到达目的主机后交给 TCP 还是 UDP? upper-layer protocol
这个数据报是否被分片? identifier、flags、fragment offset
IP 头部在传输中是否出错? header checksum

1.1 payload 长度是什么

payload 指的是某一层协议真正承载的“上层数据”。

对 IP 层来说:

1
IP 数据报总长度 = IP header 长度 + IP payload 长度

例如,一个 IPv4 数据报总长度是 4000 字节,IP 头部是 20 字节,那么:

1
IP payload 长度 = 4000 - 20 = 3980 字节

这 3980 字节通常装的是 TCP segment 或 UDP segment。

注意,payload 是相对概念。站在不同层看,payload 的含义不同:

所在层 header payload
链路层 frame header IP datagram
网络层 IP header TCP/UDP segment
传输层 TCP/UDP header 应用层数据

所以,不能笼统说“payload 就是用户数据”。更准确地说,payload 是当前层承载的上层内容。


❗ 本节核心结论: IP 数据报由 IP 头部和 IP payload 组成;总长度包含头部和数据部分,payload 长度只指 IP 头部后面承载的上层内容。

2. frame、hop 与 MTU:IP 数据报如何穿过链路

学习 IP 分片之前,必须先分清三个概念:frame、hop 和 MTU。

2.1 frame 不是视频帧

这里的 frame 是数据链路层的帧,不是视频帧率或游戏帧数里的“帧”。

链路层 frame 是一跳链路上的传输单位。它大致可以理解为:

1
2
3
4
链路层 frame
├── 链路层头部
├── IP datagram
└── 链路层尾部

IP 数据报不能直接在物理链路上裸奔,它要被封装进链路层 frame 里,再通过以太网、Wi-Fi 或其他链路发送。

2.2 hop 是一跳,不是一个完整端到端路径

hop 可以理解为从一个网络层设备到下一个网络层设备之间的一段转发。

例如:

1
主机 A → 路由器 R1 → 路由器 R2 → 主机 B

这条路径中:

  • 主机 A 到 R1 是一跳;
  • R1 到 R2 是一跳;
  • R2 到主机 B 是一跳。

每经过一个路由器,通常就多走了一跳。TTL 每经过一个路由器减 1,正是为了避免数据报在网络中无限循环。

2.3 MTU 是链路层限制,却会影响 IP 层

MTU 是 Maximum Transmission Unit,最大传输单元。它表示某条链路的链路层 frame 最多能承载多大的网络层数据。

重点是:MTU 是链路层约束,但它限制的是能放进 frame 里的 IP 数据报大小。

例如,以太网常见 MTU 是 1500 字节。这意味着一个链路层 frame 最多能携带 1500 字节的 IP 数据报。如果 IP 数据报大于 1500 字节,就无法完整放进这一跳的 frame 中,IPv4 下可能需要分片。

这张图说明:IP 数据报的大小必须服从下一跳链路的 MTU 限制。


❗ 本节核心结论: frame 是链路层传输单位,hop 是逐跳路径单位,MTU 是链路层对可承载 IP 数据报大小的限制。

3. IPv4 分片与重组:当数据报太大时怎么办

互联网由不同链路组成,不同链路的 MTU 可能不同。源主机发出的 IP 数据报,在某一跳可能遇到较小 MTU,无法完整放进链路层 frame。这时 IPv4 可以进行分片。

3.1 分片的基本思想

假设一个 IPv4 数据报总长度为 4000 字节,其中 IP 头部 20 字节,payload 3980 字节。它要经过一条 MTU 为 1500 字节的链路。

每个分片本身都要有自己的 IP 头部。因此,每片最多能携带的 payload 不是 1500 字节,而是:

1
1500 - 20 = 1480 字节

所以原来的 3980 字节 payload 需要被拆成:

1
1480 + 1480 + 1020

每个分片都会成为一个新的 IP 数据报:

1
2
3
分片 1:20 字节 IP 头部 + 1480 字节数据
分片 2:20 字节 IP 头部 + 1480 字节数据
分片 3:20 字节 IP 头部 + 1020 字节数据

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

IPv4 的 fragment offset 字段不是直接记录字节偏移,而是以 8 字节为单位记录偏移。

例如:

分片 数据范围 字节偏移 fragment offset
第 1 片 0 ~ 1479 0 0
第 2 片 1480 ~ 2959 1480 185
第 3 片 2960 ~ 3979 2960 370

因为:

1
2
1480 / 8 = 185
2960 / 8 = 370

这也是为什么除最后一片外,每个分片的数据长度通常要是 8 字节的整数倍。否则后续分片的 offset 无法准确表达。

3.3 为什么不在每个路由器重组

IPv4 分片通常在最终目的主机重组,而不是每经过一个路由器就重组。原因很直接:

  • 路由器要高速转发,不能为了重组等待所有分片;
  • 不同分片可能走不同路径;
  • 中间重组会增加路由器状态和缓存压力;
  • 重组后下一跳可能又遇到更小 MTU,还要再次分片。

因此,中间路由器可以分片,但不负责把分片重新组回原始数据报。最终目的主机根据 identifier、fragment offset 和 flags 等字段完成重组。


❗ 本节核心结论: IPv4 分片是为了解决数据报超过下一跳 MTU 的问题;每个分片都有自己的 IP 头部,偏移量以 8 字节为单位,重组通常只在最终目的主机进行。

4. IP 地址属于接口,而不是简单属于主机

一个常见误解是:“IP 地址属于一台电脑。”这句话在日常表达中可以接受,但在网络层概念上不够准确。

更准确的说法是:

1
IP 地址分配给 interface

interface 是设备连接网络链路的出入口。一个设备可以有多个接口,因此也可以有多个 IP 地址。

例如:

  • 一台笔记本有 Wi-Fi 接口和以太网接口;
  • 一个路由器有多个物理端口;
  • 一台服务器可能有多块网卡;
  • 一个接口也可能配置多个 IP 地址。

所以,IP 地址不是贴在“整台设备”上的标签,而是贴在设备的某个网络接口上的标识。

4.1 interface 是哪两个层之间的接口吗

interface 不是简单指“网络层和链路层之间的软件接口”。它更像是一个设备接入某个网络链路的通信端点。

从协议栈看,一个 interface 同时具有多层含义:

层次 interface 的意义
物理层 具体的物理连接或无线收发能力
链路层 有 MAC 地址,能收发 frame
网络层 配置 IP 地址,参与 IP 转发或收发

因此,interface 不是只属于某两层之间的边界,而是一个贯穿物理层、链路层和网络层的网络出入口。


❗ 本节核心结论: IP 地址严格来说绑定在接口上;interface 是设备接入网络链路的通信端点,不只是某两层之间的抽象边界。

5. 子网:一组不经过路由器即可互相到达的接口

子网 subnet 可以理解为一组共享相同 IP 地址前缀、并且不经过路由器就可以彼此到达的接口集合。

例如:

1
2
3
主机 A:192.168.1.2/24
主机 B:192.168.1.3/24
主机 C:192.168.1.4/24

它们都属于:

1
192.168.1.0/24

在典型以太网或 Wi-Fi 局域网中,如果这些主机连在同一个二层网络里,它们可以通过链路层机制直接通信,不需要经过路由器转发。

5.1 没有路由器的局域网算不算子网

可以算。

子网的核心不是“里面必须有路由器”,而是:

  • 这些接口共享同一个网络前缀;
  • 它们在网络层上被视为同一个 IP 网络;
  • 它们之间通信不需要经过路由器。

局域网 LAN 和子网 subnet 关注角度不同:

概念 关注点 典型问题
LAN 链路层/物理连接 这些设备怎么连在一起?
subnet 网络层地址结构 这些接口是否属于同一个 IP 前缀?

二者经常重合,但不是同一个概念。一个 LAN 可以承载一个子网,也可以通过 VLAN 等方式承载多个逻辑子网;一个子网通常对应一个二层广播域,但具体实现可以更复杂。


❗ 本节核心结论: 子网是网络层地址概念,LAN 是链路层或物理组织概念;没有路由器的局域网也可以构成一个子网。

6. 子网号与子网掩码:一个是结果,一个是规则

子网号和子网掩码经常一起出现,但它们不是一回事。

6.1 子网号是什么

子网号是一个子网的网络地址,用来代表整个子网。

例如:

1
192.168.1.0/24

其中:

1
192.168.1.0

就是这个子网的子网号或网络地址。

它表示:这是 192.168.1.x 这一段网络,而不是某一台具体主机。

6.2 子网掩码是什么

子网掩码是用来区分 IP 地址中“网络部分”和“主机部分”的规则。

例如:

1
255.255.255.0

等价于:

1
/24

意思是:前 24 bit 是网络部分,后 8 bit 是主机部分。

6.3 二者的关系

给定:

1
2
IP 地址:192.168.1.37
子网掩码:255.255.255.0

把 IP 地址和子网掩码做按位与:

1
192.168.1.37 & 255.255.255.0 = 192.168.1.0

得到的结果就是子网号。

所以可以这样区分:

概念 含义 例子
IP 地址 某个接口的地址 192.168.1.37
子网掩码 划分网络部分和主机部分的规则 255.255.255.0
前缀长度 掩码的简写形式 /24
子网号 根据掩码算出的网络地址 192.168.1.0

❗ 本节核心结论: 子网掩码是切分规则,子网号是按规则计算出的网络地址;/24255.255.255.0 表达的是同一种前缀长度。

7. CIDR:从固定分类到灵活前缀

早期 IPv4 地址采用 classful addressing,即按 A、B、C 类固定划分网络规模。

大致可以理解为:

类别 网络部分 可容纳主机规模 问题
A 类 很短 很大 对多数组织过大
B 类 中等 仍然很大 容易浪费
C 类 较长 较小 对很多组织又太小

这种方式的问题是“档位太粗”。

如果一个组织需要 2000 个地址:

  • 一个 C 类地址不够;
  • 一个 B 类地址又太大;
  • 分配 B 类会浪费大量地址。

这就是传统分类地址容易浪费的根本原因。

7.1 classless 怎么理解

classless 的意思是:不再强制按照 A/B/C 类的固定边界划分地址,而是用任意长度的前缀表示网络范围。

CIDR 写法是:

1
a.b.c.d/x

其中 x 表示前多少 bit 是网络前缀。

例如:

1
200.23.16.0/23

表示前 23 bit 是网络部分,剩下 9 bit 是主机部分。这个网络可以容纳的地址数量大约是:

1
2^(32 - 23) = 512

相比固定 A/B/C 类,CIDR 可以更接近实际需求分配地址块。

7.2 CIDR 与路由聚合

CIDR 不只减少地址浪费,还支持路由聚合。

例如,某 ISP 拥有:

1
200.23.16.0/20

它可以把这块地址切成多个更小的 /23 分给不同组织:

1
2
3
4
200.23.16.0/23
200.23.18.0/23
200.23.20.0/23
...

对外通告时,ISP 不一定要把每个小块都通告出去,而可以说:

1
凡是 200.23.16.0/20 这一大块地址,都交给我。

这就是路由聚合 route aggregation。

这张图说明:CIDR 既能灵活分配地址,也能把多个连续地址块聚合成较少的路由表项。

7.3 more specific route

路由聚合不是无脑越粗越好。如果某个组织虽然地址属于某个 ISP 的聚合范围,但实际接入了另一个 ISP,就可能需要更具体的路由项。

例如:

1
2
200.23.16.0/20 → ISP A
200.23.18.0/23 → ISP B

当目标地址落在 200.23.18.0/23 中时,/23/20 更具体,应优先匹配 /23。这和最长前缀匹配是一致的。


❗ 本节核心结论: CIDR 的 classless 思想是取消 A/B/C 固定分类,用任意长度前缀灵活分配地址;它同时支持路由聚合,减少全网路由表规模。

8. DHCP:主机接入网络时需要的不只是 IP 地址

DHCP 是 Dynamic Host Configuration Protocol,动态主机配置协议。它的作用不是简单“发一个 IP 地址”,而是给主机一整套联网配置。

典型 DHCP 过程可以概括为 DORA:

1
Discover → Offer → Request → ACK

也就是:

  1. 客户端广播 Discover:有没有 DHCP 服务器?
  2. 服务器返回 Offer:可以给你这个配置。
  3. 客户端发送 Request:我想使用这个配置。
  4. 服务器发送 ACK:确认租约生效。

8.1 为什么 DHCP 要返回这么多东西

DHCP 通常会返回:

  • IP 地址;
  • 子网掩码;
  • 默认网关,也就是第一跳路由器地址;
  • DNS 服务器地址;
  • 地址租约时间。

因为主机接入网络后,不只是需要知道“我是谁”,还需要知道“怎么通信”。

配置项 解决的问题
IP 地址 我在这个网络中的地址是什么?
子网掩码 哪些目标和我在同一个子网?
默认网关 不在本子网的目标应该交给谁?
DNS 服务器 域名应该找谁解析成 IP?
租约时间 这个地址我能用多久?

如果只有 IP 地址,没有子网掩码,主机不知道哪些地址可以直接发 ARP 找对方,哪些地址要交给默认网关。

如果没有默认网关,主机只能和本子网通信,无法访问外部网络。

如果没有 DNS,主机可以访问 IP 地址,但无法正常使用域名访问网站。


❗ 本节核心结论: DHCP 提供的是完整网络配置,不只是 IP 地址;主机需要 IP、掩码、默认网关和 DNS 才能真正接入网络。

9. 路由表项:匹配条件加转发动作

路由表项可以理解为路由器或主机中的一条转发规则。

它通常包含:

  • 目标网络前缀;
  • 子网掩码或前缀长度;
  • 下一跳地址;
  • 输出接口;
  • 度量值或优先级等附加信息。

例如:

1
2
3
目的网络:200.23.16.0/20
下一跳:IPx
输出接口:wan0

含义是:

1
凡是目标地址落在 200.23.16.0/20 这一范围内的数据报,都交给下一跳 IPx,并从 wan0 发出去。

9.1 为什么减少路由表项是好事

路由器要对大量数据报做高速转发。每来一个 IP 数据报,它都需要:

  1. 读取目标 IP 地址;
  2. 查转发表;
  3. 找到匹配项;
  4. 决定输出接口;
  5. 转发。

如果路由表项特别多,会带来多方面成本:

问题 影响
存储开销变大 路由器要维护更大的表
查表更复杂 数据平面压力增大
路由更新更多 控制平面传播和计算成本更高
收敛更慢 网络变化后恢复稳定更困难
可扩展性变差 全球互联网规模下难以承受

CIDR 和路由聚合的价值就在这里。它们允许用一个较大的前缀代表一批更小的网络。

例如,原本需要记录:

1
2
3
4
5
200.23.16.0/23
200.23.18.0/23
200.23.20.0/23
...
200.23.30.0/23

聚合后可以记录成:

1
200.23.16.0/20

这样就显著减少了表项数量。

但减少表项不是绝对目标。遇到特殊路径需求时,仍然需要更具体的路由项。网络系统的真实目标是:在正确转发的前提下尽量提高可扩展性。


❗ 本节核心结论: 路由表项是“匹配条件 + 转发动作”;减少表项可以降低存储、查表、更新和收敛成本,但更具体路由在特殊情况下仍然必要。

10. NAT:IPv4 地址不足下的地址复用机制

NAT 是 Network Address Translation,网络地址转换。它的典型场景是:内网中大量设备使用私有地址,对外共享一个或少数几个公网 IP 地址。

例如家庭网络中:

1
2
3
手机:192.168.1.2
电脑:192.168.1.3
平板:192.168.1.4

它们访问互联网时,外部看到的可能都是同一个公网 IP。

10.1 NAT 如何区分不同内网主机

NAT 不只是改 IP 地址,通常还会改端口号。

例如:

内网连接 NAT 后公网连接
192.168.1.2:5001 → 8.8.8.8:443 203.0.113.5:62001 → 8.8.8.8:443
192.168.1.3:5001 → 8.8.8.8:443 203.0.113.5:62002 → 8.8.8.8:443

NAT 设备维护一张转换表:

1
公网 IP:公网端口 ↔ 内网 IP:内网端口

当外部响应回来时,NAT 根据目的端口查表,把数据转回对应内网主机。

10.2 NAT 的争议

NAT 解决了 IPv4 地址不足问题,但也引入了争议:

  • 它修改端口号,跨越了网络层和传输层边界;
  • 它破坏了端到端原则;
  • 外部主机通常无法直接主动连接内网主机;
  • 某些 P2P、VoIP、游戏联机等应用需要额外穿透机制;
  • 它是 IPv4 地址不足下的现实折中,而不是最干净的体系设计。

NAT 不是防火墙。它可能带来类似“外部无法直接访问内部”的效果,但其本质是地址和端口转换,而不是安全策略控制。


❗ 本节核心结论: NAT 通过地址和端口转换让多个内网设备共享公网 IP,缓解 IPv4 地址不足;但它跨层处理端口号,并削弱了端到端连接模型。

11. IPv6:不是把 IPv4 地址写长一点

IPv6 的提出,主要是为了从根本上解决 IPv4 地址空间不足,并改进 IP 头部设计。

IPv6 地址长度从 IPv4 的 32 bit 扩展到 128 bit,地址空间极大增加。但 IPv6 的变化不只是地址变长,还包括头部格式简化和功能调整。

11.1 IPv6 头部设计的关键变化

IPv6 相比 IPv4 有几个重要变化:

变化 意义
地址长度变为 128 bit 大幅扩展地址空间
固定基本头部长度 便于路由器快速处理
去掉 IPv4 header checksum 减少每跳重新计算开销
不允许路由器中途分片 简化路由器数据平面
使用扩展头部 把可选功能移出基本头部
TTL 改为 Hop Limit 语义更直接,表示最多还能经过多少跳

这些变化体现了一个方向:让路由器转发更简单、更快,把复杂性更多放到端系统或扩展机制中。

11.2 IPv6 与隧道

互联网不可能瞬间从 IPv4 切换到 IPv6,因此会出现 IPv6 和 IPv4 共存的阶段。隧道 tunneling 是一种过渡机制。

基本思想是:把 IPv6 数据报封装进 IPv4 数据报中,穿过只支持 IPv4 的网络区域,到另一端再解封装出来。

这说明 IPv6 部署不是单点替换,而是需要长期过渡机制。


❗ 本节核心结论: IPv6 不只是更长地址,而是重新设计了 IP 层的地址空间和头部处理方式;其目标包括扩大地址空间、简化路由器处理和支持逐步过渡。

12. 易混点集中整理

12.1 IP 地址不是简单属于主机

更准确地说,IP 地址属于接口。多网卡主机、路由器、多地址配置都说明了这一点。

12.2 同一个子网不只是 IP 看起来相似

同一个子网要求共享相同网络前缀,并且不经过路由器可直接到达。只是前几段数字相似并不一定说明它们处于同一个子网,必须结合子网掩码或前缀长度判断。

12.3 DHCP 不只是分配 IP

DHCP 提供完整网络配置,包括 IP、掩码、默认网关、DNS 和租约时间。只给 IP 地址,主机仍然不知道如何完整联网。

12.4 NAT 不是防火墙

NAT 的核心是地址和端口转换。它可能间接阻止外部主动访问内网主机,但这不是它的本质功能。

12.5 IPv6 不是 IPv4 地址写长一点

IPv6 同时改变了地址长度、基本头部、分片方式、校验和处理和扩展机制。它是网络层协议设计的系统性调整。

12.6 MTU 不是 IP 层字段

MTU 是链路层的最大承载限制,但会影响 IP 数据报是否需要分片。它体现了分层系统中的跨层约束:链路层能力会影响网络层行为。


❗ 本节核心结论: 本章最容易混淆的是概念边界:IP 地址绑定接口,子网依赖前缀和掩码,MTU 是链路约束但影响 IP,NAT 是地址转换而不是安全机制。

13. 复习清单

学完本节后,应能回答:

  • IP 数据报由哪两大部分组成?
  • IP payload 长度和 IP 数据报总长度有什么区别?
  • frame 是什么?它和视频帧有什么区别?
  • hop 是什么?为什么 TTL 每过一个路由器要减 1?
  • MTU 是哪一层的概念?为什么会影响 IP 分片?
  • 一个 4000 字节 IPv4 数据报经过 MTU 1500 的链路时,如何分片?
  • 分片偏移量为什么以 8 字节为单位?
  • 为什么 IP 分片通常只在最终目的主机重组?
  • 为什么说 IP 地址属于接口,而不是简单属于主机?
  • interface 在物理层、链路层和网络层分别有什么意义?
  • 没有路由器的局域网是否可以构成子网?
  • 子网号和子网掩码有什么区别?
  • /24255.255.255.0 是什么关系?
  • 传统 A/B/C 分类地址为什么容易浪费?
  • classless addressing 的核心思想是什么?
  • CIDR 如何支持路由聚合?
  • DHCP 为什么要提供 IP、掩码、默认网关和 DNS?
  • 路由表项由哪些部分组成?
  • 为什么减少路由表项有利于互联网可扩展性?
  • NAT 为什么需要修改端口号?
  • NAT 为什么会引发端到端原则争议?
  • IPv6 相比 IPv4 的关键变化有哪些?

最终总结

Chapter 4-2 的核心是 IP 协议和地址体系。IP 数据报是网络层的基本传输单位,链路层 frame 是逐跳承载它的单位,MTU 决定一个数据报是否需要被分片。IP 地址严格说绑定在 interface 上,多个接口通过相同前缀组织成 subnet,而子网掩码和 CIDR 决定如何解释这些前缀。

CIDR 的 classless 思想解决了传统固定分类地址过粗的问题,并通过路由聚合减少路由表项,提高互联网可扩展性。DHCP 解决主机自动配置问题,NAT 在 IPv4 地址不足下通过地址和端口转换实现地址复用,而 IPv6 则从地址空间和头部设计上提供更长期的解决方向。

这一章可以压缩成一句话:

1
IP 层通过数据报格式表达转发所需信息,通过接口地址和子网前缀组织网络,通过 CIDR 和路由聚合提升可扩展性,并用 DHCP、NAT、IPv6 分别解决配置、地址复用和长期地址空间问题。