1. Neighbor Discovery Protocol(邻居发现协议)特征
- 邻居请求报文 NS:「ICMPv6 类型字段 135」
- SMAC:请求者的 MAC 地址
- DMAC:应答者的对应组播 MAC 地址
- SIP:请求者的 IPv6 地址
- DIP:应答者的请求节点组播地址
- Target Address:应答者的 IPv6 地址(与 NA 报文中的一致,用来确认是否是自己发送的报文)
- Option(Source Link-Layer Address):请求者的 MAC 地址
邻居应答报文 NA:「ICMPv6 类型字段 136」
Host A 会发送一个 NS 报文,其中源地址为 Host A 的 IPv6 地址,目的地址为 Host B 的被请求节点组播地址,需要解析的目标 IP 为 Host B 的 IPv6 地址(表示 Host A 想要知道 Host B 的链路层地址)同时需要指出的是,在 NS 报文的 Options 字段中还携带了 Host A 的链路层地址
- 源MAC: PC1 自己的 MAC 地址
- 目标MAC: PC2 的对应组播 MAC 地址
- 源IP: PC1 的 IPv6 地址
- 目标IP: PC2 的请求节点组播地址
- Target Address: PC2 的 IPv6 地址
- Option(Source Link-Layer Address): PC1 的 MAC 地址
当 Host B 接收到了 NS 报文之后,会回应 NA 报文,其中源地址为 Host B 的 IPv6 地址,目的地址为 Host A 的 IPv6 地址(使用 NS 报文中的 Host A 的链路层地址进行单播传送),Host B 的链路层地址被放在 Options 字段中。这样就完成了一个地址解析的过程
节点需要维护一张邻居表,最终的状态都是需要达到 Reachable 才可以正常通信。每个邻居都有相应的状态,状态之间可以迁移。用于感知邻居状态是否正常、是何状态
- 未完成(Incomplete)
- 可达(Reachable)
- 陈旧(Stale)
- 延迟(Delay)
- 探测(Probe)
- 通过邻居或到达邻居的通信,会因各种原因而中断
- 如果目的地失效,则不可能恢复,通信失败
- 如果路径失效,则可能恢复
以 A、B 两个邻居节点之间相互通信过程中 A 节点的邻居状态变化为例
- A 先发送 NS 报文,并生成缓存条目,此时邻居状态为 Incomplete
- B 回复 NA 报文,则 A 的邻居状态由 Incomplete 变为 Reachable,否则固定时间后邻居状态由 Incomplete 变为 Empty(即删除表项)
- A 若超过邻居可达时间,邻居状态由 Reachable 变为 Stale(未知是否可达)
- A 如果在 Reachable 状态,收到 B 的非请求 NA 报文,并且报文中携带的 B 的链路层地址和缓存条目表项中不同,则邻居状态马上变为 Stale
- A 在 Stale 状态若要向 B 发送数据,则邻居状态由 Stale 变为 Delay,并重新发送 NS 请求
- A 在经过一段固定时间后,邻居状态由 Delay 变为 Probe,期间若有 NA 应答,则邻居状态由 Delay 变为 Reachable
- A 在 Probe 状态,每隔一定时间发送单播 NS,发送固定次数后,有应答则状态变为 Reachable,否则状态变为 Empty(即删除表项)
3)重复地址检测(DAD)
在地址是自动配置的时候,进行 DAD 检测是很必要的
- 类似于 IPv4 中的免费 ARP,在接口使用某个 IPv6 单播地址之前进行的,主要是为了探测是否有其它的节点使用了该地址
- 一个 IPv6 单播地址在分配给一个接口之后,在通过重复地址检测之前称为试验地址「Tentative Address」。此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组
- ALL-Nodes 组播组
- Solicited-Node 组播组(试验地址所对应的请求节点组播 MAC)
工作原理(Host A 新配置的 IPv6 地址为 FC00::1,那么 FC00::1 就是 Host A 的试验地址):
- Host A 向 FC00::1 的 Solicited-Node 组播组发送一个以 FC00::1 为请求目标地址的 NS 报文进行重复地址检测,但由于 FC00::1 并未正式指定,所以 NS 报文的源地址是未指定地址 “ :: “
- 当 Host B 收到该 NS 报文后,有两种处理方法:
用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数,是 IPv6 地址无状态自动配置功能的基础
- 路由请求报文RS:「ICMPv6 类型字段 133」
- 用于主机接入网络后希望尽快获取网络前缀进行通信,主机可以立刻发送 RS 报文,网络上的设备将回应 RA 报文
- 路由应答报文RA:「ICMPv6 类型字段 134」
- 根据接口标识产生链路本地地址
- 发出邻居请求,进行重复地址检测
- 如地址冲突,则停止自动配置,需要手工配置
- 如不冲突,链路本地地址生效,节点具备本地链路通信能力
- 主机会发送 RS 报文(或接收到设备定期发送的RA报文)
- 根据 RA 报文中的前缀信息和接口标识得到 IPv6 地址
2)生存时间
- 当地址处于 Deprecated(弃用)状态,地址不能主动的发起连接只能是被动的接受连接(这也是为了保证上层应用而设计的),但是过了 Valid Lifetime 时间地址就变为 invalid(无效)这时任何连接就会 down 掉
- 主机会周期的收到 RA 报文,并依据该报文来更新自己的时间参数
- RA 报文选项中的 “ Auto “ 没有置位
- 前缀与以有的地址前缀重复(包括Link-Local地址)
- RA报文选项中 “ Preferred Lifetime “ 时间大于 “ Valid Lifetime “
- 前缀长度与接口 ID 长度之和不等于 128 位
4)RA 报文的 Flags 字段
- M位(默认=0):获取前缀信息
- M = 0,表示使用RA报文中的前缀进行无状态自动配置(EUI-64)
- M = 1,表示通过使用有状态自动配置前缀信息(DHCPv6)
- O位(默认=0):其他信息
- ICMPv6 Type 字段「137」
- 用于当网关设备发现报文从其它网关设备转发更好,发送重定向报文告知报文的发送者,让报文发送者选择另一个网关设备
- 报文中会携带更好的路径下一跳地址和需要重定向转发的报文的目的地址等信息
- 当设备收到一个报文后,只有出现以下情况,设备才会向报文发送者发送重定向报文
- 报文的目的地址不是一个组播地址
- 报文并非通过路由转发给设备
- 经过路由计算后,路由的下一跳出接口是接收报文的接口
- 设备发现报文的最佳下一跳 IPv6 地址和报文的源 IPv6 地址处于同一网段
- 设备检查报文的源地址,发现自身的邻居表项中有用该地址作为全球单播地址或链路本地地址的邻居存在
工作原理:
- Host A 需要和 Host B 通信,Host A 的默认网关设备是 Router A,当 Host A 发送报文给 Host B 时报文会被送到 Router A
- Router A 接收到 Host A 发送的报文以后会发现实际上 Host A 直接发送给 Router B 更好,它将发送一个重定向报文给 Host A,其中报文中更好的路径下一跳地址为 Router B,Destination Address 为 Host B
- Host A 接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往 Host B 的报文就直接发送给 Router B