目录
目录
一、前言介绍:
1.1、NDP简单说明:
1.2、ICMPv6-Internet控制报文协议
1.3、IPv6和IPv4相比有哪些优势?
二、IPv6邻居发现协议–NDP详解
2.1、IPv6地址解析
2.1.1、邻居请求(Neighbor solicition)NS
2.1.2、邻居通告(Neighbor Advertisement)NA
2.2、路由发现(地址解析使用的是NS与NA,路由发现使用RA与RS)
2.3、DAD重复地址检测
2.4、跟踪邻居状态
2.5、重定向过程(和IPv4机制相同)
一、前言介绍:
首先要说一下NDP协议是IPv6基础协议,例如IPv4中的ICMP ARP DHCP协议,在IPv6中使用NDP协议就可以都实现
1.1、NDP简单说明:
NDP(Neighbor Discovery Protocol,邻居发现协议) 这个协议靠ICMPv6协议发现,但是抓包抓不到NDP报文,可以抓icmpv6
是IPv6的一个关键协议,它组合了IPv4中的ARP、ICMP路由器发现和ICMP重定向等协议,并对它们作了改进。作为IPv6的基础性协议,NDP还提供了前缀发现、邻居不可达检测、重复地址监测、地址自动配置等功能。NDP利用的就是ICMPv6部分功能
1.2、ICMPv6-Internet控制报文协议
ICMPv6是IPV6的基础协议之一,用于向源节点传递报文转发的信息或错误
协议类型号(即:IPv6Next Header)为58
icmpv6可以提供icmpv4的的对应功能之外,还有其他一些功能的基础如邻居发现、无状态地址配置、重复地址检测、PMTU发现等。
消息类型:
1.3、IPv6和IPv4相比有哪些优势?
- v4是用arp广播试下地址解析和重复地址检测
- v6是用组播形式,减轻设备性能压力
- v6在三层完成地址解析,适用更多的链路层(介质独立性)
- v6在三层完成解析,可以使自身ipsec安全认证机制提高安全性,避免类似v4中的arp欺骗
二、IPv6邻居发现协议–NDP详解
在IPv4中,当主机需要和目标主机通信时,必须先通过ARP协议获得目的主机的链路层地址。在IPv6中,同样需要从IP地址解析到链路层地址的功能。邻居发现协议实现了这个功能。
ARP报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为ARP定位为第2.5层的协议。ND本身基于ICMPv6实现,以太网协议类型为0x86DD,即IPv6报文,IPv6下一个报头字段值为58,表示ICMPv6报文,由于ND协议使用的所有报文均封装在ICMPv6报文中,一般来说,ND被看作第3层的协议。在三层完成地址解析,主要带来以下几个好处:
- 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。
- 可以使用三层的安全机制避免地址解析攻击。
- 使用组播方式发送请求报文,减少了二层网络的性能压力。
(该协议使用icmpv6协议实现),wireshark抓不到NDP报文,只能抓到icmpv6报文
NDP使用的ICMPv6的相关报文 Type字段
- RS(router solicitation)路由器请求 type-133
- RA(router Advertisment)路由器通告报文 type-134
- NS(Neighbor solicition)邻居请求报文 type-135
- NA(Neighbor Advertisement):邻居通告报文) type-136
NDP功能点:
- 路由发现———–发现链路上的路由器,获得路由器通告的信息 RS RA报文
- 无状态自动配置–通知路由器通告的地址前缀,终端自动生成IPv6地址 NS NA报文
- DAD—————–获得地址后,进行地址重复检测,确保地址不存在冲突 NS NA报文
- 地址解析———–请求目的网络地址对应的数据链路层地址,类似IPv4的ARP NS NA报文
- 邻居状态跟踪—–通过NDP发现链路上的邻居并跟踪邻居状态 NS NA报文
- 前缀重编址——–路由器对所通告的地址前缀进行灵活设置实现网络重编址
- 路由重定向——–告知其他设备,到达目标网络的更优下一跳
被请求节点组播地址,都是以FF02::1:FF开头
2.1、IPv6地址解析
- IPv6的地址解析不在使用ARP,也不在使用广播方式,而是使用组播进行发送(原来IPv4是使用广播进行发送 who is XXX?)
- 地址解析在三层完成,针对不同的链路层协议可以采用相同的地址解析协议
- 通过ICMPv6(类型135的NS及类型136的NA报文)来实现地址解析
- NS报文发送使用组播方式,报文的目的IPv6地址为被请求的IPv6地址对应的“被请求节点组播地址”,报文的目的MAC为组播MAC
- 采用组播的方式发送NS消息相比于广播的方式更加的高效,也减少了对其他节点的影响和对二层网络的性能压力
- 可以使用三层的安全机制(例如IPSec)避免地址解析攻击
查看IPv6邻居表IPv6不像IPv4那样使用ARP表来缓存IP与MAC地址的映射,而是维护一个IPv6邻居表。display ipv6 neighbors 华为数通设备上查看IPv6邻居表。
netsh interface ipv6 show neighbors window系统CMD查看IPv6邻居表
IPv6的地址解析:
地址解析过程中使用了两种ICMPv6报文:邻居请求报文NS(Neighbor Solicitation)和邻居通告报文NA(Neighbor Advertisement)。
- NS报文:Type字段值为135,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP请求报文。
- NA报文:Type字段值为136,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP应答报文。
流程解析:
① R1要去R2ping包,但是不知道对方地址(即R1想要知道R2的MAC地址),所以R1会发送NS邻居请求报文(源为R1的IPv6地址),目的地址是(R2的被请求节点组播地址)(想请求2001:2设备的MAC地址,即需要解析的目标是R2的IPv6地址),同时需要指出的是在NS报文的Options字段中还携带了一个R1的MAC地址
② 当R2收到了NS报文后,就会回应NA报文,其中源地址为R2的IPv6地址,目的地址是R1的IPv6d地址(使用NS报文中的R1的MAC地址进行单播),R2的MAC地址被放在Options字段中,这样就完成了一个地址解析的过程
2.1.1、邻居请求(Neighbor solicition)NS
- Type=135 ,code=0
- Target Address 是需要解析的IPv6地址,因此该处不准出现组播地址。
- Option 中携带了一个自己源的MAC地址
2.1.2、邻居通告(Neighbor Advertisement)NA
- Type=136,Code=0
- R标志(Router flag)表示发送者是否为路由器,如果1则表示是;
- S标志(Solicited flag)表示发送邻居通告是否是响应某个邻居请求,如果1则表示是(0 例如路由器或PC重启后主动发送RA邻居通告,类似免费arp);
- O标志(Overide flag)表示邻居通告中的消息是否覆盖已有的条目信息,如果1则表示可以覆盖,如果是0则表示不可覆盖;
- Target Address表示所携带的链路层地址对应的IPv6地址。
- Options 携带了自己作为源的MAC地址
2.2、路由发现(地址解析使用的是NS与NA,路由发现使用RA与RS)
路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。
在IPv6中,IPv6地址可以支持无状态的自动配置,即主机通过机制获取网络前缀信息,然后主机自己生成地址的接口标识部分。路由器发现功能是IPv6地址自动配置功能的基础,主要通过以下两种报文实现:
- 路由器通告RA(Router Advertisement)报文:每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送RA报文,RA报文中会带有网络前缀信息,及其他一些标志位信息。RA报文的Type字段值为134。
- 路由器请求RS(Router Solicitation)报文:很多情况下主机接入网络后希望尽快获取网络前缀进行通信,此时主机可以立刻发送RS报文,网络上的设备将回应RA报文。RS报文的Tpye字段值为133。
地址自动配置:
IPv4使用DHCP实现自动配置,包括IP地址,缺省网关等信息,简化了网络管理。IPv6地址增长为128位,且终端节点多,对于自动配置的要求更为迫切,除保留了DHCP作为有状态自动配置外,还增加了无状态自动配置。无状态自动配置即自动生成链路本地地址,主机根据RA报文的前缀信息,自动配置全球单播地址等,并获得其他相关信息。
IPv6主机无状态自动配置过程:
- 根据接口标识产生链路本地地址。
- 发出邻居请求,进行重复地址检测。
- 如地址冲突,则停止自动配置,需要手工配置。
- 如不冲突,链路本地地址生效,节点具备本地链路通信能力。
- 主机会发送RS报文(或接收到设备定期发送的RA报文)。
- 根据RA报文中的前缀信息和接口标识得到IPv6地址。
2.3、DAD重复地址检测
重复地址检测DAD(Duplicate Address Detect)是在接口使用某个IPv6单播地址之前进行的,为了探测是否有其它的节点使用了该地址。
一个IPv6单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址(Tentative Address)。
此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES组播组和试验地址所对应的Solicited-Node组播组。
IPv6重复地址检测和IPv4中的免费ARP类似:节点向试验地址所对应的Solicited-Node组播组发送NS邻居请求报文。NS报文中目标地址即为该试验地址。如果收到某个其他站点回应的NA报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通讯。
2.4、跟踪邻居状态
通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。 因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。
RFC2461中定义了5种邻居状态:
- INCOMPLETE 未完成,邻居请求已经发送到目标节点的请求组播地址,但没有收到邻居的通告;
- REACHABLE 可达,收到确认,不续再发包确认;
- STALE 陈旧,从收到上一次可达性确认后过了超过30s;
- DELAY 延迟,在stale状态后发送过一个报文,并且5s内没有可达性确认;
- PROBE 探查,每隔1s重传邻居请求来主动请求可达性确认,直到收到确认。
邻居状态之间具体迁移过程:
- A先发送NS报文,并生成缓存条目,此时,邻居状态为Incomplete。
- 若B回复NA报文,则邻居状态由Incomplete变为Reachable,否则固定时间后邻居状态由Incomplete变为Empty,即删除表项。
- 经过邻居可达时间,邻居状态由Reachable变为Stale,即未知是否可达。
- 如果在Reachable状态,A收到B的非请求NA报文,且报文中携带的B的链路层地址和表项中不同,则邻居状态马上变为Stale。
- 在Stale状态若A要向B发送数据,则邻居状态由Stale变为Delay,并发送NS请求。
- 在经过一段固定时间后,邻居状态由Delay变为Probe,其间若有NA应答,则邻居状态由Delay变为Reachable。
- 在Probe状态,A每隔一定时间间隔发送单播NS,发送固定次数后,有应答则邻居状态变为Reachable,否则邻居状态变为Empty,即删除表项。
从以上的机制可以看出IPv6的邻居关系优于IPv4的ARP,IPv6的邻居关系维护机制确保通讯发起之前邻居是可达的,而ARP本身是做不到的,仅仅通过老化机制来实现。
关于邻居状态的维护以及状态迁移可以参考RFC2461。
注意1:像ARP报文一样,业务报文并不能刷新邻居表项 ,邻居表项智能靠NDP(icmpv6报文)刷新
注意2:即使一直通信,状态仍然会变迁到stale-delay,只是这个过程是短暂的,因为发送NS请求后,一旦对方回复了NA则状态又被刷新到Reachable
注意3:如果一直通信,则双方链路正常,则会一直在Reachable—>stale——>Delay状态循环变迁,只是停留在Stale和Delay状态时间很短。
注意4:邻居状态是Reachable、Stale、Delay、Probe时,表项依然有效,依然可以按邻居表封包发包,Incomplete不可用
特点:IPv6的邻居关系维护机制确保通讯发起之前邻居是可达的,而ARP本身是做不到的,仅仅通过老化机制来实现。
2.5、重定向过程(和IPv4机制相同)
- 当网关路由器知道更好的转发路径时,会以重定向报文的方式告知主机,添加主机路由,下次就会用更好的转发路由
- 重定向报文的结构如下:
PMTU(就是整条路径上的最小接口MTU)
IPv6报文在转发过程中是不进行分片的,IPv6报文仅在源节点进行分片,在目的节点进行组装.
国际组织规定 PMTU最小为1280字节(IPv6要求链路层所支持的MTU最小为1280字节)
最大的PMTU由链路层决定,如隧道,可以支持很大的MTU
icmp error:包太大,请用MTU=1300发送