武忠 于紅增
(1 中國民用航空三亞空中交通管理站 海南 三亞 572000)
(2 中國電子科技集團公司第五十四研究所 河北 石家莊 050081)
隨著計算機網絡的發展,專用網絡普遍采用IP技術來構建,語音、圖像、視頻和數據等各種IP分組業務逐漸成為網絡業務的主流,基于UDP超大報文的軟件系統由于通信的高效性和開發的便捷性在某專用網絡中被廣泛采用,由此帶來的一系列QoS保障問題,這些問題多與IP報文分片有關。
在TCP/IP協議族中,鏈路層的報文叫做“幀”,每種鏈路層協議對數據幀的長度都有一個限制,這個特性稱作最大傳輸單元 (Maxitum Transmission Unit,MTU)[1],單位為字節(Byte)。如常用的EthernetII網絡MTU為1500,IEEE 802.3網絡MTU為1492。如果IP層有一個數據報要傳,而且數據的長度比鏈路層的MTU還大,那么IP層就需要分片,使每一片的長度都不大于MTU。
TCP/IP的設計原則是屏蔽低層物理網絡技術細節,通過IP協議向上層提供統一的IP數據報。對于上層協議和應用而言,MTU作為低層物理細節己被IP層屏蔽,以太網物理幀格式和MTU的關系及IP報頭結構如圖1所示,報頭長度為20~60 Bytes,其中有16 bit的總長度字段,用于指示整個IP數據報的長度(單位為字節),也就是說,IP數據報的長度最大可達65535 Bytes[2]。

圖1 以太網MTU及IP報文格式
UDP報文大小由軟件所決定,在不超過協議版本規定的數據報文大小的前提下,IP協議選擇當前最合適的數據報文大小在物理網絡上進行最大限度封裝,鏈路層一般要限制每次發送數據幀的最大長度,該值即MTU。任何時候IP層接收到一份要發送的IP數據報時,要判斷向本地哪個接口發送數據(選路),并查詢該接口獲得其MTU。把數據長度與MTU進行比較,前者大于后者則需要進行分片。分片可以發生在信源端上,也可以發生在網絡中間節點上。把一份IP數據報分片以后,只有到達目的地才進行重新組裝。重新組裝由信宿端的IP層來完成,目的是使分片和重新組裝過程對傳輸層(TCP和UDP)是透明的,除了某些可能的越層操作外,已經分片過的數據報在轉發過程中有可能會再次進行分片(可能還不止一次)。
IP首部中包含的數據為分片和重新組裝提供了足夠的信息:標識字段、更多的片標志位和不分片標志位。查看圖1中IP首部格式,下面這些字段用于分片過程。對于信源端發送的每份IP數據報來說,其標識字段都包含一個唯一值,該值在數據報分片時被復制到每個片中。標志字段用其中一個比特來表示“更多的片”。除了最后一片外,其他每個組成數據報的片都要把該比特置1。片偏移字段指的是該片偏移原始數據報開始處的位置。
另外,當數據報被分片后,每個片的總長度值要改為該片的長度值。最后,標志字段中有一個比特稱作“不分片”位,如果將這一比特置1則IP不對數據報進行分片,如果需要進行分片但設置了不分片比特則把數據報丟棄,如果丟棄發生在中間節點上還會發送一個ICMP差錯報文給信源端。IP報文分片的優點是為上層協議提供了一個透明的傳輸通道,使上層協議不必關心底層不同的硬件技術。
(1)TCP/UDP報文格式
一個UDP數據報由UDP首部和用戶數據組成,一個TCP流報文由TCP首部和用戶數據組成,如圖2所示。UDP首部由8個字節組成,TCP首部由20個字節組成 (不含TCP選項字段時)。

圖2 TCP/UDP報文格式
(2)分片協議
當傳輸層數據包在IP層進行分片后,每一片都具有自己的IP首部,因此可以看成一個完整獨立的IP包,與其他分片的IP包是相互獨立的。然而信宿端接收這些IP包時有可能不會按照原來的順序接收,但是IP包的首部中有足夠的信息,因此信宿端能正確還原出原來的傳輸層數據報。
UDP分片和TCP分片方式不同,從屬于同一個TCP報文的每一個IP分片都包含有相同的TCP首部,而UDP報文分片后只在第一個分片有UDP首部,后續的UDP分片就沒有UDP首部。信源端上發送2000 Bytes數據時UDP和TCP各自的分片結果,如圖3所示。注意:用wireshark軟件顯示UDP分片結果時是最后一個分片的protocol為UDP,前面各個分片的protocol為IP,這是因為wireshark選擇在重組完成后才在最后一個分片給出正確的protocol,查看各個分片,第一個分片的IP數據部分可以看到udp首部,后續分片則沒有。

圖3 TCP/UDP報文分片機理
在網絡中路由器和交換機一般只有分片處理功能,而不執行分片重組功能。路由交換設備接收到一份要發送的IP數據報時,要判斷向本地哪個接口發送數據(選路),并查詢該接口獲得其MTU。把數據長度與MTU進行比較,前者大于后者則進行分片,這往往發生在不同MTU網絡交界處。如果出接口是隧道接口,IP數據報會被封裝,參與比較的是隧道封裝后的長度,而不是原始IP數據報長度。
這些設備出于自身功能需要(比如訪問控制、防病毒和深度分析等等)都對分片報文進行重組[3],對于需要轉發的報文則進行重新分片,分片的依據是下行鏈路的MTU,可能與信源端MTU不同。
終端設備總是要對超過MTU的上層報文打包成合適的IP報文進行傳輸(根據需要進行分片),對于收到的分片報文自動完成重組再上報給合適的應用程序。如果分片報文部分分片丟失,則該UDP報文因無法完成重組而丟棄。
由于輸入輸出端口鏈路層協議不同,輸入接口和輸出接口的幀格式和MTU往往不同,是否發生分片取決于所用的鏈路層協議和MTU。
UDP報文分片傳輸過程中,如果某個分片丟失會導致分片所屬的那個UDP報文丟包,通常不會造成其他影響[4]。在實際的網絡環境中,情況往往比較復雜,例如某安全設備外部鏈接了多條鏈路,都傳輸著UDP大包業務,其中一條鏈路有誤碼,導致部分UDP分片丟失,安全設備無法對其完成重組。由于安全設備不能及時丟棄這些分片,任其在緩沖區中等待重組完成,后續的類似分片積累起來將緩存占滿,導致無法重組其他鏈路的UDP報文,這樣一條鏈路上的UDP大包斷續丟包之后,其他鏈路也出現UDP大包丟包。經過排查發現斷開有損鏈路并重啟安全設備后故障消失,接入有損鏈路后故障可以重現。確認該故障與UDP大包分片有關,該安全設備軟件改為及時丟棄這些無法重組的分片后,故障消失。
終端在發送IP數據報時可以獲知的只是第一跳MTU,針對超過MTU的IP數據報,依據該值進行第一次分片,在傳輸過程中如果遇到隧道協議導致鏈路出口MTU減小 (如GRE隧道協議有個8 Bytes的開銷,PPPOE報文有8 Bytes的開銷),則總尺寸超過鏈路MTU的那些分片會進行二次(甚至多次)分片[5],由此將產生新的IP短報文。
某業務軟件發送7000 Bytes的UDP報文,加上UDP首部的8 Bytes,共7008 BytesIP數據需由網絡層打包,第一跳MTU為1500 Bytes,UDP報文被分成了4個1500 Bytes的IP包(1480 BytesIP數據和20 BytesIP首部,8 BytesUDP首部包含在第一個分片IP數據中)和1個1108Bytes(剩余的1088BytesIP數據和20 BytesIP首部)的IP包,中間鏈路上存在GRE隧道,GRE封裝占用8 Bytes,其MTU小于1500,于是4個1500Bytes的IP包被二次分片,產生4個1500Bytes的IP包和4個46 Bytes的短IP包,這個UDP報文將產生9個長短不一的IP分片,實際使用中受下游設備包轉發能力的限制產生了丟包,在將信源網卡MTU手工改為較小的值1460之后,通信正常。
由于UDP分片報文只有第一片有UDP首部,后續的分片沒有,因此在通過ACL匹配UDP報文的源端口、目的端口時只能匹配第一個分片,即基于五元組(源IP地址、目的IP地址、源端口、目的端口和協議)進行流分類并進行優先級標記時,同一個UDP報文的分片打不上相同優先級的情況。如果基于三元組(源IP地址、目的IP地址和協議),則會導致不同的應用打上相同的優先級標簽,與需求不符。
現網中,各種VPN應用或接入技術其報文封裝格式及大小因采用的技術不同會有比較大的差異。因此更要格外注意報文經過多次封裝后MTU值的減小情況[6]。通常情況下,大部分應用程序都會允許報文分片的,但總有部分協議因為種種原因不允許報文分片,這就要求信源網卡MTU不能超過路徑中MTU的最小值,否則可能會導致應用無法正常通信。
UDP報文分片在實際應用中的效果情況非常復雜,對QoS、業務連通性和設備性能等都有影響,與鏈路上設備特性有關,本文闡述了與UDP大包分片有關的一些故障案例及其故障機理,供大家在實際應用中參考。
[1]COMER D E.用TCP/IP進行網際互連[M].北京:電子工業出版社,1998.
[2]程 偉,全天彤.IP報文分片機制與路徑MTU發現技術[J].計算機應用研究,2000(8):36-39.
[3]占幼平,劉 玉.一種基于業務流的IP分片實時識別方法[J].微計算機信息,2007(33):87-89.
[4]劉 陽.UDP數據報IP分片傳輸方式研究[J].今日中國論壇,2013(12):197.
[5]金旭燕.IP分片及其故障處理[J].科技信息,2013(24):264-265.
[6]秦昌潛.報文分片對網絡的影響[J].中國集體經濟,2012(9):176-177.