天天看點

《深入解析IPv6(第3版)》——10.2 IPv6端到端的傳輸過程

本節書摘來自異步社群《深入解析ipv6(第3版)》一書中的第10章,第10.2節,作者: 【美】joseph davies 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

在下面這一節中,我們将描述發送主機發出ipv6包,經過一個或多個ipv6路由器,并由最終目的接收的過程。在這個示例中,我們假設資料沒有出現“逐跳可選項”、“目的可選項”和“路由”擴充頭部。

10.2.1 發送方主機的ipv6

當ipv6主機向任意單點傳播目的位址發送資料包時,會使用如下算法。

1.将跳數限制字段值設定為預設值或應用指定值。

2.在目的緩存中查找比對目的位址的條目。對運作windows server 2012、windows server 2008 r2、windows server 2008、windows 8、windows 7和windows vista的計算機,可以使用指令netsh interface ipv6 show destinationcache來檢視目的緩存。

3.如果在目的緩存中找到了比對目的位址的一個條目,則在目的緩存中擷取下一跳位址和接口。跳到第9步。

4.如果沒有資料包的源位址,則執行非限制路由查找。

5.如果有資料包的源位址,且源接口啟用了強主機發送行為,則執行限制路由查找。

6.如果有資料包的源位址,且源接口禁用了強主機發送行為,則執行非限制路由查找。

7.如果有最長比對的可用路由,則通過該路由判斷轉發資料包的下一跳接口和位址。

如果沒有最長比對的可用路由,提示錯誤。

8.更新目的緩存。

9.在鄰居節點緩存中檢查與下一跳位址比對的條目。對運作windows server 2012、windows server 2008 r2、windows server 2008、windows 8、windows 7和windows vista的伺服器,可以使用netsh interface ipv6 show neighbors指令檢視鄰居節點緩存。對于運作windows server 2012和windows 8系統的計算機,也可以使用windows powershell指令get-netneighbor來檢視鄰居節點緩存。

10.如果在鄰居節點緩存中找到與下一跳位址比對的條目,則獲得鍊路層位址。轉到第12步。

11.如果在鄰居節點緩存中沒有找到與下一跳位址比對的條目,則使用位址解析以獲得下一跳位址的鍊路層位址,并在目的緩存中添加條目。

如果位址解析不成功,提示錯誤。

12.使用鄰居節點緩存條目的鍊路層位址來發送資料包。

注釋

對于配置設定給發送方主機的單點傳播目的位址,ipv6會跳過第9步到第11步之間的過程。

圖10-1所示為發送主機過程。

10.2.2 路由器的ipv6

當接收并轉發資料包到任意單點傳播或任播目的位址時,ipv6路由器會執行如下算法。

1.執行可選的頭部錯誤檢查,例如確定版本字段設定為6以及源位址不是環回位址(::1)或多點傳播位址。

2.驗證ipv6資料包中的目的位址是否對應于配置設定給路由器接口的位址。

如果是,則将ipv6資料包作為目的主機處理(參閱本章“目的主機的ipv6”小節的第3步)。

3.将跳數限制字段的值減1。

如果跳數限制字段的值小于1,則向發送者發送“icmpv6逾時-超過傳輸消息中的跳數限制”消息,并丢棄這個資料包。

4.如果跳數限制字段的值大于0,則更新資料包中ipv6頭部的跳數限制字段。

5.在目的緩存中查找與目的位址比對的條目。

《深入解析IPv6(第3版)》——10.2 IPv6端到端的傳輸過程

https://yqfile.alicdn.com/d086ccc585ddc4026737d4a683592658bc6014f1.png" >

如果在目的緩存中找到與目的位址比對的條目,則從目的緩存條目中獲得下一跳接口和位址。轉到第9步。

6.檢查本地ipv6路由表,選擇到達目的ipv6位址最長比對而又度量最小的可用路由。

7.根據選中的路由确定下一跳位址和用于轉發資料包的位址。

如果沒有找到路由,則向發送主機發送“icmpv6目的不可達-沒有到達目的位址的路由”消息,并丢棄這個資料包。

9.如果接收到資料包的接口與資料包正在被轉發的接口相同,同時接口是點到點鍊路,并且目的位址字段與接口配置設定的字首比對,則向發送主機發送“icmpv6目的不可達-位址不可達”消息并丢棄這個資料包。這避免了在點到點鍊路上的兩個接口之間毫無意義地來回轉發ipv6資料包,這個資料包目的位址與點到點鍊路的字首比對,但是并不比對其中任何一個接口的位址。

10.如果接收到資料包的接口和資料包正在被轉發的接口一樣,并且源位址字段與接口配置設定的字首比對,則向發送方主機發送重定向消息。

11.将下一跳接口的鍊路最大傳輸單元(mtu)和正在被轉發的ipv6資料包的尺寸進行比較。

如果鍊路mtu小于資料包長度,則向發送主機發送“icmpv6資料包過大”消息并丢棄資料包。

12.在鄰居節點緩存中查找與下一跳位址比對的條目。

13.如果在鄰居節點緩存中找到了與下一跳位址相比對的條目,則獲得鍊路層位址。轉到第15步。

14.如果在鄰居節點緩存中沒有找到與下一跳位址比對的條目,則通過位址解析來獲得下一跳位址的鍊路層位址并向鄰居節點緩存中添加條目。

如果位址解析失敗,則向發送主機發送“icmpv6目的不可達-位址不可達”消息并丢棄這個資料包。

15.使用鄰居節點緩存條目的鍊路層位址發送資料包。

圖10-2和圖10-3所示為路由器轉發過程。

在源和目的主機之間的每台路由器上都會重複這整個過程。

10.2.3 目的主機的ipv6

當接收到ipv6資料包時,ipv6主機會執行如下算法。

2.驗證ipv6資料包中的目的位址是否對應于配置設定給本地主機接口的ipv6位址。

如果該目的位址沒有配置設定給本地主機接口,則丢棄這個ipv6資料包。

3.如果對于接收的資料包支援強主機模式,則驗證接收資料包的接口是否配置設定了ipv6資料包中的目的位址。如果ipv6資料包中的目的位址沒有配置設定給接收到它的接口,則丢棄這個資料包。

運作windows server 2012、windows server 2008 r2、windows server 2008、windows 8、windows 7和windows vista的計算機預設支援對于接收ipv6資料包的強主機模型。可以使用netsh interface ipv6 set interface interfacenameorindex weakhostreceive= enabled指令以啟用對于接收ipv6資料包的弱主機模型。對于運作windows server 2012或windows 8系統的計算機,也可以使用windows powershell中的指令set-netipinterface -interfacealias name -addressfamily ipv6 -weakhostreceive enabled來實作這一功能。

4.根據下一個頭部字段,來處理擴充頭部(如果該資料包帶有擴充頭部的話)。

5.驗證下一個頭部字段值的協定是否存在。

如果協定不存在,則向發送者發送回“icmpv6參數問題-下一個頭部類型無法識别”消息并丢棄這個資料包。

6.如果上層協定資料單元(pdu)不是傳輸控制協定(tcp)段或使用者資料報協定(udp)消息,則将上層pdu傳送給相應的協定。

7.如果上層pdu是tcp段或udp消息,則檢查目的端口。

如果該udp端口号沒有對應的應用,則向發送方發送回“icmpv6目的不可達-端口不可達”消息并丢棄資料包。如果該tcp端口号上沒有對應的應用,則向發送方發送tcp連接配接重置,并丢棄這個資料包。

8.如果在該udp或tcp目的端口上存在應用,則處理tcp段或udp消息的内容。

《深入解析IPv6(第3版)》——10.2 IPv6端到端的傳輸過程
《深入解析IPv6(第3版)》——10.2 IPv6端到端的傳輸過程
《深入解析IPv6(第3版)》——10.2 IPv6端到端的傳輸過程

繼續閱讀