IPv6 排障工具之 ping6 完整過程細節剖析

一、ICMPv6 簡介

ICMPv6(Internet Control Message Protocol for the IPv6)是 IPv6 的基礎協議之一。ICMPv6 具備向源地址報告關於向目的地傳輸 IPv6 數據包過程中的差錯信息和控制信息。

ICMPv6 定義了一些消息,如:目的不可達、數據包超長、超時、響應請求和響應應答等。在 IPv6 中,ICMPv6 除了提供 ICMPv4 常用的功能之外,還有其它一些功能,如鄰接點發現、無狀態地址配置(包括重複地址檢測)、PMTUD 等。

二、ICMPv6 報文格式

ICMPv6 報文格式如下圖所示:

IPv6 排障工具之 ping6 完整過程細節剖析

ICMPv6 屬於 OSI 七層協議棧的網絡層,雖然和 IPv6 屬於同一層,但是封裝時必須先封裝 IPv6 報文頭部

ICMPv6 字段註釋:

  • Type:表明消息的類型,0 至 127 表示差錯報文類型,128 至 255 表示信息報文類型。
  • Code:表示此消息類型細分的類型。
  • Checksum:表示 ICMPv6 報文的校驗和。

三、ICMPv6 差錯報文

ICMPv6 差錯報文用於報告在轉發 IPv6 數據包過程中出現的錯誤,可以分為以下 4 種:

1. 目的不可達錯誤報文

在 IPv6 中間設備轉發 IPv6 報文過程中,當設備發現目的地址不可達時,就會向發送報文的源地址發送 ICMPv6 目的不可達錯誤報文,同時報文中會攜帶引起該錯誤報文的具體原因。

目的不可達錯誤報文的 Type 字段值為 1,根據錯誤具體原因又可以細分為:

Code=0:沒有到達目標設備的路由。

Code=1:與目標客戶端的通信被管理策略禁止。

Code=2:未指定。

Code=3:目的 IP 地址不可達。

Code=4:目的端口不可達。

2. 數據包過大錯誤報文

在 IPv6 中間設備轉發 IPv6 報文過程中,發現報文超過出接口的鏈路 MTU 時,則向發送報文的源地址發送 ICMPv6 數據包過大錯誤報文,其中攜帶出接口的鏈路 MTU 值。數據包過大錯誤報文是 Path MTU 發現機制的基礎。

數據包過大錯誤報文的 Type 字段值為 2,Code 字段值為 0。

3. 時間超時錯誤報文

在 IPv6 報文收發過程中,當設備收到 Hop Limit 字段值等於 0 的數據包,或者當設備將 Hop Limit 字段值減為 0 時,會向發送報文的源地址發送 ICMPv6 超時錯誤報文。對於分段重組報文的操作,如果超過定時時間,也會產生一個 ICMPv6 超時報文。

時間超時錯誤報文的 Type 字段值為 3,根據錯誤具體原因又可以細分為:

Code=0:在傳輸中超越了跳數限制。

Code=1:分片重組超時。

當目的節點收到一個 IPv6 報文時,會對報文進行有效性檢查,如果發現問題會向報文的源地址回應一個 ICMPv6 參數錯誤差錯報文。

參數錯誤報文的 Type 字段值為 4,根據錯誤具體原因又可以細分為:

Code=0:IPv6 基本頭或擴展頭的某個字段有錯誤。

Code=1:IPv6 基本頭或擴展頭的 NextHeader 值不可識別。

Code=2:擴展頭中出現未知的選項。

四、ICMPv6 信息報文

ICMPv6 信息報文提供診斷功能和附加的主機功能,比如組播偵聽發現和鄰居發現。

常見的 ICMPv6 信息報文主要包括回應請求報文(Echo Request)和回應應答報文(Echo Reply),這兩種報文也就是通常使用的 Ping6 報文。可以分為以下 2 種:

1. 回應請求報文

回應請求報文用於發送到目標地址,以使目標地址立即發回一個回應應答報文。回應請求報文的 Type 字段值為 128,Code 字段的值為 0。

2. 回應應答報文

當收到一個回應請求報文時,ICMPv6 會用回應應答報文響應。回應應答報文的 Type 字段的值為 129,Code 字段的值為 0。

五、ping6 完整過程梳理

如下圖所示,雲主機 CVM1 要和 CVM2 通信(假設 CVM 的 IPV6 地址和 VPC 已經按文檔 https://cloud.tencent.com/document/product/213/40010 正常配置且 IPV6 路由和地址檢查都正常)。

IPv6 排障工具之 ping6 完整過程細節剖析

從 CVM1 輸入命令 ping6 2402:4e00:1200:2001::2020 -c 10,輸出的結果如下圖所示:

IPv6 排障工具之 ping6 完整過程細節剖析

這是一次成功的 ping6 測試,但是這次 ping6 的細節大家也許不太瞭解。接下來我們主要按 OSI 協議棧來剖析整個 ping6 的工作過程以及整個過程會用到的相關報文。

Step1:ICMPv6 創建一個 56 字節的回應請求:

IPv6 排障工具之 ping6 完整過程細節剖析

Step2:ICMPv6 在 56 字節的請求數據基礎上加上 ICMPv6 頭部:

IPv6 排障工具之 ping6 完整過程細節剖析

回應請求報文的 Type 字段值為 128,Code 字段的值為 0,然後交給 IPv6 協議封裝;

Step3:IPv6 協議在 ICMPv6 基礎上增加 IPv6 頭部:(網絡層封裝)

IPv6 排障工具之 ping6 完整過程細節剖析

封裝的源 IPv6 地址是接口網卡 v6 地址:2402:4e00:1200:2002::2011

封裝的目標 IPv6 地址:2402:4e00:1200:2001::2020

Step4:根據目標 IPv6 地址和本地網段前綴做對比,發現目標地址不屬於本地網段 2402:4e00:1200:2002::/64。只能查路由表進行跨網段路由,查找路由表發現沒有匹配的明細路由,最終只能選擇默認路由::/0 進行轉發。

IPv6 排障工具之 ping6 完整過程細節剖析

Step5:通過默認路由找到可以通過網卡 eth0 進行轉發,但是需要數據鏈路層封裝成功後才能從網卡轉發出去。數據鏈路層封裝的源 MAC 就是出接口 eth0 的 MAC 地址,目標 MAC 地址要從 ip -6 neigh 表(類似 IPv4 的 ARP 表)中查詢到。

IPv6 排障工具之 ping6 完整過程細節剖析

這裡並沒有學習到目標 IPv6 地址 2402:4e00:1200:2001::2020 對應的 MAC 地址,導致無法進行數據鏈路層封裝。

Step6:為了學習到目標地址 2402:4e00:1200:2001::2020 對應的 MAC 地址,首先發送 NS 報文:Type 字段值為 135,Code 字段值為 0,在地址解析中的作用類似於 IPv4 中的 ARP 請求報文。

IPv6 排障工具之 ping6 完整過程細節剖析

這裡面存在著兩個問題,下面我們也會給出相應的解釋:

(1)被請求節點組播 IPv6 地址 FF02::1:FF00:2020 如何生成?

IPv6 中沒有廣播地址,也不使用 ARP。但是仍然需要從 IP 地址解析到 MAC 地址的功能。

在 IPv6 中,這個功能通過鄰居請求 NS(Neighbor Solicitation)報文完成。當一個節點需要解析某個 IPv6 地址對應的 MAC 地址時,會發送 NS 報文,該報文的目的 IP 就是需要解析的 IPv6 地址對應的被請求節點組播地址,只有具有該組播地址的節點會檢查處理。

被請求節點組播地址由前綴 FF02::1:FF00:0/104 和目標單播地址的最後 24 位組成。由於目標單播地址是 2402:4e00:1200:2001::2020, 所以生成的被請求節點組播地址是:FF02::1:FF00:2020。

(2)被請求節點組播 MAC 地址 33:33:ff:00:20:20 如何生成?

組播 MAC 地址 48bit 的前 24bit 默認固定是 33:33:ff,後半部分是被請求節點組播地址的後 24bit,所以生成的組播 MAC 地址是 33:33:ff:00:20:20。

Step7:CVM1 發送的 NS 請求報文給到虛擬網關路由器,虛擬網關路由器收到 NS 報文後查看路由表匹配到路由 2402:4e00:1200:2001::/64,代理目標地址回覆一個 NA 報文:Type 字段值為 136,Code 字段值為 0,在地址解析中的作用類似於 IPv4 中的 ARP 應答報文。

IPv6 排障工具之 ping6 完整過程細節剖析

IPv6 地址解析示意圖:

IPv6 排障工具之 ping6 完整過程細節剖析

學習到目標地址 2402:4e00:1200:2001::2020 對應的 MAC 地址是 fe:ee:1e:1b:cb:e0。學習到的 MAC 存入到 IPV6 鄰居表中:

IPv6 排障工具之 ping6 完整過程細節剖析

Step8:回到 Step5 有了目標 IPv6 地址 2402:4e00:1200:2001::2020 對應的 MAC 地址可以進行數據鏈路層封裝,然後從網卡 eth0 發出第一個 ICMPv6 的回應請求報文:

IPv6 排障工具之 ping6 完整過程細節剖析

從第一個 NS 到第一個 ICMPv6 回應請求的發出順序如下:(CVM1 的網卡抓包)

IPv6 排障工具之 ping6 完整過程細節剖析

Step9:該回應請求報文到達虛擬網關路由器 A 後查路由表找到對應的 overlay 網絡隧道(這裡的虛擬網關和 overlay 網絡暫不用展開)轉發到目標虛擬網關路由器 B,然後由虛擬網關路由器 B 轉發給 CVM2 的 eth0 網卡。

IPv6 排障工具之 ping6 完整過程細節剖析

Step10:CVM2 的網卡 eth0 收到回應請求報文後通過二層幀頭的 type 字段,確認遞交給 IPv6 協議處理。

IPv6 排障工具之 ping6 完整過程細節剖析

Step11:IPv6 協議處理頭部,檢查目標 IP 正確,檢查下一個協議頭部類型是 ICMPv6。

IPv6 排障工具之 ping6 完整過程細節剖析

IPv6 排障工具之 ping6 完整過程細節剖析

Step12:當收到一個回應請求報文時,ICMPv6 會用回應應答報文響應。回應應答報文的 Type 字段的值為 129,Code 字段的值為 0。

CVM2 按同樣的方式去查路由表封裝網絡層報文,按 Step5 到 Step7 解析到 MAC 後,查 ipv6 鄰居表封裝數據鏈路層的目的 MAC。

具體 CVM2 從收到第一個回應請求報文到發出第一個回應應答報文順序如下:

IPv6 排障工具之 ping6 完整過程細節剖析

IPv6 排障工具之 ping6 完整過程細節剖析

IPv6 排障工具之 ping6 完整過程細節剖析

學習到 MAC 後發送回應應答報文:

IPv6 排障工具之 ping6 完整過程細節剖析

Step13:該回應應答報文到達虛擬網關路由器 B 後查路由表找到對應的 overlay 網絡隧道轉發到目標虛擬網關路由器 A,然後由虛擬網關路由器 A 轉發給 CVM1 的 eth0 網卡。

Step14:CVM1 和 CVM2 以及虛擬路由器 A 和 B 都已經緩存了對應 IPv6 地址的 MAC,後續封裝無效再發送 NS 與 NA,直接數據鏈路層封裝後路由轉發即可。

CVM1 完整的 10 個 ping6 報文截圖如下:

IPv6 排障工具之 ping6 完整過程細節剖析

CVM2 完整的 10 個 ping6 報文截圖如下:

IPv6 排障工具之 ping6 完整過程細節剖析

CVM1 的 ping6 成功的截圖如下:

IPv6 排障工具之 ping6 完整過程細節剖析

到此一次完整的 ping6 的過程就結束了,同樣的道理,其他協議報文也是有這樣的一個封裝和解封裝過程,希望本文能夠讓對大家有所幫助。


分享到:


相關文章: