王悅悅,胡曦明,2,馬苗,2,李鵬,2
(1.陜西師范大學計算機科學學院,西安 710119;2.現(xiàn)代教學技術(shù)教育部重點實驗室,西安 710119)
在IPv4網(wǎng)絡傳輸中,當一個數(shù)據(jù)包大于硬件接口的最大傳輸單元(Maximum Transmission Unit,MTU)[1]時,網(wǎng)絡層會對其進行分片[2],保證每個分片都小于對應接口的MTU值[3-4]。該功能實現(xiàn)了大塊數(shù)據(jù)分片傳送,但它會使網(wǎng)絡中數(shù)據(jù)碎片增多、路由器負荷加重,導致網(wǎng)絡出現(xiàn)擁塞、丟包現(xiàn)象[1,5]。路徑最大傳輸單元(Path MTU,PMTU)是從發(fā)送端到接收端之間所有數(shù)據(jù)鏈路中最小的MTU值[5]。PMTU探測技術(shù)能有效地減少分片,提高網(wǎng)絡傳輸效率[6],但在當前網(wǎng)絡中,常常由于防火墻、VPN等網(wǎng)關(guān)設備丟棄ICMP差錯控制報文,導致PMTU探測技術(shù)不能正常運轉(zhuǎn)[6-7]。
在IPv6網(wǎng)絡環(huán)境中,IPv6報文中沒有分片與重組字段[8-9],數(shù)據(jù)分段只能由源節(jié)點進行,中間路由器不允許對數(shù)據(jù)進行分段[10-11],發(fā)送端需要利用PMTU探測技術(shù)來感知傳輸路徑的最大傳輸單元,以此控制發(fā)送的最大數(shù)據(jù)包的長度[1]。因此,在IPv6網(wǎng)絡中,PMTU探測技術(shù)成為了實現(xiàn)網(wǎng)絡數(shù)據(jù)傳輸?shù)年P(guān)鍵技術(shù)[12]。
PMTU探測技術(shù)的基本原理是發(fā)送端將到達某一節(jié)點的PMTU值假定為第一段鏈路的MTU值,按照假定的長度發(fā)送數(shù)據(jù)包。中間節(jié)點在轉(zhuǎn)發(fā)數(shù)據(jù)包時,若發(fā)現(xiàn)數(shù)據(jù)包長度大于下一跳鏈路的MTU值,那么該節(jié)點將會丟棄數(shù)據(jù)包并回復一個ICMPv6數(shù)據(jù)包過大報文給發(fā)送端。發(fā)送端收到差錯報文后,會將PMTU值修改為該報文中攜帶的MTU值。當假定的PMTU值小于或等于實際的PMTU時,PMTU探測過程結(jié)束[13-14]。
在Oracle VM VirtualBox虛擬機上使用H3C Cloud Lab平臺搭建了IPv6網(wǎng)絡,在該平臺上進行仿真實驗,實驗拓撲圖如圖1所示,其中PC_A為發(fā)送端,PC_B為接收端,RT_1、RT_2為轉(zhuǎn)發(fā)路由器:
圖1 實驗拓撲圖
(1)實驗過程
①分別設置發(fā)送端PC_A的出接口GE_0/1的MTU值為1500、1420、1360,其余路由器接口的MTU值為1500。
圖2 PC_A的出接口GE_0/1的MTU值為1500
②PC_A向PC_B發(fā)送4500字節(jié)數(shù)據(jù)。
③使用Wireshark抓包查看發(fā)送端PC_A的出接口GE_0/1處初始報文的大小,圖3所示為PC_A的出接口GE_0/1在其MTU值為1500時的初始報文。
圖3 PC_A出接口GE_0/1處的初始報文
(2)結(jié)果分析
發(fā)送端PC_A的出接口GE_0/1在其MTU值分別為1500、1420、1360時,初始報文的大小以及初始PMTU值如表1所示:
表1 PC_A的MTU值不同時初始報文大小及初始PMTU值
由表1可知,發(fā)送端發(fā)送數(shù)據(jù)時,初始PMTU值等于發(fā)送接口的MTU值,與相連路由器的接口無關(guān)。
(1)實驗過程
①分別設置最小鏈路是接收端PC_B、最小鏈路是轉(zhuǎn)發(fā)路由器RT_2(實驗數(shù)據(jù)如表2、表3所示),具體配置過程如表4所示,圖4、圖5為實驗數(shù)據(jù)一的配置結(jié)果。
表2 實驗數(shù)據(jù)一
表3 實驗數(shù)據(jù)二
表4 實驗配置
圖4 實驗數(shù)據(jù)一,最小鏈路是PC_B配置結(jié)果
②PC_A向PC_B發(fā)送4500字節(jié)數(shù)據(jù)。
③數(shù)據(jù)傳輸完成后,在發(fā)送端PC_A處查看其到接收端PC_B的數(shù)據(jù)鏈路的PMTU值。圖6為實驗數(shù)據(jù)一,最小鏈路是接收端PC_B時的PMTU值。
圖6 實驗數(shù)據(jù)一,最小鏈路是PC_B時的PMTU值
④分別在PC_A的GE_0/1,RT_1和RT_2的GE_0/0、GE_0/1以及PC_B的GE_0/0處抓包,分析數(shù)據(jù)的發(fā)送過程。
(2)結(jié)果分析
接收端MTU值對PMTU的影響實驗結(jié)果如表5、表6所示:
表5 數(shù)據(jù)一實驗結(jié)果
表6 數(shù)據(jù)二實驗結(jié)果
兩個實驗數(shù)據(jù)的發(fā)送接口的MTU值都為1500,所以初始PMTU值都是1500。
通過抓包分析可知,在實驗數(shù)據(jù)一中,當鏈路狀況為1500→420時,沒有丟包,PMTU值不變;當鏈路狀況為1500→1420→1420時,在轉(zhuǎn)發(fā)路由器RT_2的接口GE_0/0處丟一個包,回復差錯報文,PC_A將其到PC_B的PMTU值修改為1420。
在實驗數(shù)據(jù)二中,當鏈路狀況為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,之后在轉(zhuǎn)發(fā)路由器RT_2接口GE_0/0處再次丟包,再次回復差錯報文(圖7為ICMPv6差錯報文),PMTU值變?yōu)?360。
圖7 ICMPv6差錯報文
結(jié)論:當較大鏈路向較小鏈路發(fā)送數(shù)據(jù)包且該數(shù)據(jù)包長度大于較小鏈路的MTU值時,若較小鏈路是接收端,不會回復差錯報文,直接接收;若較小鏈路的路由器是轉(zhuǎn)發(fā)路由器時,在轉(zhuǎn)發(fā)時丟包,回復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配置結(jié)果
②PC_A向PC_B發(fā)送4500字節(jié)數(shù)據(jù),查看數(shù)據(jù)丟包情況。
③數(shù)據(jù)傳輸完成后,在發(fā)送端PC_A處查看其到接收端PC_B的數(shù)據(jù)鏈路的PMTU值。圖9為鏈路狀況是大小中鏈路,具體數(shù)據(jù)為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處抓包,分析數(shù)據(jù)的發(fā)送過程。圖10為鏈路狀況為1500→1360→1420時,在PC_A的接口GE_0/1處獲取的報文。
圖10 鏈路狀況為1500→1360→1420報文
(2)結(jié)果分析
上述實驗中,不同鏈路狀況下PMTU值、丟包情況以及實際丟包率如表8所示。
表8 不同鏈路狀況對PMTU值影響實驗結(jié)果
通過抓包分析可知,當較大鏈路向較小鏈路發(fā)送報文時,若較小鏈路不是接收端,會丟一個包,回復ICMPv6差錯報文,之后以較小鏈路的MTU值發(fā)送;若較小鏈路是接收端,不會丟包,直接接收。較小鏈路向較大鏈路發(fā)送報文時,不會丟包。
通過抓包發(fā)現(xiàn),有些鏈路中接收端實際收到的包與發(fā)送端顯示的丟包情況不符合,這是因為當接收端收到數(shù)據(jù)后,在回復報文時也遵循PMTU探測技術(shù),在中間較小鏈路也會丟包,發(fā)送端未收到回復,認為數(shù)據(jù)已丟失。
結(jié)論:IPv6網(wǎng)絡環(huán)境中,在不同鏈路狀態(tài)下,路由器轉(zhuǎn)發(fā)數(shù)據(jù)都遵循PMTU探測技術(shù)。由于遵循PMTU探測技術(shù),當中間鏈路的MTU值小于兩端時,發(fā)送端顯示的丟包情況可能與接收端實際收到數(shù)據(jù)包的情況不符。
上述實驗通過分別設置發(fā)送端、接收端以及傳輸鏈路的MTU值,研究了PMTU值的變化。在此過程中發(fā)現(xiàn),IPv6網(wǎng)絡的PMTU的類型既有動態(tài)類型(Dynamic),又有靜態(tài)類型(Static)。為此,針對IPv6靜態(tài)PMTU值對報文傳輸?shù)挠绊戦_展研究。
(1)實驗過程
①設置RT_2接口GE_0/0和GE_0/1的MTU值為1360,PC_B接口GE_0/0的MTU值為1420,其余路由器接口的MTU值為1500,整個鏈路狀況為1500→1360→1420。
②在發(fā)送端PC_A中分別設置其到接收端PC_B的數(shù)據(jù)鏈路的靜態(tài)PMTU值為1380、1360、1300,圖12所示為在PC_A中設置靜態(tài)PMTU值為1380。
圖11 鏈路1500→1360→1420,靜態(tài)PMTU值為1380
圖12 設置靜態(tài)PMTU值為1380
③PC_A向PC_B發(fā)送4500字節(jié)數(shù)據(jù),如圖13所示。
圖13 PC_A向PC_B發(fā)送4500字節(jié)數(shù)據(jù)
④數(shù)據(jù)傳輸完成后,在發(fā)送端PC_A處查看其到接收端PC_B的數(shù)據(jù)鏈路的PMTU值,在各個接口處抓包分析報文的發(fā)送過程。
圖14 靜態(tài)PMTU為1380時PMTU值
(2)結(jié)果分析
上述實驗中,在發(fā)送端的靜態(tài)PMTU值不同的情況下,數(shù)據(jù)丟包情況以及丟包率如表9所示。
表9 靜態(tài)PMTU值對報文傳輸?shù)挠绊憣嶒灲Y(jié)果
對發(fā)送過程進行抓包分析,發(fā)現(xiàn)發(fā)送端總是以靜態(tài)PMTU的大小發(fā)送數(shù)據(jù)。當靜態(tài)PMTU值為1380時,PC_A以1380的大小發(fā)送數(shù)據(jù),轉(zhuǎn)發(fā)路由器RT_2的接口GE_0/0處丟包,回復MTU值為1360的差錯報文,但PC_A繼續(xù)以1380發(fā)送,全部丟包;當靜態(tài)PMTU值為1360和1300時,PC_A分別以1360和1300的大小發(fā)送數(shù)據(jù),無丟包現(xiàn)象。
結(jié)論:當路由器配置了靜態(tài)PMTU時,ICMPv6差錯報文中的MTU值不會改變發(fā)送端PMTU值的大小,PMTU探測技術(shù)不再起作用。
本文利用H3C Cloud Lab平臺對IPv6網(wǎng)絡中的PMTU探測技術(shù)進行了深入研究。發(fā)現(xiàn)IPv6網(wǎng)絡可以有效地支持PMTU探測技術(shù),通過避免中間路由器多次分片來減少網(wǎng)絡中報文碎片、減少路由器的負荷,從而提高網(wǎng)絡傳輸效率。
實驗結(jié)果表明,在IPv6網(wǎng)絡的數(shù)據(jù)傳輸中,當路由器配置動態(tài)PMTU時,數(shù)據(jù)包的大小由PMTU值決定,PMTU值由路由器發(fā)送接口與鏈路中轉(zhuǎn)發(fā)數(shù)據(jù)的最小MTU值決定,不受接收端鏈路狀況的影響。
相比之下,當路由器配置靜態(tài)PMTU時,PMTU探測技術(shù)不再起作用。因此,靜態(tài)PMTU值不適合運用于動態(tài)網(wǎng)絡中,在只有靜態(tài)路由的網(wǎng)絡中,配置一定的靜態(tài)PMTU值可以提高鏈路層的傳輸效率。