我们都知道,为了实现数据包在数据链路层的封装,需要有一个机制来发现网络中IP地址和MAC地址的对应关系。在IPv4协议栈中,该机制为ARP协议,而在IPv6中,该机制的实现是基于NDP(Neighbor Discovery Protocol邻居发现)协议,今天,我就来给大家介绍一下IPv6的NDP协议。
本文涉及到一些IPv6的理论知识,要想读懂本文,您需要又一定的IPv6的基础,如果您对IPv6还不是很熟悉,欢迎查阅一下文章:IPv6报文格式讲解及其科学性探究IPv6地址简介IPv6各地址计算方式汇总

一、NDP协议简介
NDP,Neighbor Dicovery Protocol,邻居发现协议,是在ICMPv6版本定义的一种协议。在IPv4中,ICMP协议主要就是通过PING,检测网络的连通性。而在IPv6中,ICMPv6协议除了用来检测网络连通性外,还需要完成地址解析的任务。因此,如果没有ICMPv4协议,那么在IPv4中可能只是无法使用PING命令而已,但是对于IPv6,如果没有IPv6,可能无法完成网络的互联,因此,ICMPv6协议在IPv6协议栈中起到了越来越重要的作用。
在NDP协议中,一共定义了5种报文:
1、RA报文,即Router Advertisement,路由器公告报文,该报文主要是路由器用来周期性的发布自身的hop limit 、link MTU等消息。
2、RS报文,即Router Solicitation,路由器信息请求报文,该报文用于请求RA报文,当设备刚上线时,可能会使用该报文请求路由器发送RA报文,该报文可以使得路由器立即发送RA报文而不用等待RA周期。
3、NS报文,即Neighbor Solicitation,邻居请求报文,该报文用于请求地址解析。
4、NA报文,即Neighbor Advertisements,邻居公告报文,该报文用于答复NS报文,完成地址解析和报文刷新等功能。
5、Redirect报文,当路由器发现更好的报文转发路径时,会使用该报文通知其他设备。
而要完成IPv6的地址解析功能,所用到的就是NS和NA报文。在IPv6实现地址解析,与IPv4有两点很大的不同:
①IPv4的ARP协议是链路层封装协议,没有涉及到IP地址的概念,而IPv6实现的地址解析是网络层协议,在发送NS和NA报文时,需要封装源IP地址和目的IP地址。
②IPv4中,ARP协议使用了广播的MAC地址,而在IPv6中,因为没有广播的定义,因此在IPv6中在进行地址解析的时候,所有的广播功能实现都是基于组播,而使用的组播报文,就是在下面介绍的被请求节点组播报文。

二、被请求节点组播地址简介
被请求节点组播地址是IPv6中组播地址的一种。该中形式的组播在scope字段为2,因此该组播地址前面都是一样的,为:
ff02::1:ff
该种形式的组播只有后24bit不同。并且后面的24bit的具体数值,就是该地址所对应的IPv6单播地址的后24bit。有关该地址的计算详情请见IPv6各地址计算方式汇总
在IPv6实现地址解析的时候,都是先由被解析一方的IPv6单播地址,计算出该地址对应的被请求节点组播地址,然后再由该地址计算出组播MAC地址,最后完成封装的。

三、NS、NA报文详解
尽管IPv6的地址解析实现与IPv4有很多的不同,但是其基本原理都是一样的,他们的目的都是询问一个IP地址所对应的MAC地址。在本节,我将从NS和NA报文的细节入手,还原IPv6地址解析的全过程:
对于发送NS报文的一方,必然是要向同网段的IPv6地址尝试发数据包的一方,如果该设备不知道目的IPv6地址所对应的MAC地址,就无法完成数据包在数据链路层的封装,因此在发送数据包之前,他就必须先发送NS数据包,来询问该IPv6地址所对应的MAC地址。
在NS报文中,完成上述功能最重要的是target字段和option字段,这就类似于IPv4中ARP的源目MAC地址和源目IP地址相似。target字段就是要解析的IP地址,而option字段就是发送方的MAC地址。NS和NA报文,就是通过这两个字段,以及源目IP地址,来实现的地址解析功能,下面的讲解就着重介绍一下NS和NA报文中这两个字段的封装。
假设网络拓扑如下所示:


假设R1要PING R2
NS报文:
对于R1发送给的NS报文来说,源IP地址肯定是自己的IP地址,即2000::1,而目的IP地址则要填写R2的IPv6地址对应的被请求节点组播地址,很容易计算得到该地址为ff02::1:ff00:2。在ICMPv6报文中,target字段为R2 的IPv6地址,即2000::2,而option字段为R1的MAC地址。
因此,最后得到的NS报文为:

源MAC:R1的MAC地址
目的MAC:3333:ff00:2
	源IP:2000::1
	目的IP:ff02::1:ff00:2
	ICMP:
		target:2000::2
		option:R1的MAC地址

NA报文:
对于R2给R1回复的NA报文,源IP地址是R2自己的IPv6地址,目的IP地址是R1的IP地址,即2000::1,target还是R2的IPv6地址——2000::2,option为R2的MAC地址。
因此,最后的NA报文为:
源MAC:R2的MAC地址
目的MAC:R1的MAC地址
	源IP:2000::2
	目的IP:2000::1
	ICMP:
		target:2000::2
		option:R2的MAC地址
四、抓包验证
最后,我采用一个小的实验,实现了NS和NA报文完成地址解析的功能,在实验过程中,抓取数据包如下:
NS、NA数据包如下:

在NS报文中target和option字段如下:

在NA报文中target和option字段如下:

原文链接:https://blog.csdn.net/weixin_40228200/article/details/118652282

点赞(2) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部