IPv4 地址只有 32 位,理论上限约 43 亿个,再叠加早期按类(A/B/C)分配的巨大浪费,实际可用量远小于此。2011 年 IANA 分完全球最后一个 /8 地址块,此后各区域互联网注册局(RIR)陆续宣告耗尽。NAT、CIDR、地址回收只是「延寿」手段——NAT 还破坏了端到端可达性,给排障、溯源与对等通信带来长期成本。IPv6(IP version 6)把地址一举扩展到 128 位(约 3.4×10³⁸ 个),从根本上解除地址短缺,并借机重新设计了首部结构与选项机制。
两份文档分工明确:8200 回答「报文长什么样、怎么转发」,4291 回答「地址长什么样、怎么分配」。周边机制另有专文承载:ICMPv6 差错与控制消息(RFC 4443)、邻居发现 NDP(RFC 4861,替代 ARP)、无状态地址自动配置 SLAAC(RFC 4862)。
| 变化 | 一句话说明 |
|---|---|
| 128 位地址 | 地址空间从 2³² 扩到 2¹²⁸,NAT 不再是必需品,端到端寻址回归。 |
| 40 字节定长基本首部 | 取消 IHL 字段与对齐填充,路由器解析首部更快、硬件转发更简单。 |
| 无首部校验和 | 差错检测交给链路层 CRC 与上层强制校验和,路由器不再逐跳重算。 |
| 选项变扩展首部链 | 选项移出基本首部,用 Next Header 字段串成链;除逐跳选项外,途中节点一概不处理。 |
| 路由器不再分片 | 分片只能由源节点进行;路由器遇超大报文只回 ICMPv6 Packet Too Big,由源端处理。 |
IPv6 基本首部固定 40 字节 = 10 个 32 位字,其后紧跟载荷(扩展首部 + 上层数据)。下图为交互式首部结构图(与 RFC 8200 §3 的图一致,地址部分按每行 32 位展开):把鼠标悬停在任意字段上即可在下方说明栏查看该字段的详细解释;单击字段可以「钉住」当前说明,方便滚动阅读,再次单击取消。
对照 IPv4 首部,以下字段在 IPv6 基本首部中不复存在——每一处删减都有明确理由:
| IPv4 字段 | IPv4 的做法 | IPv6 的处理与理由 |
|---|---|---|
| IHL 首部长度 | 首部可变长 20–60 字节,需字段声明 | 首部固定 40 字节,字段取消,对齐填充(Padding)随之消失。 |
| Total Length | 总长含首部 | 改为 Payload Length,不计基本首部——首部长度固定,无须声明。 |
| Identification / Flags / Fragment Offset | 常驻基本首部,沿途路由器可分片 | 分片只允许源节点进行,相关字段移入分片扩展首部(第 4 节),不分片的报文一个字节都不带。 |
| Header Checksum | 每跳重算一次首部校验和 | 取消:链路层普遍自带 CRC(如以太网 FCS),传输层校验和又是强制的,重复检测浪费路由器性能;Hop Limit 递减也杜绝了报文无限循环。 |
| Options | 塞在基本首部内(≤40 字节),每个节点都得解析 | 移出基本首部,组成扩展首部链(第 3 节);除逐跳选项外途中节点不处理,转发路径上完全透明。 |
| 字段 | 位数 | 要点 |
|---|---|---|
| Version | 4 | 恒为 6(0110);与 IPv4 版本字段同位置,便于解析器区分。 |
| Traffic Class | 8 | ≈IPv4 ToS 字节;高 6 位 DSCP + 低 2 位 ECN;途中可被重写。 |
| Flow Label | 20 | 标记一条「流」,供 ECMP / 快速转发;用法见 RFC 6437,0 = 未标记。 |
| Payload Length | 16 | 基本首部之后的字节数,含扩展首部;上限 65535,超出用 Jumbo 选项(RFC 2675)。 |
| Next Header | 8 | 下一首部类型;值表同 IPv4 Protocol;兼作扩展首部链指针;59 = 链尾。 |
| Hop Limit | 8 | 每跳 −1,到 0 丢弃并回 ICMPv6 Time Exceeded;即 IPv4 TTL 的更名。 |
| Source Address | 128 | 发送方地址(RFC 4291,见第 5 节);不得为组播地址。 |
| Destination Address | 128 | 预期接收方;存在路由首部时可能不是最终目的。 |
IPv4 把选项硬塞进基本首部,每个路由器都不得不解析。IPv6 把可选信息全部移出,编为若干扩展首部,用各级 Next Header 字段串成一条链:基本首部 → 扩展首部 → … → 上层首部。除逐跳选项首部外,沿途任何节点都不处理、不增删扩展首部,只有目的地址所指节点才逐一处理(8200 §4,相对 2460 明确澄清)。下图是一条典型链(带路由与分片首部),悬停各节点查看说明。
| 值 | 扩展首部 | 谁处理它 | 要点 |
|---|---|---|---|
0 | 逐跳选项 Hop-by-Hop Options | 路径上每个节点 | 必须紧跟基本首部;Jumbo / Router Alert 选项放这里。 |
60 | 目的选项 Destination Options | 仅目的节点 | 可出现两处:路由首部前 / 上层首部前。 |
43 | 路由 Routing | 首部列出的中间节点 | 类型化源路由;SRv6 的 SRH 即 Type 4。 |
44 | 分片 Fragment | 仅目的节点 | 固定 8 字节;Offset + M + Identification,详见第 4 节。 |
51 | 认证首部 AH | 目的节点 | IPsec 完整性 / 源认证(RFC 4302)。 |
50 | 封装安全载荷 ESP | 目的节点 | IPsec 加密 + 完整性(RFC 4303)。 |
135 | 移动性 Mobility | 目的节点 | 移动 IPv6 信令(RFC 6275)。 |
59 | (无下一首部) | — | 标记链尾:其后无内容。 |
同一报文携带多个扩展首部时,RFC 8200 推荐按如下顺序排列:
逐跳选项与目的选项两个首部内部承载的是一串 TLV 编码的选项:Option Type(1 字节)+ Opt Data Len(1 字节)+ Option Data。每个扩展首部的总长必须是 8 字节的整数倍(用 Pad1 / PadN 选项填充对齐)。Option Type 字节的最高两位编码了「遇到不认识的选项如何处理」——这是 IPv6 可扩展性的关键设计:
| 最高两位 | 处理动作 |
|---|---|
00 | 跳过本选项,继续处理后续选项。 |
01 | 丢弃报文,不通知源。 |
10 | 丢弃报文,并向源回 ICMPv6 参数问题(Parameter Problem,指向未识别的选项)——目的为组播地址时不回。 |
11 | 丢弃报文,并回 ICMPv6 参数问题——即便目的地址是组播也回。 |
Option Type 的第 3 高位则声明该选项数据在传输途中是否允许改变(供 AH 计算认证值时决定是否将其按零处理)。
与 IPv4 的本质区别:IPv6 中只有源节点能分片,路由器永远不分片。路由器遇到超过出接口 MTU 的报文,只做一件事——丢弃并回 ICMPv6 Packet Too Big(Type 2),让源端降尺寸或自行分片。分片首部仅当源端执行分片时才出现,固定 8 字节(悬停各字段查看说明):
128 位地址写成 8 组、每组 16 位的十六进制数,组间以冒号分隔。三条书写规则:① 每组内前导零可省略(每组至少保留一位数字);② 连续的一段全零组可用 :: 压缩,但一个地址中只能出现一次(否则无法还原零组数量);③ 混编环境下,最低 32 位可用点分十进制 IPv4 写法(x:x:x:x:x:x:d.d.d.d)。前缀记法为「地址 / 前缀长度」(§2.3)。悬停下表各行查看说明:
| 写法 | 正误 | 说明 |
|---|---|---|
2001:0db8:0000:0000:0008:0800:200c:417a | ✔ 合法 | 首选形式的全写版,每组 4 位十六进制。 |
2001:db8::8:800:200c:417a | ✔ 合法 | 同一地址的压缩形式。 |
::1 :: | ✔ 合法 | 回环地址 / 未指定地址。 |
fe80::1 | ✔ 合法 | 链路本地地址(见 5.2)。 |
2001:db8::1::9 | ✘ 非法 | :: 只能用一次,否则有歧义。 |
::ffff:192.0.2.1 | ✔ 合法 | IPv4-mapped 地址的规范写法。 |
2001:db8::/32 | ✔ 前缀 | 前缀记法;文档示例专用段。 |
地址类型由高位前缀识别。RFC 4291 把地址分为单播(Unicast)、组播(Multicast)、任播(Anycast)三类——IPv6 没有广播,一对多一律用组播;任播地址从单播空间分配,语法上与单播不可区分。
| 类型 | 前缀 | 要点 |
|---|---|---|
| 全球单播 GUA | 2000::/3 | 公网地址,≈IPv4 公网单播;典型 /64 划分。 |
| 链路本地 LLA | fe80::/10 | 仅本链路有效、不可路由;NDP 全靠它。 |
| 唯一本地 ULA | fc00::/7 | ≈IPv4 私网;40 位随机 Global ID(fd00::/8)。 |
| 回环 | ::1/128 | ≈127.0.0.1;不出本机。 |
| 未指定 | ::/128 | 「无地址」占位;DAD / 未配置时作源。 |
| 组播 | ff00::/8 | ff + flags(4) + scope(4) + Group ID(112)。 |
| 任播 | (单播空间内) | 送「最近」成员;子网路由器任播地址必需。 |
ff02::1 = 链路范围全节点,ff02::2 = 链路范围全路由器。Solicited-Node 地址 ff02::1:ff00:0/104:前 104 位固定,低 24 位直接抄单播地址的低 24 位——例如 4037::1:800:200e:8c6c → ff02::1:ff0e:8c6c。节点必须为每个单播 / 任播地址监听对应的 Solicited-Node 组:NDP 地址解析(替代 ARP)的询问报文就发到这个组,只有目标主机需要应答,不再像 ARP 广播那样打扰全链路。单播地址 = 子网前缀(n 位)+ 接口标识 IID(128 − n 位)。RFC 4291 §2.5.1 的关键约定:除二进制 000 开头的地址外,所有单播地址的 IID 必须为 64 位,且按 Modified EUI-64 格式构造——这就是「/64 惯例」的规范来源:全球单播典型划分为 48 位全球路由前缀 + 16 位子网 ID + 64 位 IID。
SLAAC(RFC 4862)、DHCPv6 等自动配置机制均围绕 /64 设计;/64 之外的单播前缀(如点到点链路)属于特殊场景的例外用法,IID 长度约束不适用于 000 开头的保留空间。
经典的 IID 生成法:把接口 48 位 MAC 地址从中间劈开,插入 FFFE,再翻转首字节第 7 位(U/L 位,universal/local bit)——若 MAC 是全球唯一的,翻转后该位置 1,表示 IID 具有全球范围。
SLAAC 正是用「路由器通告的前缀 + Modified EUI-64 IID」自动拼出完整地址(RFC 4862)。但把 MAC 固化进地址意味着设备跨网可被长期追踪,出于隐私考虑,现代系统普遍改用随机 IID 与周期性更换的临时地址(RFC 8981,废止 RFC 4941),EUI-64 只保留在少数场景。
| 维度 | IPv4(RFC 791) | IPv6(RFC 8200 / 4291) |
|---|---|---|
| 地址长度 | 32 位(约 43 亿) | 128 位(约 3.4×10³⁸) |
| 地址记法 | 点分十进制(192.0.2.1) | 冒号分隔 8 组十六进制,可用 :: 压缩一次 |
| 首部长度 | 20–60 字节可变(IHL 字段声明) | 固定 40 字节,无长度字段、无填充 |
| 首部校验和 | 有,每跳重算 | 无——交给链路层 CRC 与上层校验和 |
| 分片位置 | 源端与沿途路由器都可分片 | 仅源节点可分片(分片扩展首部) |
| 广播 | 有(如 255.255.255.255) | 取消,一律用组播 |
| 地址解析 | ARP(二层广播询问) | NDP(ICMPv6 + Solicited-Node 组播) |
| 选项机制 | 塞在基本首部内(≤40 字节) | 扩展首部链,除逐跳选项外途中不处理 |
| 生存期字段 | TTL | Hop Limit(语义相同,正名为跳数) |
| 服务类型 | ToS 字节 | Traffic Class(DSCP + ECN,途中可重写) |
| 上层协议字段 | Protocol | Next Header(值表相同,兼作扩展首部链指针) |
| 链路最小 MTU | 68 字节 | 1280 字节(§5) |
| 地址配置方式 | 手工 / DHCP | SLAAC(无状态)+ DHCPv6(有状态)并存 |
| 术语 | 含义 |
|---|---|
IID | 接口标识(Interface Identifier):单播地址的低位部分(常规 64 位),在子网内唯一标识一个接口(§2.5.1)。 |
EUI-64 / Modified EUI-64 | IEEE 64 位扩展唯一标识;由 48 位 MAC 中间插入 FFFE 并翻转 U/L 位得到,用作 IID。 |
DAD | 重复地址检测(RFC 4862):地址启用前向对应 Solicited-Node 组播询问,确认链路上无人占用。 |
SLAAC | 无状态地址自动配置(RFC 4862):听路由器 RA 拿前缀,自行拼出 IID 即成地址,无需服务器。 |
NDP | 邻居发现协议(RFC 4861,基于 ICMPv6):替代 ARP,兼做路由器发现、前缀发现、重定向、DAD 载体。 |
SRH | Segment Routing Header(路由首部 Type 4,RFC 8754):SRv6 把转发路径编码为一串 IPv6 SID 存入其中。 |
Jumbogram | 超过 65535 字节的超大报文,用逐跳选项中的 Jumbo Payload 选项声明长度(RFC 2675),此时 Payload Length 置 0。 |
Solicited-Node 组播地址 | ff02::1:ff00:0/104:前 104 位固定 + 单播地址低 24 位;NDP 地址解析的目标组。 |
ULA | 唯一本地地址 fc00::/7(RFC 4193):≈IPv4 私网地址,含 40 位随机 Global ID,不进公网路由。 |
GUA | 全球单播地址 2000::/3:公网可路由的常规 IPv6 地址。 |
LLA | 链路本地地址 fe80::/10:仅本链路有效,接口使能 IPv6 即生成,NDP 与路由协议邻居通信依赖它。 |
Flow Label | 流标签(20 位):标记同一条流的报文序列,供 ECMP / 快速转发;用法见 RFC 6437,0 = 未标记。 |
Next Header | 下一首部(8 位):值表同 IPv4 Protocol,兼作扩展首部链的指针;59 = No Next Header。 |
Hop Limit | 跳数限制(8 位):IPv4 TTL 的更名;到 0 丢弃并回 ICMPv6 Time Exceeded。 |
PMTUD | 路径 MTU 发现(RFC 8201):靠 ICMPv6 Packet Too Big 逐级探底;v6 下因路由器不分片而更刚性。 |
任播 Anycast | 从单播空间分配、语法上不可区分的地址;路由系统把报文送达「最近」的一个成员。 |
:: 压缩 | 文本写法中把一段连续全零组压缩为 ::;一个地址中只能使用一次(§2.2)。 |
| 编号 | 内容 |
|---|---|
| RFC 8200 | Internet Protocol, Version 6 (IPv6) Specification,STD 86,2017-07。本文的主要依据(§3 报文格式、§4 扩展首部、§4.5 分片、§5 MTU);废止 RFC 2460。 |
| RFC 4291 | IP Version 6 Addressing Architecture,2006-02。第 5 节的依据(文本表示、地址类型、EUI-64);废止 RFC 3513。 |
| RFC 4443 | ICMPv6:差错与控制消息(Packet Too Big、Time Exceeded 等),NDP 的承载协议。 |
| RFC 4861 | Neighbor Discovery for IP Version 6(NDP):替代 ARP 的邻居发现。 |
| RFC 4862 | IPv6 Stateless Address Autoconfiguration(SLAAC 与 DAD)。 |
| RFC 4193 | Unique Local IPv6 Unicast Addresses:ULA(fc00::/7)的定义与随机 Global ID。 |
| RFC 8201 | Path MTU Discovery for IP version 6:基于 Packet Too Big 的 PMTUD 流程。 |
| RFC 8754 | IPv6 Segment Routing Header(SRH):SRv6 的数据面首部。 |
| RFC 8981 | Temporary Address Extensions for SLAAC:隐私临时地址;废止 RFC 4941。 |
| RFC 2675 | IPv6 Jumbograms:逐跳选项中的 Jumbo Payload 选项。 |
| RFC 6437 | IPv6 Flow Label Specification:流标签的具体使用规则(8200 §6 指向本文档)。 |