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報文的主機都要進行處理,進一步分析發現不是給它的才會丟棄。


分享到:


相關文章: