ICMPV6协议及NDP协议

一、ICMPV6

    1、基于ipv6的ICMPv6(Internet control message protocol for IPv6)是 IPv6 下的 Internet 控制报文协议;在 IPv6 中,ICMPv6 整合实现了 IPv4 中的 ICMP(ping命令)、ARP 以及 IGMP 的所有功能,主要包括错误报告、网络诊断(ping6命令)、邻居发现、多播实现和重定向等。

    2、在IPv6包头中,NextHeader=58则表示IPv6包头后封装着一个ICMPv6消息

ICMPV6协议及NDP协议_第1张图片

    3、ICMPV6报文

ICMPV6协议及NDP协议_第2张图片ICMPV6协议及NDP协议_第3张图片

(1)Type:表示 ICMPv6 报文的类型,当取值介于 0 到 127 之间时,表示该报文为错误报文(如目的不可达、超时等),当取值在 128 到 255 之间时,则表示该报文为信息报文。

(2)Code:表示此消息类型(Type)细分的类型,具体区分每种消息类型的错误信息,如目的不可达可能是防火墙导致的,也可能是路由错误导致的。

(3)Checksum:校验和,校验的部分包括了 IPv6 伪首部和ICMPv6报文。IPV6伪首部包含4个部分:16字节的sourse address, 16字节的destination addrss,2字节的 payload length, 1字节的next header。

ICMPV6协议及NDP协议_第4张图片

注:ICMPv6消息类型中有5种是为了支持邻居发现协议而定义的。

TYPE CODE 消息名称  
133 0 路由器请求(RS)  
134 0 路由器通告(RA)  
135 0 邻居请求(NS)  
136 0 邻居通告(NA)  
137 0 重定向报文  

二、邻居发现协议NDP

    邻居发现协议NDP是通过 Internet 控制报文协议(ICMPv6)报文来承载的;在一个IPv6数据报中,如果该数据报的“下一个报头”字段的值为 58,且 ICMPv6 报文中类型字段取值范围为133-137,则此IPv6报文的数据部分含有邻居发现协议报文。NDP使用ICMPv6报文实现地址解析,跟踪邻居状态,重复地址检测,路由器发现以及重定向等功能。,格式如图 3-1 所示。

ICMPV6协议及NDP协议_第5张图片ICMPV6协议及NDP协议_第6张图片

  1、路由请求报文(Router Solicitation Message,RS)

  2、路由通告报文(Router Advertisement Message,RA)

 

 

3、邻居请求报文NS(Neighbor Solicitation Message,NS)

     (1)功能

             《1》邻居请求报文可以用来完成ARP的功能(地址解析)

                      NS 报文包含发送方的源链路层mac地址,IPV6首部中:当进行地址解析时,目的IPV6地址是一个多播地址

             《2》可以用来探测目的主机的连通性(跟踪邻居状态)

                     而在验证某相邻节点是否可达时,IPV6首部中:目的地址是邻居的单播地址

             《3》可以用来验证自己的地址在本地链路上是否唯一,IPV6首部中:目的地址是邻居的多播地址。

                     探测是否有其它的节点使用了该地址。(重复地址检测)

    (2)NS报文格式

    ICMPV6协议及NDP协议_第7张图片

 

类型:135,表示该ICMPV6报文是邻居请求报文。

代码:必须置0。

目的IPV6地址:即要解析的IPV6地址。

选项:发送此消息主机的链路层地址。

注:IPV6首部里,源IPV6地址:发送 NS 报文的接口地址;目的IPV6地址:被请求节点多播地址(地址解析或重复地址检测时)或单播的 Target 地址(邻居不可达检测时)。

  4、邻居通告报文NA(Neighbor Advertisement Message,NA)

ICMPV6协议及NDP协议_第8张图片

类型:136,表示该ICMPV6报文是邻居通告报文。

代码:必须置0。

R:路由器(Router)标志。当 R 置 1 时,表示发送者是一个路由器。R比特用于邻居不可达检测机制,检测一个路由器是否改变为主机。

S:被请求(Solicited)标志。当 S 置 1 时,表示发送这个 NA 是用于响应一个 NS 的。  S 比特在邻居不可达检测机制中用于可达性的确认。在组播的NA(DAD)和主动发送的 NA 中,S 比特一定不能置 1。

O:重载(Override)标志。当 O 置 1 时,表示这个 NA 应该更新已存在的邻居缓存表项中的 link-layer 地址。当 O 置 0 时,只有在邻居缓存的表项中没有链路层地址时,这个 NA 才可以更新邻居缓存表项。

目的IPV6地址:对于被请求的 NA 消息,Target address 应与相应 NS 中的Target Address 相同。

选项:目标节点请求的链路层地址,响应多播的 NS 时(DAD、地址解析),必须使用该选项;响应单播的NS 时(NUD),可以使用该选项。

注:IPV6首部中,源 IPv6 地址:发送 NA 所用的接口的地址;目的 IPv6 地址:对于被请求的 NA 报文,目的地址为单播地址(使用 NS报文中的源 IPv6 地址);所响应的 NS 报文中源 IPv6 地址为未指定地址,或对于主动发送的 NA 报文,则目的地址使用所有节点组播地址(FF02::1)。

交互过程:

《1》地址解析

      (1)PC A在向PC B发送报文之前它要先解析出PC B的MAC地址,所以首先PC A会发送一个NS报文,其中源IP地址为PC A的IPv6地址,目的IP地址为PC B的被请求节点组播地址(前缀F02::1:F/104,并结合请求IPv6地址中的低24位,具体细节请参阅上一期),需要解析的目标IP为PC B的IPv6地址,这就表示PC A想要知道PC B的MAC地址。同时,NS报文还携带了PC A的MAC地址。
      (2)当PC B接收到了NS报文之后,就会回应NA报文,其中源地址为PC B的IPv6地址,目的地址为PC A的IPv6地址(使用NS报文中的PC A的MAC地址进行单播),同时包含PC B的MAC地址。这样就完成了一次地址解析的过程。

ICMPV6协议及NDP协议_第9张图片

《2》跟踪邻居状态

      通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。

RFC2461中定义了5种邻居状态,分别是:

  1. 未完成(Incomplete)
  2. 可达(Reachable)
  3. 陈旧(Stale)
  4. 延迟(Delay)
  5. 探查(Probe)

邻居状态的具体迁移过程如下图所示: 

ICMPV6协议及NDP协议_第10张图片

下面以A、B两个邻居节点之间相互通信过程中A节点的邻居状态变化为例(假设A、B之前从未通信),说明邻居状态迁移的过程。

  1. A先发送NS报文,并生成缓存条目,此时,邻居状态为Incomplete。
  2. 若B回复NA报文,则邻居状态由Incomplete变为Reachable,否则固定时间后邻居状态由Incomplete变为Empty,即删除表项。
  3. 经过邻居可达时间,邻居状态由Reachable(默认30s)变为Stale,即未知是否可达。
  4. 如果在Reachable状态,A收到B的非请求NA报文(MAC地址修改),且报文中携带的B的链路层地址和表项中不同,则邻居状态马上变为Stale。
  5. 在Stale状态若A要向B发送数据,则邻居状态由Stale变为Delay,并发送NS请求。
  6. 在经过一段固定时间后,邻居状态由Delay(默认5s)变为Probe(每隔1s发送一次NS报文,连续发送3次),其间若有NA应答,则邻居状态由Delay变为Reachable。
  7. 在Probe状态,A每隔一定时间间隔z(1s)发送单播NS,发送固定次数(3)后,有应答则邻居状态变为Reachable,否则邻居状态变为Empty,即删除表项。

 

《3》重复地址检测 

 

      重复地址检测DAD(Duplicate Address Detect)是在接口使用某个IPv6单播地址之前进行的,主要是为了探测是否有其它的节点使用了该地址。尤其是在地址自动配置的时候,进行DAD检测是很必要的。一个IPv6单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址(Tentative Address)。此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES组播组和试验地址所对应的Solicited-Node组播组。

      IPv6重复地址检测技术和IPv4中的免费ARP类似:节点向试验地址所对应的Solicited-Node组播组发送NS报文。NS报文中目标地址即为该试验地址。如果收到某个其他站点回应的NA报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通讯。

重复地址检测原理如下:

ICMPV6协议及NDP协议_第11张图片

      Host A的IPv6地址FC00::1为新配置地址,即FC00::1为Host A的试验地址。Host A向FC00::1的Solicited-Node组播组发送一个以FC00::1为请求的目标地址的NS报文进行重复地址检测,由于FC00::1并未正式指定,所以NS报文的源地址为未指定地址。当Host B收到该NS报文后,有两种处理方法:

  1. 如果Host B发现FC00::1是自身的一个试验地址,则Host B放弃使用这个地址作为接口地址,并且不会发送NA报文。
  2. 如果Host B发现FC00::1是一个已经正常使用的地址,Host B会向FF02::1发送一个NA报文,该消息中会包含FC00::1。这样,Host A收到这个消息后就会发现自身的试验地址是重复的。Host A上该试验地址不生效,被标识为duplicated状态。

 

三、本地链路地址:link-local address 

     当在一个节点启用IPV6,启动时节点的每个接口自动生成一个link-local address

其前缀64位为标准指定的,其后64位按EUI-64格式来构造

注意:在本链路上,路由表中看到的下一跳都是对端的Link Local地址,不是公网IP地址

前缀:FE80::/10

范围:只能在本地链路使用,不能在子网间路由

为何需要link-local?

--在一个接口可以配置很多IPv6地址所以学习路由就有可能出现很多下一跳。

所以出现Link Local地址唯一标识一个节点。在本地链路看到下一跳都是对端的Link Local地址。

在网络重新编址过程中,节点和路由器的Link Local地址不会发生变化,可以很容易地做一个修改,不用担心网络不可达。

   

你可能感兴趣的:(ICMPV6协议及NDP协议)