IPv6 地址分配详解

IPv6 地址结构

一个 IPv6 地址由 128 个比特(bits)组成,通常分为 8 个 16 比特的块,每个块用冒号(:)分隔,并以十六进制表示。

例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334

地址压缩规则

为了简化书写,IPv6 地址可以被压缩:

  1. 省略前导零

    每个块中开头的

    1
    
    0
    

    可以省略。

    • 0db8 -> db8
    • 0000 -> 0
    • 0370 -> 370
  2. 压缩连续的零: 可以使用双冒号 :: 来替代地址中任意一段连续的、全为 0 的块。注意:在一个地址中 :: 只能使用一次

应用上述规则后,上面的地址可以被简化为:

1
2001:db8:85a3::8a2e:370:7334

IPv6 地址类型

IPv6 地址主要分为三种类型:单播(Unicast)、多播(Multicast)和任播(Anycast)。

单播地址 (Unicast)

单播地址标识一个唯一的网络接口,发往单播地址的数据包将被送到该地址所标识的唯一接口。

  • 全球单播地址 (Global Unicast Address - GUA)

  • 范围: 全球唯一,可在公网路由。

  • 前缀: 通常以 2000::/3 开头。

  • 结构:

    • 全局路由前缀 (Global Routing Prefix): 通常为 48 位,由 ISP 分配给组织。
    • 子网 ID (Subnet ID): 通常为 16 位,由组织内部规划子网。
    • 接口 ID (Interface ID): 64 位,用于标识子网中的具体设备接口。
  • 链路本地地址 (Link-Local Address)

  • 范围: 仅在同一物理或逻辑链路上有效,不能跨路由器路由。

  • 前缀: fe80::/10

  • 用途: 用于邻居发现、自动地址配置等链路内部通信。设备启动后会自动生成。

  • 唯一本地地址 (Unique Local Address - ULA)

  • 范围: 仅在有限范围内(如一个组织或站点内部)使用,功能类似 IPv4 的私有地址。它不会在公网路由。

  • 前缀: fc00::/7

  • 特殊地址

  • 环回地址: ::1/128,相当于 IPv4 的 127.0.0.1

多播地址 (Multicast)

多播地址标识一组网络接口,发往多播地址的数据包将被送到该组中的所有接口。

  • 前缀: ff00::/8

  • 常见示例:

    • ff02::1: 链路本地范围内的所有节点
    • ff02::2: 链路本地范围内的所有路由器

任播地址 (Anycast)

任播地址也标识一组网络接口,但发往任播地址的数据包只会被送到这组接口中距离最近(根据路由协议的度量)的一个。任播地址的格式与单播地址相同,但通过路由配置实现。

IPv6 地址分配方法

设备获取 IPv6 地址主要有以下几种方式:

无状态地址自动配置 (SLAAC)

SLAAC 是 IPv6 的核心特性之一,允许设备在没有 DHCP 服务器的情况下自动配置地址。

过程:

  1. 设备启动后,首先为自己生成一个链路本地地址。
  2. 设备向本地链路发送一个路由器请求 (Router Solicitation - RS) 多播消息。
  3. 链路上的路由器收到 RS 后,会回复一个路由器通告 (Router Advertisement - RA) 消息。RA 消息中包含了网络前缀(如 GUA 前缀)和其他网络信息。
  4. 设备使用 RA 中通告的前缀,并结合自己的接口 ID(通常通过 EUI-64 算法或随机生成)来构成一个完整的全球单播地址。

有状态 DHCPv6 (Stateful)

工作方式类似于 IPv4 的 DHCP,由 DHCPv6 服务器集中管理和分配 IPv6 地址。

  • 优点: 便于集中管理和审计,可以精确控制地址分配。
  • 适用场景: 需要严格管理地址分配的企业网络。

无状态 DHCPv6 (Stateless)

这是一种混合模式。

  • 设备通过 SLAAC 获取 IPv6 地址。
  • 同时,设备通过 DHCPv6 获取其他网络配置信息,例如 DNS 服务器地址、域名等。
  • 这种方式既利用了 SLAAC 的便捷性,又弥补了其无法提供 DNS 等附加信息的不足。

静态配置 (Manual)

管理员手动为设备配置静态的 IPv6 地址、网关和 DNS 等信息。适用于服务器、路由器等需要固定地址的设备。

DHCPv6 交互过程

DHCPv6 客户端和服务器之间的通信过程,用于获取 IPv6 地址和/或其他网络配置参数。标准的交互过程涉及四次消息交换,这确保了客户端可以选择最合适的服务器。

四步交换 (Four-Way Exchange):

  1. Solicit (请求):
    • 客户端在本地链路上发送一个 Solicit 多播消息,以发现可用的 DHCPv6 服务器。
    • 消息发送到所有 DHCP 中继代理和服务器的多播地址 ff02::1:2
  2. Advertise (通告):
    • 收到 Solicit 消息的 DHCPv6 服务器会回复一个 Advertise 单播消息。
    • 此消息中包含了服务器可以为客户端提供的地址和/或配置信息。一个客户端可能会收到多个 Advertise 消息。
  3. Request (请求):
    • 客户端从收到的一个或多个 Advertise 消息中选择一个服务器,并向其发送一个 Request 单播消息,正式请求分配地址和/或配置参数。
    • 消息中会包含它所选择的服务器的标识符。
  4. Reply (回复):
    • 被选中的服务器收到 Request 消息后,会发送一个 Reply 单播消息,确认地址分配和配置信息。
    • 此时,客户端完成配置,可以开始使用获取到的地址。 两步交换 (Two-Way Exchange) - 快速提交 (Rapid Commit): 为了加速地址分配过程,DHCPv6 引入了快速提交选项。
  5. Solicit (请求):
    • 客户端在 Solicit 消息中加入 “Rapid Commit” 选项,表示希望立即完成地址分配。
  6. Reply (回复):
    • 支持快速提交的服务器如果愿意立即分配地址,会直接回复一个 Reply 消息,跳过 AdvertiseRequest 步骤。 这种两步交换减少了延迟,在许多场景下(如网络中只有一个 DHCPv6 服务器)非常高效

关键协议与技术

在一个部署 IPv6 的广播域中,相比 IPv4 一个最明显的区别就是 IPv6 路由通告;在 IPv4 时代,一个广播域中的 ipv4 网段并没有显式说明,或者说并没有一个 ipv4 网段宣称占据了这个广播域,仅使用这个广播域的广播/组播能力,多个ipv4网段共用一个广播域的情况也不鲜见;而在ipv6中,运行ipv6协议的路由器会主动发送名为路由通告 Router Advertisement的 ICMPv6 报文,在广播域中宣告/广播*此 ipv6 网段占据了该广播域;

*(准确的讲应该是组播,IPv6 已经没有广播概念了,这里使用广播这个说法为了说明是公开发送的,在一个广播域中,广播和组播达成的功能类似,且在低端交换机中,广播和组播的转发方式是一致的)

RA(路由通告 Router Advertisement)使用 ICMPv6 报文(type 134),属于 NDP 协议的一部分

IPv6 的功能实现严重依赖于一些关键的底层协议,特别是 ICMPv6 和在其基础上构建的邻居发现协议 (NDP),以及用于动态分配网络前缀的 DHCPv6-PD。

ICMPv6

IPv6 时代的ip层控制协议(类比ipv4中的arp、icmp等)均使用icmpv6报文,取消了IP层的广播,转而广泛使用组播。ICMPv6 中的 type 133 ~ 137 报文由NDP协议使用,用于发现网关、邻居、地址配置等等。

ICMPv6

ICMPv6 是 IPv6 的一个核心组成部分,其功能远超 IPv4 中的 ICMP。它不仅用于传输网络错误和诊断信息,还承载了许多关键的网络控制功能。如果防火墙错误地完全阻止 ICMPv6,将导致 IPv6 网络中断。

主要功能:

  • 错误报告: 如 “目标不可达”、“数据包过大”、“超时” 等。
  • 诊断查询: 如 ping 命令所使用的 “Echo Request” 和 “Echo Reply”。
  • 网络控制: 为 NDP、MLD (多播侦听发现) 等协议提供消息支持。

NDP (邻居发现协议)

NDP 是 IPv6 中一个至关重要的协议,它取代了 IPv4 中的 ARP、ICMP 路由器发现和 ICMP 重定向等多个协议的功能。NDP 基于 ICMPv6 实现,是实现即插即用和 SLAAC 的基础。

NDP 的核心功能:

  • 地址解析: 将 IPv6 地址解析为链路层地址(如 MAC 地址),取代了 ARP。
  • 路由器发现: 主机可以发现本地链路上的路由器。
  • 前缀发现: 主机可以发现用于自动配置的地址前缀。
  • 重复地址检测 (DAD): 节点可以确认其想要使用的地址在链路上是唯一的。
  • 可达性跟踪: 判断邻居节点是否仍然可达。

NDP 使用的五种 ICMPv6 消息类型:

  1. 路由器请求 (Router Solicitation - RS): 通常由终端主动发送,用于在未收到周期性 RA 的情况下,请求 RA
  2. 路由器通告 (Router Advertisement - RA):由路由器周期性发送,也可以响应 RS 发送,用于宣告本广播域中 IPv6 相关信息。比如前缀、网关、DNS等
  3. 邻居请求 (Neighbor Solicitation - NS): 用于解析邻居的链路层地址或执行 DAD,和 IPv4 的 ARP request 功能一致。
  4. 邻居通告 (Neighbor Advertisement - NA): 对 NS 消息的响应,或在链路层地址变化时主动发送和 ,IPv4 的 ARP reply功能一致。
  5. 重定向 (Redirect): 路由器告知主机有更优的下一跳路径,类似于 IPv4 的icmp redirect功能。

RS/RA

RS/RA 是IPv6 环境下独有的控制信令,此信令明确了一个广播域中各节点所代表的角色。

  • 广播域中发送RA的为路由器

  • 广播域中可以存在多个路由器

  • RA 组播周期性发送

  • RS 用于在未收到 RA 情况下请求 RA

  • RA 中的Flags表明当前广播域中 IPv6 地址的配置方式

  • 这些 Flags 分布在两个位置—-ICMPv6 报头和 prefix option,后者称为 PIO(Prefix Information Option) flag。

    • M(Managed address configuration):位于报头,M=1 表明终端应该使用 DHCPv6 协议配置地址和其他网络参数;如果M=1,则忽略 O Flag;此flag用于DHCPv6 有状态模式
    • O(Other configuration):位于报头,O=1且M=0 表明终端应该使用 DHCPv6 设置除了 IPv6 地址之外的其他(dns/ntp等),此 flag 用于 DHCPv6 无状态模式
    • A(Autononous address-configuration flag):位于PIO中,A=1 表明终端应该使用 SLAAC 配置 IPv6 地址;PIO可以包含多个 Prefix,这也就意味着一个广播域中可以存在多个 IPv6 网段。

    这几种flag是可以复合使用的,以满足不同场景需求,除了手动静态配置ipv6地址,动态/自动配置或者半自动配置ipv6地址的方式都需要从ndp协议的 RA 开始,就好像 RA 引导了IPv6自动配置的开始;RA中的不同flag叠加影响地址自动配置;

DHCPv6-PD

DHCPv6前缀代理DHCPv6-PD(PrefixDelegation)是一种前缀分配机制,通过DHCPv6前缀代理机制,下游 网络设备不需要再手工指定用户侧链路的IPv6地址前缀,它只需要向上游网络设备提出前缀分配申请,上游网 络设备便可以分配合适的地址前缀给下游设备,下游设备把获得的前缀再通过路由通告(RA)至与IPv6主机直连 的用户链路上,实现IPv6主机的地址自动配置,完成整个系统层次的地址布局。

DHCP-PD 技术最早在RFC3633中提出,经过几次更新目前最新的是RFC8415,其主要思想是把DHCPv6的地址分配方式划分为多层,dhcp client不再是仅仅获取地址用于终端通信,而是可以作为次级路由器身份把地址层层分配下去;这样的好处是便于快速和统一部署大量地址,尤其是在大规模动态地址的情况下,此种地址分配方式在家庭宽带中已经大量部署;光猫从其上级获取一段地址用于本地网络终端的地址分配,甚至从光猫拿到的地址还能再往下一层分配.

工作原理:

  1. 请求: 家庭路由器(客户端)向其上游 ISP 的路由器(服务器)发送 DHCPv6 请求,希望获得一个 IPv6 地址前缀(例如一个 /56/48 的地址块),而不仅仅是一个地址。
  2. 代理: ISP 路由器从其地址池中分配一个前缀块,并通过 DHCPv6 回复将其“代理”或“授权”给家庭路由器。
  3. 分配: 家庭路由器获得该前缀后,就拥有了管理这个地址块的权限。它可以将这个前缀进一步划分为更小的子网(例如多个 /64 子网),并为连接到其 LAN 口的各个内部网络(如家庭网络、访客网络)分配这些子网前缀。
  4. 通告: 家庭路由器在其内部网络上发送 RA 消息,通告这些 /64 的子网前缀,使得内部网络中的设备可以通过 SLAAC 自动配置 IPv6 地址。

优势:

  • 自动化: 无需手动配置下游路由器的子网,实现了网络部署的自动化。
  • 结构化: 使得家庭或小型办公室可以轻松地拥有多个独立的 IPv6 子网,便于网络隔离和管理。
  • 高效性: 相比于 NAT,每个设备都能获得全球唯一的公网地址,实现了真正的端到端连接。

对比IPv4环境,IPv6 地址有所谓的 link-local 地址而且充当比较重要作用;由于一个接口可以配置很多IPv6地址,当这些地址作为下一跳使用的时候会出现混乱,这样不利于管理也不利于设备性能开销,使用Link Local地址唯一标识链路上的一个节点就避免了这个问题。而且在网络重新编址过程中,Link Local并不会发生变化,更利于快速更改编址

DAD

DAD 基于 ICMPv6 Neighbor Solicitation(NS,邻居请求)Neighbor Advertisement(NA,邻居通告) 消息实现,步骤如下:

  1. 节点分配一个 IPv6 地址(如通过 SLAAC 或手动配置),但该地址尚未正式启用(处于 “tentative” 状态)。
  2. 发送 Neighbor Solicitation(NS)
    • 目标地址(Target Address)设为待检测的 IPv6 地址。
    • 源地址设为 未指定地址(::)(因为该地址尚未正式使用)。
    • 发送到 “请求节点组播地址”(Solicited-Node Multicast Address,FF02::1:FFXX:XXXX)
  3. 等待响应
    • 如果没有收到 Neighbor Advertisement(NA),说明地址未被占用,可以正常使用。
    • 如果收到 NA,说明地址已被占用,节点必须放弃该地址并重新配置(如 SLAAC 会生成新地址)。
  4. DAD 完成
    • 成功通过检测后,地址变为 “Preferred” 或 “Valid” 状态,可以正常通信

邻居表

邻居表,在IPv4环境下就是ARP表,系统维护Arp表内容由系统自己决定,比如端口、更新时间等;

到了IPv6环境,ND表代替了arp表,而且协议规定了5种邻居状态,IPv6 邻居状态,分别是: Incomplete、Reachable、Stale、Delay、Probe,其中只有 Stale 状态是稳定状态。

  1. Incomplete (未完成状态):表⽰正在解 析地址,但邻居链路层地址尚未确定。
  2. Reachable (可达状态):表⽰地址解析 成功,该邻居可达。
  3. Stale(失效状态):表⽰可达时间耗尽,未确定邻居是否可达。
  4. Delay(延迟状态):表⽰未确定邻居是否可达。Delay 状态不是⼀个稳定的状态,⽽是⼀个延时等待状态。
  5. Probe (探测状态):节点会向处于 Probe 状态的邻居持续发送 NS 报⽂。 不同状态之间迁移如下图
1
2
ip neigh
ip -6 neigh
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计