王悅悅,胡曦明,2,馬苗,2,李鵬,2
(1.陜西師范大學計算機科學學院,西安 710119;2.現代教學技術教育部重點實驗室,西安 710119)
在IPv4網絡傳輸中,當一個數據包大于硬件接口的最大傳輸單元(Maximum Transmission Unit,MTU)[1]時,網絡層會對其進行分片[2],保證每個分片都小于對應接口的MTU值[3-4]。該功能實現了大塊數據分片傳送,但它會使網絡中數據碎片增多、路由器負荷加重,導致網絡出現擁塞、丟包現象[1,5]。路徑最大傳輸單元(Path MTU,PMTU)是從發送端到接收端之間所有數據鏈路中最小的MTU值[5]。PMTU探測技術能有效地減少分片,提高網絡傳輸效率[6],但在當前網絡中,常常由于防火墻、VPN等網關設備丟棄ICMP差錯控制報文,導致PMTU探測技術不能正常運轉[6-7]。
在IPv6網絡環境中,IPv6報文中沒有分片與重組字段[8-9],數據分段只能由源節點進行,中間路由器不允許對數據進行分段[10-11],發送端需要利用PMTU探測技術來感知傳輸路徑的最大傳輸單元,以此控制發送的最大數據包的長度[1]。因此,在IPv6網絡中,PMTU探測技術成為了實現網絡數據傳輸的關鍵技術[12]。
PMTU探測技術的基本原理是發送端將到達某一節點的PMTU值假定為第一段鏈路的MTU值,按照假定的長度發送數據包。中間節點在轉發數據包時,若發現數據包長度大于下一跳鏈路的MTU值,那么該節點將會丟棄數據包并回復一個ICMPv6數據包過大報文給發送端。發送端收到差錯報文后,會將PMTU值修改為該報文中攜帶的MTU值。當假定的PMTU值小于或等于實際的PMTU時,PMTU探測過程結束[13-14]。
在Oracle VM VirtualBox虛擬機上使用H3C Cloud Lab平臺搭建了IPv6網絡,在該平臺上進行仿真實驗,實驗拓撲圖如圖1所示,其中PC_A為發送端,PC_B為接收端,RT_1、RT_2為轉發路由器:

圖1 實驗拓撲圖
(1)實驗過程
①分別設置發送端PC_A的出接口GE_0/1的MTU值為1500、1420、1360,其余路由器接口的MTU值為1500。

圖2 PC_A的出接口GE_0/1的MTU值為1500
②PC_A向PC_B發送4500字節數據。
③使用Wireshark抓包查看發送端PC_A的出接口GE_0/1處初始報文的大小,圖3所示為PC_A的出接口GE_0/1在其MTU值為1500時的初始報文。

圖3 PC_A出接口GE_0/1處的初始報文
(2)結果分析
發送端PC_A的出接口GE_0/1在其MTU值分別為1500、1420、1360時,初始報文的大小以及初始PMTU值如表1所示:

表1 PC_A的MTU值不同時初始報文大小及初始PMTU值
由表1可知,發送端發送數據時,初始PMTU值等于發送接口的MTU值,與相連路由器的接口無關。
(1)實驗過程
①分別設置最小鏈路是接收端PC_B、最小鏈路是轉發路由器RT_2(實驗數據如表2、表3所示),具體配置過程如表4所示,圖4、圖5為實驗數據一的配置結果。

表2 實驗數據一

表3 實驗數據二

表4 實驗配置

圖4 實驗數據一,最小鏈路是PC_B配置結果
②PC_A向PC_B發送4500字節數據。
③數據傳輸完成后,在發送端PC_A處查看其到接收端PC_B的數據鏈路的PMTU值。圖6為實驗數據一,最小鏈路是接收端PC_B時的PMTU值。

圖6 實驗數據一,最小鏈路是PC_B時的PMTU值
④分別在PC_A的GE_0/1,RT_1和RT_2的GE_0/0、GE_0/1以及PC_B的GE_0/0處抓包,分析數據的發送過程。
(2)結果分析
接收端MTU值對PMTU的影響實驗結果如表5、表6所示:

表5 數據一實驗結果

表6 數據二實驗結果
兩個實驗數據的發送接口的MTU值都為1500,所以初始PMTU值都是1500。
通過抓包分析可知,在實驗數據一中,當鏈路狀況為1500→420時,沒有丟包,PMTU值不變;當鏈路狀況為1500→1420→1420時,在轉發路由器RT_2的接口GE_0/0處丟一個包,回復差錯報文,PC_A將其到PC_B的PMTU值修改為1420。
在實驗數據二中,當鏈路狀況為1500→1420→1360時,只在RT_2的接口GE_0/0處丟包,回復差錯報文,PC_A將PMTU值修改為1420;當鏈路狀況為1500→1420→1360→1360時,在RT_1接口GE_0/0處丟一個包,PC_A將PMTU值修改為1420,之后在轉發路由器RT_2接口GE_0/0處再次丟包,再次回復差錯報文(圖7為ICMPv6差錯報文),PMTU值變為1360。

圖7 ICMPv6差錯報文
結論:當較大鏈路向較小鏈路發送數據包且該數據包長度大于較小鏈路的MTU值時,若較小鏈路是接收端,不會回復差錯報文,直接接收;若較小鏈路的路由器是轉發路由器時,在轉發時丟包,回復ICMPv6差錯報文。因此,接收端鏈路狀況不會改變PMTU值。
(1)實驗過程
①設置不同鏈路狀況(如表7所示)。如圖8,設置RT_2接口GE_0/0和GE_0/1的MTU值為1360,PC_B接口GE_0/0的MTU值為1420,其余路由器接口的MTU值為1500,整個鏈路狀況為1500→1360→1420,為大小中鏈路。

表7 不同的鏈路狀況

圖8 鏈路狀況為1500→1360→1420配置結果
②PC_A向PC_B發送4500字節數據,查看數據丟包情況。
③數據傳輸完成后,在發送端PC_A處查看其到接收端PC_B的數據鏈路的PMTU值。圖9為鏈路狀況是大小中鏈路,具體數據為1500→1360→1420時PMTU值。

圖9 鏈路狀況為150→136→1420時PMTU值
④分別在PC_A的GE_0/1,RT_1和RT_2的GE_0/0、GE_0/1,PC_B的GE_0/0處抓包,分析數據的發送過程。圖10為鏈路狀況為1500→1360→1420時,在PC_A的接口GE_0/1處獲取的報文。

圖10 鏈路狀況為1500→1360→1420報文
(2)結果分析
上述實驗中,不同鏈路狀況下PMTU值、丟包情況以及實際丟包率如表8所示。

表8 不同鏈路狀況對PMTU值影響實驗結果
通過抓包分析可知,當較大鏈路向較小鏈路發送報文時,若較小鏈路不是接收端,會丟一個包,回復ICMPv6差錯報文,之后以較小鏈路的MTU值發送;若較小鏈路是接收端,不會丟包,直接接收。較小鏈路向較大鏈路發送報文時,不會丟包。
通過抓包發現,有些鏈路中接收端實際收到的包與發送端顯示的丟包情況不符合,這是因為當接收端收到數據后,在回復報文時也遵循PMTU探測技術,在中間較小鏈路也會丟包,發送端未收到回復,認為數據已丟失。
結論:IPv6網絡環境中,在不同鏈路狀態下,路由器轉發數據都遵循PMTU探測技術。由于遵循PMTU探測技術,當中間鏈路的MTU值小于兩端時,發送端顯示的丟包情況可能與接收端實際收到數據包的情況不符。
上述實驗通過分別設置發送端、接收端以及傳輸鏈路的MTU值,研究了PMTU值的變化。在此過程中發現,IPv6網絡的PMTU的類型既有動態類型(Dynamic),又有靜態類型(Static)。為此,針對IPv6靜態PMTU值對報文傳輸的影響開展研究。
(1)實驗過程
①設置RT_2接口GE_0/0和GE_0/1的MTU值為1360,PC_B接口GE_0/0的MTU值為1420,其余路由器接口的MTU值為1500,整個鏈路狀況為1500→1360→1420。
②在發送端PC_A中分別設置其到接收端PC_B的數據鏈路的靜態PMTU值為1380、1360、1300,圖12所示為在PC_A中設置靜態PMTU值為1380。

圖11 鏈路1500→1360→1420,靜態PMTU值為1380

圖12 設置靜態PMTU值為1380
③PC_A向PC_B發送4500字節數據,如圖13所示。

圖13 PC_A向PC_B發送4500字節數據
④數據傳輸完成后,在發送端PC_A處查看其到接收端PC_B的數據鏈路的PMTU值,在各個接口處抓包分析報文的發送過程。

圖14 靜態PMTU為1380時PMTU值
(2)結果分析
上述實驗中,在發送端的靜態PMTU值不同的情況下,數據丟包情況以及丟包率如表9所示。

表9 靜態PMTU值對報文傳輸的影響實驗結果
對發送過程進行抓包分析,發現發送端總是以靜態PMTU的大小發送數據。當靜態PMTU值為1380時,PC_A以1380的大小發送數據,轉發路由器RT_2的接口GE_0/0處丟包,回復MTU值為1360的差錯報文,但PC_A繼續以1380發送,全部丟包;當靜態PMTU值為1360和1300時,PC_A分別以1360和1300的大小發送數據,無丟包現象。
結論:當路由器配置了靜態PMTU時,ICMPv6差錯報文中的MTU值不會改變發送端PMTU值的大小,PMTU探測技術不再起作用。
本文利用H3C Cloud Lab平臺對IPv6網絡中的PMTU探測技術進行了深入研究。發現IPv6網絡可以有效地支持PMTU探測技術,通過避免中間路由器多次分片來減少網絡中報文碎片、減少路由器的負荷,從而提高網絡傳輸效率。
實驗結果表明,在IPv6網絡的數據傳輸中,當路由器配置動態PMTU時,數據包的大小由PMTU值決定,PMTU值由路由器發送接口與鏈路中轉發數據的最小MTU值決定,不受接收端鏈路狀況的影響。
相比之下,當路由器配置靜態PMTU時,PMTU探測技術不再起作用。因此,靜態PMTU值不適合運用于動態網絡中,在只有靜態路由的網絡中,配置一定的靜態PMTU值可以提高鏈路層的傳輸效率。