前言

20世纪80年代,IETF(Internet Engineering Task Force,因特网工程任务组)发布 RFC 791,即 IPv4 协议,标志着 IPv4 正式标准化。在此后的几十年间,IPv4 协议成为最主流的网络层协议之一。无数人在 IPv4 的基础上开发出了各种应用,并且对这个协议做了各种补充和增强,支撑起了今天繁荣的互联网。然而,随着互联网规模越来越大,以及 5G、物联网等新兴技术的发展,IPv4 面临的挑战越来越多,IPv6 取代 IPv4 势在必行。

这篇文章按数据通信的学习脉络,把 IPv6 的报文结构、地址格式、地址类型和地址配置流程串成一条线,既可以当成入门笔记顺着读,也可以当成考前复习的提纲按节跳读。

IPv6概述

IPv6(Internet Protocol version 6,互联网协议第 6 版)是 IETF 设计的下一代网络层协议。它并不是在 IPv4 上打补丁,而是重新设计了地址长度、报文格式和地址配置方式:用 128 bit 地址解决地址耗尽,用扩展包头代替选项字段,用 SLAAC 和 DHCPv6 代替 DHCP 和手工配置。

IPv4现状

2011年2月3日,IANA(Internet Assigned Numbers Authority,因特网地址分配组织)宣布将手中最后 5 个 A 类地址块(每个 /8 约 1677 万个地址,合计约 8388 万个地址)平均分配给全球 5 个 RIR(Regional Internet Registry,区域互联网注册管理机构),此后 IANA 再没有可分配的 IPv4 地址。

IPv4地址耗尽与IPv6演进背景示意图

地址耗尽只是问题的一面。IPv4 在设计之初并没有考虑今天这样的网络规模,路由表膨胀、NAT 破坏端到端通信、广播报文占用链路带宽、报文头选项处理效率低等问题,随着网络规模扩大而不断放大。这些问题共同推动了 IPv6 的诞生。

IPv6优势

  • 近乎“无限”的地址空间:地址长度为 128 bit,可以提供约 3.4×1038 个地址,海量的地址空间满足物联网等新兴业务的需求,也有利于业务演进及扩展。
  • 层次化的地址结构:相较于 IPv4 地址,IPv6 地址的分配更加规范,利于路由聚合(缩减 IPv6 路由表规模)和路由快速查询。
  • 即插即用:IPv6 支持无状态地址自动配置(SLAAC),终端接入更简单,不需要依赖额外的服务器。
  • 简化的报文头部:基本包头固定为 40 字节,去掉了校验和与选项字段,转发效率更高;新功能通过扩展包头支持,利于路由器等网络设备的转发处理,降低投资成本。
  • 安全特性:IPsec、真实源地址认证等机制保证端到端安全;地址空间充足,也避免了 NAT 破坏端到端通信完整性带来的问题。
  • 移动性:对移动网络的实时通信有较大改进,整个移动网络的性能有比较明显的提升。
  • 增强的 QoS 特性:额外定义了流标签(Flow Label)字段,可为应用程序或者终端所用,针对特殊的服务和数据流分配特定的资源。

IPv4 与 IPv6 关键差异

对比项IPv4IPv6
地址长度32 bit,约 43 亿个128 bit,约 3.4×1038 个
书写方式点分十进制,如 192.168.1.1冒号分隔的十六进制,可用 :: 缩写
报文头20 字节固定头 + 可选项 + 校验和40 字节固定头 + 扩展包头,无校验和
地址配置手工配置 / DHCP手工配置 / SLAAC / DHCPv6
地址类型单播、组播、广播单播、组播、任播(取消广播)
分片源端和沿途路由器都可以分片仅源端分片,中间设备不处理
端到端大量依赖 NAT端到端直达,NAT 不再是必需品

IPv6报文结构

IPv6 包头由一个 IPv6 基本包头(必须存在)和多个扩展包头(可能不存在)组成。基本包头提供报文转发的基本信息,会被转发路径上的所有设备解析;扩展包头则是可选的,按需插入,通常只由目的节点解析。

IPv6基本包头

IPv6 基本包头固定为 40 字节,字段比 IPv4 精简得多,也没有校验和字段。

IPv6基本包头40字节固定字段结构示意图
  • 版本(Version):4 bit,值为 6。
  • 流量类别(Traffic Class):8 bit,作用类似于 IPv4 的 TOS 字段,用于区分业务优先级,支持 DiffServ 等 QoS 机制。
  • 流标签(Flow Label):20 bit,用来标识属于同一条业务流的一系列报文,中间设备可以据此对特定流做统一处理。
  • 载荷长度(Payload Length):16 bit,表示基本包头之后的字节数(包含所有扩展包头和上层数据),最大 65535 字节。
  • 下一个头(Next Header):8 bit,指明紧跟在基本包头之后的是哪种扩展包头或上层协议,例如 TCP 为 6、UDP 为 17、ICMPv6 为 58、无扩展包头且没有上层数据时为 59。
  • 跳数限制(Hop Limit):8 bit,每经过一台设备减 1,减到 0 就丢弃报文并回送 ICMPv6 差错报文,作用等同于 IPv4 的 TTL。
  • 源地址 / 目的地址:各 128 bit。

IPv6扩展包头

IPv4 把各种可选功能塞进选项字段,导致路由器必须按长度字段反复解析,效率很低。IPv6 的做法是把这些功能拆成一个个独立的扩展包头,靠“下一个头”字段串成一条链,设备只解析自己需要关心的部分,转发性能因此提升。

IPv6扩展包头由Next Header串联的结构示意图

常见的扩展包头,以及 RFC 8200 建议的排列顺序如下:

  1. 逐跳选项包头(Hop-by-Hop Options):必须紧跟基本包头,沿途每台设备都要处理。
  2. 目的选项包头(Destination Options):由目的节点处理,也可以放在路由包头之后,交给最终目的节点处理。
  3. 路由包头(Routing):指定报文需要经过的中间节点。
  4. 分片包头(Fragment):只在源端分片时出现。
  5. 认证包头(AH)和封装安全载荷(ESP):IPsec 使用的两种安全扩展包头。
  6. 上层协议头:TCP、UDP、ICMPv6 等。

IPv6报文处理机制

IPv6 报文的处理可以按参与节点的角色分开看:

IPv6报文在源节点、转发节点与目的节点的处理流程
  • 源节点:按业务需要组织扩展包头,完成分片(如果需要),再把报文发给下一跳。
  • 转发节点(路由器):只解析基本包头和必须处理的扩展包头(主要是逐跳选项包头),然后按目的地址查表转发,不改动其余扩展包头,也不做分片。
  • 目的节点:逐级解析整条扩展包头链,最终把数据交给上层协议处理。

IPv6地址

IPv6地址格式

IPv6 地址的长度为 128 bit。一般用冒号分割为 8 段,每一段 16 bit,每一段内用十六进制表示,字母不区分大小写。

IPv6地址128位按冒号分为8段十六进制表示

与 IPv4 地址类似,IPv6 也用“IPv6 地址/掩码长度”的方式来表示 IPv6 地址,例如:2001:0DB8:2345:CD30:1230:4567:89AB:CDEF/64。其中前 64 bit 是网络前缀,后 64 bit 是接口标识。

  • IPv6 地址:2001:0DB8:2345:CD30:1230:4567:89AB:CDEF
  • 子网号:2001:0DB8:2345:CD30::/64

此外还有几个特殊地址需要记住:未指定地址 ::/128(相当于 IPv4 的 0.0.0.0,不能作为目的地址使用)、环回地址 ::1/128(相当于 127.0.0.1)。IPv6 中没有广播地址,需要“一对多”时统一使用组播。

IPv6地址缩写规范

  1. 每组 16 bit 单元中的前导 0 可以省略;但如果某组的所有比特都为 0,至少要保留一个“0”字符。末尾的 0 不能被省略。
  2. 一个或多个连续的、全为 0 的 16 bit 单元,可以用“::”表示,但整个 IPv6 地址的缩写中只允许出现一个“::”。
  3. 若缩写后出现两个“::”,就无法判断每一处各压缩了多少个 0,地址将无法还原为原始的 IPv6 地址。

举两个例子,能更快记住这套规则:

  • 2001:0DB8:0000:0000:0000:0000:0000:0001 → 先省略前导 0 得到 2001:db8:0:0:0:0:0:1,再用 :: 压缩连续的全 0 段,最终写作 2001:db8::1。
  • FE80:0000:0000:0000:0203:FFFF:FE00:0001 → 缩写为 FE80::203:FFFF:FE00:1,注意 FFFF 和 FE00 末尾的 0 不能省略。

IPv6地址分类

根据 IPv6 地址前缀,可将 IPv6 地址分为单播地址、组播地址和任播地址。IPv6 取消了广播地址,原本由广播承担的“一对多”通信,全部交给组播来完成。

IPv6地址分类:单播、组播与任播地址前缀划分

IPv6单播地址结构

一个 IPv6 单播地址可以分为如下两部分:

  • 网络前缀(Network Prefix):n bit,相当于 IPv4 地址中的网络 ID。
  • 接口标识(Interface Identifier):(128-n)bit,相当于 IPv4 地址中的主机 ID。

常见的 IPv6 单播地址,如全球单播地址、链路本地地址等,要求网络前缀和接口标识必须为 64 bit。这样划分的好处是:上游或网络前缀发生变化时,接口标识可以保持不变,主机的重编号和身份识别都更简单。

IPv6单播地址网络前缀与接口标识各64位结构图

IPv6单播地址接口标识

接口标识可通过三种方法生成:

  • 手工配置
  • 系统自动生成
  • 通过 IEEE EUI-64 规范生成

其中 EUI-64 规范最为常用,此规范将接口的 MAC 地址转换为 IPv6 接口标识:把 48 bit 的 MAC 地址从中间劈开,插入 16 bit 的 FFFE,再把第一个字节的第 7 位(U/L 位)取反,凑成 64 bit。也正因为接口标识可以由 MAC 地址推导,IPv6 的地址扫描和隐私问题更受关注,很多终端因此启用了随机生成的临时地址。

IEEE EUI-64规范由MAC地址生成IPv6接口标识的过程

IPv6常见单播地址 - GUA

GUA(Global Unicast Address,全球单播地址),也被称为可聚合全球单播地址。该类地址全球唯一,用于需要有互联网访问需求的主机,相当于 IPv4 的公网地址。当前 GUA 使用的地址范围是 2000::/3,即最高 3 bit 固定为 001。

  • 通常 GUA 的网络部分长度为 64 bit,接口标识也为 64 bit。
  • 全局路由前缀:由提供商指定给一个组织机构,一般至少为 45 bit。
  • 子网 ID:组织机构根据自身网络需求划分子网,长度为 16 bit。
  • 接口标识:用来标识一个设备(的接口)。
GUA全球单播地址由全局路由前缀、子网ID与接口标识组成

IPv6常见单播地址 - ULA

ULA(Unique Local Address,唯一本地地址)是 IPv6 的私网地址,只能够在内网中使用。该地址空间在 IPv6 公网中不可被路由,因此不能直接访问公网,作用相当于 IPv4 中的 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。

  • 唯一本地地址使用 FC00::/7 地址块,目前仅使用了 FD00::/8 地址段,FC00::/8 预留为以后拓展用。
  • ULA 虽然只在有限范围内有效,但也具有全球唯一的前缀(虽然随机方式产生,但是冲突概率很低),因此在合并两个内网时不容易出现地址重叠。
ULA唯一本地地址FC00::/7与FD00::/8地址结构

IPv6常见单播地址 - LLA

LLA(Link-Local Address,链路本地地址)是 IPv6 中另一种应用范围受限制的地址类型。LLA 的有效范围是本地链路,前缀为 FE80::/10,配置了 IPv6 的接口会自动生成一个 LLA,不需要手工干预。

  • LLA 用于一条单一链路层面的通信,例如 IPv6 地址无状态自动配置、IPv6 邻居发现等。
  • 源或目的 IPv6 地址为链路本地地址的数据包将不会被转发到始发的链路之外,换句话说,链路本地地址的有效范围为本地链路。
  • 每一个 IPv6 接口都必须具备一个链路本地地址。华为设备支持自动生成和手工指定两种配置方式。
LLA链路本地地址FE80::/10前缀与接口标识结构

IPv6组播地址

IPv6 组播地址标识多个接口,一般用于“一对多”的通信场景。IPv6 组播地址只可以作为 IPv6 报文的目的地址。组播地址固定以 FF00::/8 开头,长度为 128 bit,结构上分为前缀、标志位、范围和组 ID 四部分。

  • Flags:4 bit,用来表示永久组播组还是临时组播组。
  • Scope:4 bit,表示组播组的范围,例如 1 为节点本地、2 为链路本地、5 为站点本地、E 为全球。
  • Group ID:112 bit,组播组 ID。
IPv6组播地址FF00::/8的标志位、范围与组ID结构

实际网络中经常见到的几个组播地址:

  • FF02::1:链路本地范围内的所有节点。
  • FF02::2:链路本地范围内的所有路由器。
  • FF02::1:FF00:0/104:被请求节点组播地址的地址块,下面单独说明。
  • FF05::2:站点本地范围内的所有路由器。

被请求节点组播地址

当一个节点具有了单播或任播地址,就会对应生成一个被请求节点组播地址,并且加入这个组播组。生成规则很简单:取该单播/任播地址的后 24 bit,接在 FF02::1:FF00:0/104 之后即可。

该地址主要用于邻居发现机制和地址重复检测功能,用组播代替 IPv4 的广播,只有“名字相近”的少数节点需要处理这类报文。被请求节点组播地址的有效范围为本地链路范围。

被请求节点组播地址FF02::1:FF00:0/104的生成规则

IPv6任播地址

任播地址标识一组网络接口(通常属于不同的节点)。报文发往任播地址时,网络会把它交给路由意义上“最近”的那个接口处理,因此常用于 DNS 根服务器、时间服务器这类希望就近响应的服务。

需要注意的是,任播地址只能作为 IPv6 报文的目的地址,不能作为源地址——否则接收方无法判断报文究竟来自哪一个成员。任播地址与单播地址格式完全相同,从地址本身看不出区别,必须通过配置来指明。此外,IPv6 还规定了一种子网路由器任播地址:子网前缀 + 全 0 的接口标识,发往该地址的报文会交给该子网中的任意一台路由器。

IPv6任播地址就近转发原理示意图

常见IPv6地址段速查

地址块名称说明
::/128未指定地址相当于 IPv4 的 0.0.0.0
::1/128环回地址相当于 127.0.0.1
2000::/3全球单播地址(GUA)可在公网路由
FC00::/7唯一本地地址(ULA)私网使用,当前实际使用 FD00::/8
FE80::/10链路本地地址(LLA)仅在本链路有效
FF00::/8组播地址取代 IPv4 的广播
2001:DB8::/32文档示例地址只用于文档和教材,不做实际分配
64:FF9B::/96NAT64 转换前缀用于 IPv4 与 IPv6 互通

IPv6地址配置

主机和路由器的IPv6地址

一般情况下,主机和路由器的单播 IPv6 地址以及加入的组播地址如下所示:

主机与路由器上的IPv6单播地址和所加入的组播地址

IPv6单播地址业务流程

一个接口在发送 IPv6 报文之前,要经历地址配置、DAD、地址解析这三个阶段,NDP(Neighbor Discovery Protocol,邻居发现协议)在其中扮演了重要角色。

  • 全球单播地址和链路本地地址是接口上最常见的 IPv6 单播地址,一个接口上可以配置多个 IPv6 地址。
  • DAD(Duplicate Address Detection,重复地址检测)类似于 IPv4 中的免费 ARP 检测,用于检测当前地址是否与其他接口冲突。
  • 地址解析类似于 IPv4 中的 ARP,通过 ICMPv6 报文形成 IPv6 地址与数据链路层地址(一般是 MAC 地址)的映射关系。
IPv6单播地址配置、DAD与地址解析三阶段流程

NDP

NDP 使用 ICMPv6 定义了五类报文,覆盖了从路由器发现到地址解析的全部环节:

  • RS(Router Solicitation,路由器请求,类型 133)与 RA(Router Advertisement,路由器通告,类型 134):用于路由器发现和地址前缀下发。
  • NS(Neighbor Solicitation,邻居请求,类型 135)与 NA(Neighbor Advertisement,邻居通告,类型 136):用于地址解析和重复地址检测。
  • Redirect(重定向,类型 137):用于告知主机存在更优的下一跳。
NDP邻居发现协议RS、RA、NS、NA、Redirect五类报文

IPv6动态地址配置

通过 DHCPv6 报文交互,DHCPv6 服务器端自动配置 IPv6 地址/前缀及其他网络配置参数(DNS、NIS、SNTP 服务器地址等参数)。

DHCPv6动态地址配置的报文交互流程

如果不部署 DHCPv6,也可以使用无状态地址自动配置(SLAAC):主机根据 RA 报文中的地址前缀,结合本地生成的 64 bit 接口标识(例如 EUI-64),自行生成单播地址。这种方式仅可以获得 IPv6 地址信息,无法获得 DNS、NIS、SNTP 服务器等参数,需要配合 DHCPv6 或者手工配置来获取其他配置信息。

SLAAC无状态地址自动配置生成单播地址的过程

DAD

无论通过何种方式配置了 IPv6 单播地址,主机或路由器都会:

  • 通过 ICMPv6 报文进行 DAD
  • 仅当 DAD 通过之后才会使用该单播地址

DAD 的具体做法是:向该地址对应的被请求节点组播地址发送 NS 报文,如果在规定时间内没有收到其他节点回应的 NA 报文,就认为地址可用。

DAD重复地址检测通过NS与NA报文交互完成

地址解析

IPv6 使用 ICMPv6 的 NS 和 NA 报文来取代 ARP 在 IPv4 中的地址解析功能。当主机需要向某个 IPv6 地址发送数据,却不知道对方的链路层地址时,就向对方的被请求节点组播地址发送 NS 报文,对方以 NA 报文回复自己的 MAC 地址。

IPv6用NS与NA报文完成地址解析替代ARP

IPv6典型配置举例

下面以华为 VRP 设备为例,把前面讲到的内容落到命令上。一台路由器的接口要能正常收发 IPv6 报文,通常只需要三步:全局使能 IPv6、接口使能 IPv6、配置地址。

IPv6基本配置(一):使能与接口地址

1. 全局使能 IPv6

[Huawei] ipv6

接口下还需要单独使能,使能设备转发 IPv6 单播报文,包括本地 IPv6 报文的发送与接收。

[Huawei-GigabitEthernet0/0/0] ipv6 enable

2. 配置接口的链路本地地址(可以手工指定,也可以自动生成)

[Huawei-GigabitEthernet0/0/0] ipv6 address ipv6-address link-local
[Huawei-GigabitEthernet0/0/0] ipv6 address auto link-local

3. 配置接口的全球单播地址(手工指定,或通过 SLAAC / DHCPv6 自动获取)

[Huawei-GigabitEthernet0/0/0] ipv6 address { ipv6-address prefix-length | ipv6-address/prefix-length }
[Huawei-GigabitEthernet0/0/0] ipv6 address auto { global | dhcp }

把上面几步合在一起,一个典型的接口配置是这样的:

[Huawei] ipv6
[Huawei] interface GigabitEthernet0/0/0
[Huawei-GigabitEthernet0/0/0] ipv6 enable
[Huawei-GigabitEthernet0/0/0] ipv6 address 2001:DB8:1::1 64
[Huawei-GigabitEthernet0/0/0] ipv6 address FE80::1 link-local
[Huawei-GigabitEthernet0/0/0] undo ipv6 nd ra halt

IPv6基本配置(二):路由与状态查看

4. 配置 IPv6 静态路由

[Huawei] ipv6 route-static dest-ipv6-address prefix-length { interface-type interface-number [ nexthop-ipv6-address ] | nexthop-ipv6-address } [ preference preference ]

5. 查看接口的 IPv6 信息

[Huawei] display ipv6 interface [ interface-type interface-number | brief ]

回显中可以看到接口的链路本地地址、全球单播地址、使能状态,以及是否加入相应的组播组。

6. 查看邻居表项信息

[Huawei] display ipv6 neighbors

这张表相当于 IPv4 的 ARP 表,可以查看到 IPv6 地址与 MAC 地址的映射关系,以及邻居的状态。

7. 使能系统发布 RA 报文功能

默认情况下,华为路由器接口不发送 ICMPv6 RA 报文,则该接口所连链路上的其他设备无法进行无状态地址自动配置。若想使用 IPv6 无状态地址配置,需要手工开启发送 RA 报文。

[Huawei-GigabitEthernet0/0/0] undo ipv6 nd ra halt

小结

IPv6 并不是把 IPv4 的字段简单加长,而是在地址结构、报文格式和地址配置方式上一起做了重新设计。回过头看,这一整套设计其实只围绕几件事:

  • 地址够用:128 bit 地址解决了耗尽问题,同时给分层路由留出了足够的空间。
  • 转发够快:基本包头固定 40 字节,去掉校验和与选项字段,新功能靠扩展包头按需插入。
  • 类型更清晰:只保留单播、组播、任播三类,广播被组播取代;单播地址再细分为 GUA、ULA、LLA。
  • 上线更简单:地址配置、DAD、地址解析三个阶段全部由 NDP 支撑,插上网线就能拿到地址。

把这些基础概念记牢,后面学 IPv6 路由协议、过渡技术和网络安全时,会顺畅很多。

如果你觉得这篇文章不错,有用的话可以点击下面的“赞赏”支持作者,你的支持是我更新的动力(饿饿吃饭)。