Stateless 机制自动配置全局唯一地址
Stateless 机制允许主机自动生成全局唯一地址,而不再需要手动配置,但需要路由器的支持。即:Stateless 机制使用本地信息以及由 RA msg 中的非本地信息来生成一个全局唯一的地址。
具体地说,IPv6 主机使用 NDP 从 RA 中获取到子网前缀(站点前缀 + SubnetID)。主机通过合并子网前缀以及 interface ID 来自动生成 IPv6 地址。如果没有路由器的话,那么主机可以只生成链路本地地址。链路本地地址只能用于和同一链路上的节点进行通信。
另外,Stateless 机制还允许接口自动生成一个临时地址,但是,与自动配置的标准 IPv6 地址不同,临时地址由站点前缀和一个随机生成的 64 位数字组成。这个随机数将成为 IPv6 地址的 interface ID 部分。临时地址作为 interface ID 时,不会生成链路本地地址。
子网前缀从路由器来。即使主机不主动找路由器,路由器也会周期性发送 RA 报文,向链路上所有节点通告子网前缀,这称为 Unsolicited RA。如果主机不想等,也可主动发送 RS 报文,催促路由器发送 RA 报文,这称为 Solicited RA。即使发送 RS 报文前就收到 RA 报文,主机也应至少发送一次 RS 报文,因为 Solicited RA 可能比 Unsolicited RA 报文包含更丰富的信息。
为了避免造成网络拥塞,主机不会在获得链路本地地址后立即发送 RS 报文,而是延迟一段随机时间后再发送,在大面积故障恢复(如停电结束)后链路不会同时涌入大量 RS 报文。同样道理,路由器的周期性 RA 报文也不是严格按照周期发送的,避免同一链路上的多个路由器同时发送 RA 报文。
假设主机链路本地地址为 IP A,路由器链路本地地址为 IP B。主机向同一链路所有路由器发送 RS 报文,请求路由器发送 RA 报文:源地址为 IP A,目的地址为 ff02::2,即同一链路所有路由器的组播地址,ICMP 报文类型为 133。
路由器收到 RS 报文后,向同一链路所有节点发送 RA 报文:源地址为 IP B,目的地址为 IP A(如果是 Unsolicited 通告则目的地址为 ff02::1,即同一链路所有节点的组播地址),ICMP 报文类型为 134。
RA 报文除了包含前缀(Prefix),还包含 MTU(最大传输单元)、Hop Limit(最大跳数)、Route(路由)、Router Lifetime(路由器生存期)、ReachableTime(可达性确认时间)和 RetransTimer(NS 重发时间间隔)等。路由器还会告诉主机使用 Stateless 还是 DHCPv6 获得全球唯一地址,以及如果使用 Stateless,上述其他信息是否通过 DHCPv6 获得。
经过第二步,接口 ID 有了,前缀也有了,主机将前缀和接口 ID 组合,就获得全球唯一地址。全球唯一地址是单播地址,主机应先进行重复地址检测,再将这个地址分配给接口。实际上,不管地址是通过 Stateless 配置的,还是通过 DHCPv6 配置的,甚至是手工配置的,都应进行重复地址检测。(某些厂家只检测链路本地地址,不检测全球唯一地址,是基于两者由相同接口 ID 构成的前提。实际上,这个前提并不成立,同一接口的多个单播地址不一定使用相同的接口 ID 构成)。
自动生成链路本地地址
IPv6 主机可以通过 interface 的 MAC 地址转换得到 interface ID(MAC-to-EUI-64),再通过 interface ID 构成链路本地地址(fe80:: + 接口 ID)。在此过程中,主机需要进行重复地址检测,确认同一链路上没有其他接口使用同一地址,再将这个地址分配给接口。因为并不是所有类型的 L2 地址(链路层地址)都可提取出全球唯一的标识,重复地址检测是必要的。 重复地址检测
主机在生成链路本地地址过程中,会进行重复地址检查,若通过,则为主机分配 IPv6 地址;若不通过主机则只好停止 Stateless 自动配置,转为手工配置。
无论哪种单播地址,在将 IP 占为己有之前,主机应将其标记为 Tentative(临时)状态,重复地址检测通过后再标记为 Valid(合法)状态。如果主机正在请求某个 IP(Tentative 状态),同时收到了其他主机对同一 IP 的 NS 请求,或已使用同一 IP 的 NA 通告,主机应放弃这个 IP。极端情况是,每个请求主机都收到其他主机的请求而同时放弃这个 IP。
地址解析
主机如果想和同一链路的其他节点通信,需先获得对方的链路本地地址,然后进行地址解析,以获得对方的 L2 链路层 MAC 地址。
地址解析和重复地址检测过程有些相似,不同的是,NS 报文中询问的目标地址是别人的地址(而不是自己的地址),收到 NS 报文的节点应查看 Option 包含的目标地址,如果和自身地址相同,应返回 NA 报文通告自己的链路层地址。
简单的说,重复地址检测 NS 报文询问目标是自己的地址,不希望收到 NA 报文;地址解析 NS 报文询问目标是别人的地址,希望收到 NA 报文。
NS 和 NA 报文都包含发送方的 IP 地址和链路层地址,通过上述过程双方均获得对方 IP 地址和 MAC 地址的绑定关系,并记录到邻居表中并进行维护。邻居状态包括:Empty、Incomplete、Reachable、Stale、Delay 和 Probe。