IPv6 协议详解

互联网协议第 6 版(Internet Protocol, Version 6)· 依据 RFC 8200(STD 86,2017 年 7 月)与 RFC 4291(2006 年 2 月)编写
RFC 8200废止 RFC 2460RFC 4291废止 RFC 3513网络层 · 128 位地址 · 定长 40 字节首部

1.概述

1.1 为什么需要 IPv6:IPv4 地址耗尽

IPv4 地址只有 32 位,理论上限约 43 亿个,再叠加早期按类(A/B/C)分配的巨大浪费,实际可用量远小于此。2011 年 IANA 分完全球最后一个 /8 地址块,此后各区域互联网注册局(RIR)陆续宣告耗尽。NAT、CIDR、地址回收只是「延寿」手段——NAT 还破坏了端到端可达性,给排障、溯源与对等通信带来长期成本。IPv6(IP version 6)把地址一举扩展到 128 位(约 3.4×10³⁸ 个),从根本上解除地址短缺,并借机重新设计了首部结构与选项机制。

1.2 两份基石 RFC 的地位

两份文档分工明确:8200 回答「报文长什么样、怎么转发」,4291 回答「地址长什么样、怎么分配」。周边机制另有专文承载:ICMPv6 差错与控制消息(RFC 4443)、邻居发现 NDP(RFC 4861,替代 ARP)、无状态地址自动配置 SLAAC(RFC 4862)。

1.3 相对 IPv4 的五大变化(一句话总览)

变化一句话说明
128 位地址地址空间从 2³² 扩到 2¹²⁸,NAT 不再是必需品,端到端寻址回归。
40 字节定长基本首部取消 IHL 字段与对齐填充,路由器解析首部更快、硬件转发更简单。
无首部校验和差错检测交给链路层 CRC 与上层强制校验和,路由器不再逐跳重算。
选项变扩展首部链选项移出基本首部,用 Next Header 字段串成链;除逐跳选项外,途中节点一概不处理。
路由器不再分片分片只能由源节点进行;路由器遇超大报文只回 ICMPv6 Packet Too Big,由源端处理。
顺带两个「消失」:IPv6 彻底取消了广播,一对多通信一律使用组播;IPv4 的 ARP 也被基于 ICMPv6 的邻居发现协议(NDP)取代。两者都将在第 5 节地址体系中展开。

2.IPv6 报文格式(RFC 8200 §3)

IPv6 基本首部固定 40 字节 = 10 个 32 位字,其后紧跟载荷(扩展首部 + 上层数据)。下图为交互式首部结构图(与 RFC 8200 §3 的图一致,地址部分按每行 32 位展开):把鼠标悬停在任意字段上即可在下方说明栏查看该字段的详细解释;单击字段可以「钉住」当前说明,方便滚动阅读,再次单击取消。

Version4 bits · 恒 = 6
Traffic Class8 bits
Flow Label20 bits
Payload Length16 bits
Next Header8 bits
Hop Limit8 bits
源地址 Source Address(1/4)32 bits · 全局 bit 64–95
源地址 Source Address(2/4)32 bits · 全局 bit 96–127
源地址 Source Address(3/4)32 bits · 全局 bit 128–159
源地址 Source Address(4/4)32 bits · 全局 bit 160–191
目的地址 Destination Address(1/4)32 bits · 全局 bit 192–223
目的地址 Destination Address(2/4)32 bits · 全局 bit 224–255
目的地址 Destination Address(3/4)32 bits · 全局 bit 256–287
目的地址 Destination Address(4/4)32 bits · 全局 bit 288–319
载荷 Payload(扩展首部 + 上层数据)可变长 · 由 Payload Length 计
悬停查看说明 · 单击钉住 / 取消

2.1 被 IPv6 拿掉的 IPv4 字段

对照 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 节);除逐跳选项外途中节点不处理,转发路径上完全透明。

2.2 字段速查表

字段位数要点
Version4恒为 6(0110);与 IPv4 版本字段同位置,便于解析器区分。
Traffic Class8≈IPv4 ToS 字节;高 6 位 DSCP + 低 2 位 ECN;途中可被重写。
Flow Label20标记一条「流」,供 ECMP / 快速转发;用法见 RFC 6437,0 = 未标记。
Payload Length16基本首部之后的字节数,含扩展首部;上限 65535,超出用 Jumbo 选项(RFC 2675)。
Next Header8下一首部类型;值表同 IPv4 Protocol;兼作扩展首部链指针;59 = 链尾。
Hop Limit8每跳 −1,到 0 丢弃并回 ICMPv6 Time Exceeded;即 IPv4 TTL 的更名。
Source Address128发送方地址(RFC 4291,见第 5 节);不得为组播地址。
Destination Address128预期接收方;存在路由首部时可能不是最终目的。
40 字节的账:版本 4 位 + 流量类别 8 位 + 流标签 20 位 = 4 字节;载荷长度 16 位 + 下一首部 8 位 + 跳数限制 8 位 = 4 字节;源 / 目的地址各 16 字节。合计 40 字节,恰好是 8 字节的整数倍——这也是所有扩展首部统一按 8 字节对齐的原因。

3.扩展首部(RFC 8200 §4)

IPv4 把选项硬塞进基本首部,每个路由器都不得不解析。IPv6 把可选信息全部移出,编为若干扩展首部,用各级 Next Header 字段串成一条链:基本首部 → 扩展首部 → … → 上层首部。除逐跳选项首部外,沿途任何节点都不处理、不增删扩展首部,只有目的地址所指节点才逐一处理(8200 §4,相对 2460 明确澄清)。下图是一条典型链(带路由与分片首部),悬停各节点查看说明。

IPv6 基本首部Next Header = 43(路由)
路由首部(43)Next Header = 44(分片)
分片首部(44)Next Header = 6(TCP)
TCP 首部 + 数据上层协议(Next Header 6)
示例链:基本首部 → 路由 → 分片 → TCP(对应 RFC 8200 §4 的第三幅示意)

3.1 扩展首部总表(悬停行查看详情)

扩展首部谁处理它要点
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(无下一首部)标记链尾:其后无内容。
悬停行查看各首部详情 · 单击钉住

3.2 排列顺序与出现次数(RFC 8200 §4.1)

同一报文携带多个扩展首部时,RFC 8200 推荐按如下顺序排列:

基本首部 → 逐跳选项(0) → 目的选项(60,路由前) → 路由(43) → 分片(44) → AH(51) → ESP(50) → 目的选项(60,上层前) → 上层首部

3.3 选项的 TLV 格式与「不认识的选项怎么办」(§4.2)

逐跳选项与目的选项两个首部内部承载的是一串 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 计算认证值时决定是否将其按零处理)。

4.分片首部与 MTU 规则(RFC 8200 §4.5 / §5)

与 IPv4 的本质区别:IPv6 中只有源节点能分片,路由器永远不分片。路由器遇到超过出接口 MTU 的报文,只做一件事——丢弃并回 ICMPv6 Packet Too Big(Type 2),让源端降尺寸或自行分片。分片首部仅当源端执行分片时才出现,固定 8 字节(悬停各字段查看说明):

Next Header8 bits
Reserved8 bits
Fragment Offset13 bits · 单位 8 字节
Res2 bits
M1 bit
Identification32 bits
分片首部固定 8 字节 · 仅源节点分片时存在

4.1 分片的关键规则

4.2 最小 MTU 1280(§5)

设计闭环:最小 MTU 1280 + 路由器不分片 + PMTUD,三者合起来让「分片」从 IPv4 的常态机制退化为 IPv6 的罕见兜底——绝大多数流量从源头就按路径 MTU 尺寸发送,分片首部根本不会出现。

5.IPv6 地址体系(RFC 4291)

5.1 文本表示规则(§2.2)

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✔ 前缀前缀记法;文档示例专用段。
悬停行查看各写法详解 · 单击钉住

5.2 地址类型总表(§2.4,悬停行查看详情)

地址类型由高位前缀识别。RFC 4291 把地址分为单播(Unicast)、组播(Multicast)、任播(Anycast)三类——IPv6 没有广播,一对多一律用组播;任播地址从单播空间分配,语法上与单播不可区分。

类型前缀要点
全球单播 GUA2000::/3公网地址,≈IPv4 公网单播;典型 /64 划分。
链路本地 LLAfe80::/10仅本链路有效、不可路由;NDP 全靠它。
唯一本地 ULAfc00::/7≈IPv4 私网;40 位随机 Global ID(fd00::/8)。
回环::1/128≈127.0.0.1;不出本机。
未指定::/128「无地址」占位;DAD / 未配置时作源。
组播ff00::/8ff + flags(4) + scope(4) + Group ID(112)。
任播(单播空间内)送「最近」成员;子网路由器任播地址必需。
悬停行查看各类型详情 · 单击钉住
常用组播组与 Solicited-Node(§2.7.1):ff02::1 = 链路范围全节点,ff02::2 = 链路范围全路由器。Solicited-Node 地址 ff02::1:ff00:0/104:前 104 位固定,低 24 位直接抄单播地址的低 24 位——例如 4037::1:800:200e:8c6cff02::1:ff0e:8c6c。节点必须为每个单播 / 任播地址监听对应的 Solicited-Node 组:NDP 地址解析(替代 ARP)的询问报文就发到这个组,只有目标主机需要应答,不再像 ARP 广播那样打扰全链路。

5.3 单播地址结构:前缀 + 接口标识(§2.5 / §2.5.1)

单播地址 = 子网前缀(n 位)+ 接口标识 IID(128 − n 位)。RFC 4291 §2.5.1 的关键约定:除二进制 000 开头的地址外,所有单播地址的 IID 必须为 64 位,且按 Modified EUI-64 格式构造——这就是「/64 惯例」的规范来源:全球单播典型划分为 48 位全球路由前缀 + 16 位子网 ID + 64 位 IID。

│ 全球路由前缀(48 位) │ 子网 ID(16 位) │ 接口标识 IID(64 位) │ ← 典型 /64 全球单播地址(§2.5.4)

SLAAC(RFC 4862)、DHCPv6 等自动配置机制均围绕 /64 设计;/64 之外的单播前缀(如点到点链路)属于特殊场景的例外用法,IID 长度约束不适用于 000 开头的保留空间。

5.4 Modified EUI-64:从 MAC 地址生成 IID(§2.5.1 / 附录 A)

经典的 IID 生成法:把接口 48 位 MAC 地址从中间劈开,插入 FFFE,再翻转首字节第 7 位(U/L 位,universal/local bit)——若 MAC 是全球唯一的,翻转后该位置 1,表示 IID 具有全球范围。

MAC 地址(48 位): 00:1A:2B ┆ 3C:4D:5E
中间插入 FFFE: 001A:2BFF:FE3C:4D5E
翻转 U/L 位(00→02): 021A:2BFF:FE3C:4D5E ← 得到的 64 位 IID

SLAAC 正是用「路由器通告的前缀 + Modified EUI-64 IID」自动拼出完整地址(RFC 4862)。但把 MAC 固化进地址意味着设备跨网可被长期追踪,出于隐私考虑,现代系统普遍改用随机 IID 与周期性更换的临时地址(RFC 8981,废止 RFC 4941),EUI-64 只保留在少数场景。

6.IPv4 vs IPv6 对照表

维度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 字节)扩展首部链,除逐跳选项外途中不处理
生存期字段TTLHop Limit(语义相同,正名为跳数)
服务类型ToS 字节Traffic Class(DSCP + ECN,途中可重写)
上层协议字段ProtocolNext Header(值表相同,兼作扩展首部链指针)
链路最小 MTU68 字节1280 字节(§5)
地址配置方式手工 / DHCPSLAAC(无状态)+ DHCPv6(有状态)并存

7.与 TCP 页的联动提示

PMTUD 在 IPv6 下更刚性:路由器被禁止分片,路径 MTU 不足时唯一的反馈信号是 ICMPv6 Packet Too Big(Type 2,RFC 4443;发现流程见 RFC 8201)。一旦中间设备吞掉 ICMPv6 报文,就形成与 IPv4 完全同构的 PMTUD 黑洞:TCP 握手正常、小请求正常、大响应无声消失——症状、成因与排查手法见 TCP 页 §10.1。不同的是 v6 连「路由器帮你分片兜底」这条路都没有,ICMPv6 必须一路放通。
TCP 校验和与 v6 伪首部:TCP 校验和在 IPv6 下同样强制生成、强制校验。伪首部从 IPv4 的 96 位扩为 320 位(RFC 8200 §8.1):源地址 128 位 + 目的地址 128 位 + 上层报文长度 32 位 + 零填充 24 位 + Next Header 8 位。格式图解与「为什么要把地址算进校验」的动机见 TCP 页 §2.2。UDP 在 IPv6 下的校验和同样强制(v4 中原本可选)。

8.术语与符号速查

术语含义
IID接口标识(Interface Identifier):单播地址的低位部分(常规 64 位),在子网内唯一标识一个接口(§2.5.1)。
EUI-64 / Modified EUI-64IEEE 64 位扩展唯一标识;由 48 位 MAC 中间插入 FFFE 并翻转 U/L 位得到,用作 IID。
DAD重复地址检测(RFC 4862):地址启用前向对应 Solicited-Node 组播询问,确认链路上无人占用。
SLAAC无状态地址自动配置(RFC 4862):听路由器 RA 拿前缀,自行拼出 IID 即成地址,无需服务器。
NDP邻居发现协议(RFC 4861,基于 ICMPv6):替代 ARP,兼做路由器发现、前缀发现、重定向、DAD 载体。
SRHSegment 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)。

9.参考文献

编号内容
RFC 8200Internet Protocol, Version 6 (IPv6) Specification,STD 86,2017-07。本文的主要依据(§3 报文格式、§4 扩展首部、§4.5 分片、§5 MTU);废止 RFC 2460。
RFC 4291IP Version 6 Addressing Architecture,2006-02。第 5 节的依据(文本表示、地址类型、EUI-64);废止 RFC 3513。
RFC 4443ICMPv6:差错与控制消息(Packet Too Big、Time Exceeded 等),NDP 的承载协议。
RFC 4861Neighbor Discovery for IP Version 6(NDP):替代 ARP 的邻居发现。
RFC 4862IPv6 Stateless Address Autoconfiguration(SLAAC 与 DAD)。
RFC 4193Unique Local IPv6 Unicast Addresses:ULA(fc00::/7)的定义与随机 Global ID。
RFC 8201Path MTU Discovery for IP version 6:基于 Packet Too Big 的 PMTUD 流程。
RFC 8754IPv6 Segment Routing Header(SRH):SRv6 的数据面首部。
RFC 8981Temporary Address Extensions for SLAAC:隐私临时地址;废止 RFC 4941。
RFC 2675IPv6 Jumbograms:逐跳选项中的 Jumbo Payload 选项。
RFC 6437IPv6 Flow Label Specification:流标签的具体使用规则(8200 §6 指向本文档)。