邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。 邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器 发现(RouterDiscovery),它定义了使用ICMPv6报文实现地址解析,跟踪邻 居状态,重复地址检测,路由器发现以及重定向等功能。 1、地址解析 在 IPv4中,当主机需要和目标主机通信时,必须先通过 ARP 协议获得目的主机的链 路层地址。在 IPv6中,同样需要从 IP 地址解析到链路层地址的功能。邻居发现协议实 现了这个功能。 ARP 报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为 ARP 定位为第 2.5 层的协议。ND 本身基于 ICMPv6 实现,以太网协议类型为 0x86DD,即 IPv6 报文,IPv6下一个报头字段值为58,表示ICMPv6报文,由于 ND 协议使用的所有报文均封装在 ICMPv6报文中,一般来说,ND 被看作第3层的协议。在三层完成地址解析,主 要带来以下几个好处: (1) 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。 (2) 可以使用三层的安全机制避免地址解析攻击。 (3) 使用组播方式发送请求报文,减少了二层网络的性能压力。 Host A 在向 Host B 发送报文之前它必须要解析出 Host B 的链路层地址,所以首先Host A 会发送一个 NS 报文,其中源地址为 Host A 的 IPv6 地址,目的地址为 Host B 的被请求节点组播地址,需要解析的目标 IP 为 HostB 的 IPv6 地址,这就表示 Host A 想 要知道 Host B 的链路层地址。同时需要指出的是,在 NS 报文的 Options 字段中还携带 了 Host A 的链路层地址。 当 Host B 接收到了 NS 报文之后,就会回应 NA 报文,其中源地址为 HostB 的 IPv6地址,目的地址为 Host A 的 IPv6 地址(使用 NS 报文中的 HostA 的链路层地址进行单 播),Host B 的链路层地址被放在 Options 字段中。这样就完成了一个地址解析的过程。 组播 MAC:3333+IPv6 后 32 位地址生成 2、重复地址检测 重复地址检测 DAD(Duplicate Address Detect)是在接口使用某个 IPv6 单播地址之前进行的,主要是为了探测是否有其它的节点使用了该地址。尤其是在地址自动配置的时候,进行 DAD 检测是很必要的。一个 IPv6单播地址在分配给一个接口之后且通过重复地址 检测之前称为试验地址(Tentative Address)。此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES 组播组和试验地址所对应的 Solicited-Node 组播组。 IPv6重复地址检测技术和 IPv4中的免费 ARP 类似:节点向试验地址所对应的 Solicited-Node 组播组发送 NS 报文。NS 报文中目标地址即为该试验地址。如果收到某个 其他站点回应的 NA 报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通讯。 Host A 的 IPv6 地址 200::1 为新配置地址,即 200::1 为 Host A 的试验地址。Host A向 200::1 的被请求节点组播组发送一个以 200::1 为请求的目标地址的 NS 报文进行重复地址检测,由于 200::1 并未正式指定,所以NS 报文的源地址为未指定地址。当 Host B 收到该 NS 报文后,有两种处理方法: (1) 如果 Host B 发现 200::1 是自身的一个试验地址,则 Host B 放弃使用这个地址作为接口地址,且不会发送 NA 报文。 (2) 如果 Host B 发现 200::1 是一个已经正常使用的地址,Host B 会向 FF02::1 发送一个 NA 报文,该消息中会包含 200::1。这样,Host A 收到这个消息后就会发现自身 的试验地址是重复的。Host A 上该试验地址不生效,被标识为 duplicated 状态。 3、路由器发现 路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。 在 IPv6中,IPv6地址可以支持无状态的自动配置,即主机通过某种机制获取网络前缀 信息,然后主机自己生成地址的接口标识部分。路由器发现功能是 IPv6地址自动配置功 能的基础,主要通过以下两种报文实现: (1) 路由器通告 RA(Router Advertisement)报文:每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送 RA 报文,RA报文中会带有网络前缀信息,及其他一些标志位信息。RA 报文的 Type字段值为134。 (2) 路由器请求 RS(Router Solicitation)报文:很多情况下主机接入网络后希望尽 快获取网络前缀进行通信,此时主机可以立刻发送 RS 报文,网络上的设备将回应 RA 报文。RS 报文的 Tpye 字段值为 133。 4、跟踪邻居状态 通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。 RFC2461 中定义了 5 种邻居状态,分别是:未完成(Incomplete)、可达(Reachable)、 陈旧(Stale)、延迟(Delay)、探查(Probe)。 下面以A、B两个邻居节点之间相互通信过程中A节点的邻居状态变化为例(假设A、B之前从未通信),说明邻居状态迁移的过程。 1)A 先发送 NS 报文,并生成缓存条目,此时,邻居状态为 Incomplete。 2)若 B 回复 NA 报文,则邻居状态由 Incomplete 变为 Reachable,否则固定时间后邻居状态由 Incomplete 变为 Empty,即删除表项。 3)经过邻居可达时间,邻居状态由 Reachable 变为 Stale,即未知是否可达。 4)如果在 Reachable 状态,A 收到 B 的非请求 NA 报文,且报文中携带的 B的链路层 地址和表项中不同,则邻居状态马上变为Stale。 5)在 Stale 状态若 A 要向 B 发送数据,则邻居状态由 Stale 变为 Delay,并发送 NS 请求。 6)在经过一段固定时间后,邻居状态由 Delay变为Probe,其间若有NA应答,则邻居状态由 Delay 变为 Reachable。 7)在Probe状态,A每隔一定时间间隔发送单播NS,发送固定次数后,有应答则邻 居状态变为 Reachable,否则邻居状态变为 Empty,即删除表项。 5、 ICMP 的重定向 当网关路由器发现报文从其它网关路由器转发更好,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关路由器。重定向报文也承载在 ICMPv6报文中, 其 Type 字段值为137,报文中会携带更好的路径下一跳地址和需要重定向转发的报文的 目的地址等信息。 PC1 需要和 PC2 通信,PC1 的默认网关路由器是 R1,那么当 PC1 发送报文给 PC2时报文会被送到 R1。R1 接收到 PC1 发送的报文以后会发现实际上 PC1 直接发送给 R2更好,它将发送一个重定向报文给 PC1,其中报文中更好的路径下一跳地址为 R2,Destination Address 为 PC2(该部分为 ICMPv6 重定向报文携带的目的地址)。PC1 接收到 了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往 PC2的报文就直接发送给 R2。当路由器收到一个报文后,只有在如下情况下,路由器会向报文发送者发送重定向报文: (1) 报文的目的地址不是一个组播地址。 (2) 报文并非通过路由转发给路由器。 (3) 经过路由计算后,路由的下一跳出接口是接收报文的接口。 (4) 路由器发现报文的最佳下一跳 IP 地址和报文的源 IP 地址处于同一网段。 (5)路由器检查报文的源地址,发现自身的邻居表项中有用该地址作为全球单播地 址或链路本地地址的邻居存在。 6、PMTU 的工作过程 在 IPv6中,为了减少中间转发设备的处理压力,中间转发设备不对 IPv6报文进行分 片,报文的分片将在源节点进行。 Path MTU 工作过程 整条传输路径需要通过 4 条链路,每条链路的 MTU 分别是 1500、1500、1400、1300,当源节点发送一个分片报文的时候,首先按照 PMTU 为1500进行分片并发送分片报文,当到达 MTU 为 1400 的出接口时,路由器返回 Packet Too Big 错误,同时携带 MTU 值为1400的信息。源节点接收到之后会将报文重新按照 PMTU为1400进行分片并再次发送一个分片报文,当分片报文到达 MTU 值为 1300 的出接口时,同样返回 Packet Too Big 错误,携带 MTU 值为1300的信息。之后源节点重新按照 PMTU 为1300进行分片并发送分片报文,最终到达目的地,这样就找到了该路径的 PMTU。 |