IPv6 不只是「地址从 32 位变 128 位」,首部、地址类型、配置方式全都改了。 一句话概括:地址变长、首部变短、广播取消、配置自动化。
4.6.1 讲了动机,这一节讲改动的结果。 4.7 和 4.8 会把两版首部逐字段对比,这里先给全景。
一、地址从 32 位到 128 位
位数翻了四倍,容量翻了 2 的 96 次方倍。 这个「翻倍」不是线性的,是把「不够用」直接变成了「用不完」。
| 项 | IPv4 | IPv6 |
|---|---|---|
| 位数 | 32 | 128 |
| 总数 | 42.9 亿 | 3.4e38 |
| 写法 | 点分十进制 | 八组十六进制 |
第三行那个「3.4e38」没法直观理解,换个说法: 地球表面积约 5.1 亿平方公里,平均每平方米能分到 6.7e23 个 IPv6 地址。 所以「地址够不够」这个问题,在 IPv6 里已经不存在了。
二、首部变短、变固定
IPv4 首部 20 字节但可变长(有选项);IPv6 首部固定 40 字节。 「固定」这两个字对硬件转发是巨大的便利:不用先算「首部多长」才能找到后面的字段。
| 项 | IPv4 | IPv6 |
|---|---|---|
| 首部长度 | 20~60 字节 | 固定 40 字节 |
| 字段数 | 13 个 | 8 个 |
| 首部校验和 | 有 | 取消 |
| 选项 | 首部内 | 改成扩展首部 |
第三行「取消校验和」是最有争议的一条: 支持者的理由是「链路层有 CRC、传输层有校验,中间这层是重复劳动」; 反对者的理由是「没有校验,坏包可能被转得更远」。 实际结果:跑得确实更快,可靠性靠上下两层兜住。
三、扩展首部:需要才带
IPv4 的选项字段放在首部里,导致「每个包都要为可能用不到的选项买单」。 IPv6 改成「扩展首部链」:需要分片就带分片首部,需要路由就带路由首部,不用就不带。
| 扩展首部 | 干什么 | 谁处理 |
|---|---|---|
| 逐跳选项 | 沿途每台都要看的信息 | 每台路由器 |
| 路由 | 指定经过哪些节点 | 列出的节点 |
| 分片 | 只在源端分片时出现 | 终点 |
| 目的选项 | 只给终点看的信息 | 终点 |
第一行是唯一「每台路由器都要处理」的扩展首部, 所以规范建议「尽量别用」——一旦用了,沿途设备就得从「只看 40 字节」变成「往后再翻一层」。 「链」这个字要理解: 每个扩展首部都有「下一个首部」字段,一层层串起来,最后才指向 TCP 或 UDP。
四、取消广播,改用多播
IPv4 有广播(255.255.255.255 和网段广播),IPv6 一个都没有。 原因很简单:广播让「不关心的人也要处理」,在几亿台设备的网络里这是纯浪费。 IPv6 用多播代替:「所有节点」是一个多播组(ff02::1),「所有路由器」是另一个(ff02::2)。 只关心的人加入组,不关心的根本不收。
| 用途 | IPv4 怎么做 | IPv6 怎么做 |
|---|---|---|
| 找邻居 | ARP 广播 | NDP 多播 |
| 找路由器 | 广播/手工配 | 多播请求 |
| 找 DHCP | 广播 | 多播到固定组 |
三行都体现同一个思路:把「喊给所有人」换成「喊给相关的人」。 这也是为什么 IPv6 在无线网络里更省电——手机不用被无关的广播叫醒。
五、地址自动配置
SLAAC 是 IPv6 的标配能力: 路由器定期多播「我这儿的前缀是 2001:db8:1:2::/64」,主机拿前缀加自己的接口标识,地址就有了。 这套机制还顺带给了默认路由:通告前缀的那台路由器,就是默认网关。 所以「插上网线就能上网」在 IPv6 里是协议自带的能力,不是 DHCP 的功劳。 但 SLAAC 不能下发 DNS 服务器(早期), 所以实际部署常是「SLAAC + DHCPv6 只发 DNS」的混合模式。 这也是 IPv6 部署里最容易踩的一个坑。
六、动手 Demo:IPv6 的首部,去掉六个、添了一个
把 IPv4 的 13 个字段逐个对照 IPv6,看哪些删了、哪些改名、哪些扩长。 注意「删除」的那六个,它们没有消失,只是挪到了扩展首部。
v4 = ['版本', '首部长度', '区分服务', '总长度', '标识',
'标志', '片偏移', '生存时间', '协议', '首部校验和',
'源地址', '目的地址', '可选字段']
v6 = ['版本', '流量类别', '流标签', '有效载荷长度',
'下一个首部', '跳数限制', '源地址', '目的地址']
print(len(v4), len(v6))
实跑输出:
--------------------------------------------------------------------
IPv6 的首部,去掉六个、添了一个
--------------------------------------------------------------------
**IPv6 不是「把地址加长」**,**而是把首部重新设计了一遍**:
**字段从 13 个减到 8 个,长度从 20 字节变成固定的 40 字节。**
IPv4 字段 长度 IPv6 里怎么处理
----------------------------------------------------------
版本 4 位 保留
首部长度 4 位 **删除**(固定 40)
区分服务 8 位 改成「流量类别」
总长度 16 位 改成「有效载荷长度」
标识 16 位 **删除**(挪到分片扩展首部)
标志 3 位 **删除**(同上)
片偏移 13 位 **删除**(同上)
生存时间 8 位 改成「跳数限制」
协议 8 位 改成「下一个首部」
首部校验和 16 位 **删除**
源地址 32 位 扩到 128 位
目的地址 32 位 扩到 128 位
可选字段 0~40 字节 **删除**(改成扩展首部)
**「删除」的有六个:首部长度、标识、标志、片偏移、首部校验和、可选字段。**
**13 减 6 剩 7,再加一个全新的「流标签」,正好是 8 个。**
**它们不是消失了,是「挪到需要时才带」**——**分片信息进了扩展首部,可选字段也进了扩展首部。**
**「首部校验和」被删是最值得说的一条**:
**IPv4 每个路由器都要重算一次(因为 TTL 变了),IPv6 干脆不算了。**
**那可靠性靠谁?靠上下两层**:
**链路层有 CRC,传输层有 TCP 校验和**——**中间这一层的校验,本来就是重复劳动。**
**结果是一个「定长 40 字节」的首部**:
**路由器不用再算「首部有多长」,按固定偏移取字段就行**——**这是硬件转发喜欢的形状。**
13 和 8 这两个数就是「简化」的全部证据: 平均每个字段的处理时间虽然很短,但乘上「每秒几亿个包」就很可观。 第一行被删的「首部长度」值得单独说: IPv4 里它是 4 位,最多表示 15 个 32 位字,也就是 60 字节。 IPv6 固定 40,这个字段就没了用武之地。 省下的不只是 4 位,是「每个包都要做一次乘 4 再算偏移」的动作。 「流标签」是唯一新增的字段: 它的用途是「给同一股流打同一个标」,让中间设备不用五元组也能识别。 但现实中用得很少——因为大部分设备还是按五元组分流,流标签的生态一直没起来。
30 秒实验
- 算一下:IPv6 地址总数是 IPv4 的多少倍?(提示:2 的 96 次方)
- 想一下:为什么「首部固定 40 字节」对硬件转发有帮助?
- 想一下:取消广播之后,「找网关」这件事怎么做?
常见误区
- 以为「IPv6 只是地址变长」。 首部、地址类型、配置方式都改了,是一次重新设计。
- 以为「IPv6 有广播」。 没有广播,全部换成多播。
- 以为「SLAAC 能下发一切」。 早期不能下发 DNS,常要配 DHCPv6 补充。
自测三问(点开对答案)
1. IPv6 首部固定多少字节?有几个字段? —— **40 字节,8 个字段**,长度不可变。 2. IPv6 为什么取消首部校验和? —— **因为链路层有 CRC、传输层有校验,中间这层是重复劳动**,取消后路由器不用每跳重算。 3. SLAAC 是什么? —— **主机根据路由器通告的前缀自己拼出地址**,不需要 DHCP 服务器。下一节学怎么写一个 IPv6 地址:八组十六进制和两条省略规则。
- ☐ (本节完,下一节 4.6.3 IPv6中IP地址的标记方法)