02.29 IPv6 主机通信与邻居状态变化

我们知道在 IPv6 中已没有 IPv4 中 ARP 协议的概念。那么在 IPv6 中主机之间如何通信呢?NDP(邻居发现协议)。话不多说,进入正题

  1. 用 GNS3 做实验,使用 wireshark 抓包。


IPv6 主机通信与邻居状态变化

配置如下代码块


IPv6 主机通信与邻居状态变化

Ping包

<code>R1:
ipv6 unicast-routing
int g0/0
ipv6 address fe80::1/64
ipv6 address 2001::1/64
no shutdown
exit
ping ipv6 2001::2 repeat 1

R2:
ipv6 unicast-routing
int g0/0
ipv6 address fe80::2/64
ipv6 address 2001::2/64
no shutdown/<code>

通过 wireshark 抓包可以看到在执行 ping 之前,分别有 NS(邻居请求) 和 NA(邻居通告) 的报文,下面我们详细看下包的内容:


IPv6 主机通信与邻居状态变化

NS报文(neighbor solicitation)

我 R1知道 R2的IP地址,但并不知道 R2 的MAC地址,这个时候R1会发送一个邻居请求,而这个请求的地址正是R2的被请求的节点组播地址,MAC地址为被请求节点的组播地址所映射的MAC地址。

简单介绍下Solicited-Node Address 和 被请求多播地址映射的MAC地址。

RFC 4291:

Solicited-Node Address: FF02:0:0:0:0:1:FFXX:XXXX

Solicited-Node multicast address are computed as a function of a node's unicast and anycast addresses. A Solicited-Node multicast address is formed by taking the low-order 24 bits of an address (unicast or anycast) and appending those bits to the prefix FF02:0:0:0:0:1:FF00::/104 resulting in a multicast address in the range

意思是说Solicited-Node Address 是由固定的 FF02:0:0:0:0:1:FF00::/104 前缀和单播或任意播的24个低比特位组成。这样就可以通过2001::2 这个IP地址计算出Solicited-Node Address:FF02:0:0:0:0:1:FF00:2(1111 1111 0000 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1111 1111 0000 0000 0000 0000 0000 0010),接着在通过这个Solicited-Node Address得出以太网的多播MAC:33-33-ff-00-00-02。这个MAC是通过固定的多播以太网前缀(48比特位) 33-33 加上被请求节点多播地址的低32个比特位,当然此处是要二进制转16进制的。


而上述的这个请求的多播地址R2是时刻在侦听的,当它收到这个请求后,首先在数据链路层被轻轻就节点的网卡会先处理该数据包的目的MAC地址,发现正是该节点的被请求节点多播地址映射的MAC地址(之一),则处理这个数据包,检验合法性后交由网络层继续处理。网络层收到数据包后,发现跟自己的

Solicited-Node Address一致,则认为此数据包就是发给自己的,然后就会处理回应 R1,此时的回应是单播帧,因为在R1请求的报文中包含了R1自己的IP地址和MAC地址,所有R2可以直接发送单播帧给到R1。此时开始正式进行上层数据的传送


IPv6 主机通信与邻居状态变化


IPv6 主机通信与邻居状态变化

R2回复R1的NA报文

这也是为什么IPv6比IPv4更优的原因之一。即使说当一个网络当中有多个相同的Solicited-Node Address 地址前缀,那么所影响的主机也只是部分,而ARP就是全部主机。并且IPv4中每个收到ARP报文的主机都要进行处理,进一步分析发现不是给它的才会丢弃。


分享到:


相關文章: