引言:筆者單位的一個下級單位報告,在單位辦公網站下載一個大約3.4GB的一個軟件失敗,觀看視頻有明顯卡頓和馬賽克現象。經排查,發現故障是由于光纜線路使用年限過長,老化非常嚴重,導致數據收發異常。因業務不能中斷,筆者通過調整服務器的“最大重新傳輸超時”(RTO)、“最大傳輸單元”(MTU)、“最大重傳次數”三個參數和交換機的MTU參數,巧妙地解決了數據重傳故障。
筆者單位有很多下級單位,且各點位比較分散。一天,一個下級單位報告,在單位辦公網站下載一個大約3.4GB的一個軟件失敗,然而在門戶網站可以在線觀看視頻,但在觀看電影時有明顯卡頓和馬賽克現象出現。
針對問題,筆者確定到下級單位的網絡鏈路基本正常,首先懷疑可能是辦公網站上的軟件下載鏈接存在錯誤。找到該軟件的網站鏈接地址,無論是使用鼠標右鍵“目標另存為”還是使用迅雷等軟件下載該軟件均正常,說明該軟件的下載鏈接沒有問題,很可能是下級單位計算機操作系統存在問題。讓下級單位更換幾臺計算機重新下載該軟件測試,當使用鼠標右鍵“目標另存為”的方式下載時,過不了幾秒,鏈接還是會中斷,下載均失敗。
為了解決問題,筆者使用“遠程桌面”登錄該計算機,結果發現“遠程桌面”無法正常建立,Ping了一下該計算機3389端口,丟包率為0,網絡正常。筆者又使用65500字節大小的數據包Ping該計算機,丟包率高達33%,網絡基本不可用。
1.根據故障現象和測試結果,筆者認為網絡中可能存在廣播風暴或ARP病毒等,造成網絡阻塞,數據包超時丟失。遂對下級單位的所有上網計算機進行了病毒查殺,結果并未查殺到病毒。
2.對所有的網絡連接點進行了檢查,發現各連接點并沒有出現松脫、連接不緊密、線路短路等現象。
3.因對下連接的網絡特別簡單,就是“計算機終端→交接機→光纖收發器→光纖收發器→交換機→計算機終端”的模式,對各網絡設備進行了硬件測試,各網絡硬件工作均正常,沒有物理故障。
4.對下級單位的網絡流量數據包進行捕獲,并對異常數據包進行分析,發現網絡中并未出現病毒數據包和非合理廣播數據包,惟一異常的數據包就是部分TCP發送異常,很多TCP數據包都產生了超時。對這些超時的數據包進行分析,發現錯誤提示為“在數據報組裝期間生存時間為0”,也就是發生超時,TCP數據包重組失敗。
數據包發生超時重傳的原因有很多,但是本故障中數據包發生重傳的原因是TCP數據報文過大造成的。在IP數據包傳輸過程中,數據包首先要判斷由哪個接口進行轉發,并查詢該接口的相關參數,以獲得其MTU(Maximum Transmission Unit,最大傳輸單元),網絡層把MTU值與要發送的IP數據包進行長度比較,如果IP數據包的長度比MTU值大(一般默認最大長度值為1500字節,MTU值不宜過大,也不宜過小,如果MTU配置過大,則可能會超過了接收端所能夠承受的最大值,或者是超過了發送路徑上途經的某臺設備所能夠承受的最大值,也會造成報文分片甚至丟棄,加重網絡傳輸的負擔,影響數據正常傳輸。MTU值過小的弊端在本文的最后有提及),就會對IP數據包進行分片處理,分片后的數據包長度小于或等于MTU值,當分片數據報文都到達目的端后,會對所有的分片數據報文進行重組,當有一個分片或多個分片丟失后,就會造成數據報重組超時,所以就會發送超時的錯誤提示,導致TCP數據包傳輸異常。
導致數據重傳一般有以下原因:一是計算機病毒和廣播風暴。當網絡帶寬發生阻塞時,很多TCP數據包會被延時接收,當延時超過最大重傳時間時,就會要求重傳。二是網絡設備設置不當和物理故障。當網絡中存在多種網絡設備時,有人會對各類網絡設備設置不同的MTU,當各類網絡設備的MTU不同時,可能就會導致數據包重傳。比如,對路由器的MTU設置為1200字節,而交換機的MTU設置為800字節時,就有可能會造成數據重傳。三是網絡線路原因。當各網絡連接節點連接不緊密或網絡鏈路出現其他異常故障時,也會造成數據包重傳,而筆者單位發生這個故障就是光纜老化導致。
筆者單位到這個下級單位架設有一條超過38公里的光纜,光纜兩端使用光纖收發器進行連接,來連通網絡。光纜大部分采用的是埋地方式敷設,大約有9公里的光纜采用架空方式,雖然為鎧裝光纜,但使用時間已經超過17年,期間光纜斷裂多次,光纜存在纖芯色散嚴重、油脂套管收縮嚴重、涂覆層油凝固、防水密封膠脫落、熱縮套管破裂、光纜接續盒進水、外凱鋼絲層和內徑加強鋼絲銹蝕等問題。特別是纖芯柔韌性降低明顯,極易折斷,使用OTDR(光時域反射儀)對光纜進行測試時,發現有多點和多段衰耗較大,光纜老化非常嚴重,其中架空部分光纜老化尤其嚴重,即使單位使用了60公里的光纖收發器,光纖收發器經常不能很好地正常識別,導致數據收發異常。
因辦公需要,要求對下網絡中斷時間不得超過1小時,為確保網絡能符合辦公要求,而此光纜又不可能立即重新敷設,筆者采取了三種解決方法。
1.對衰耗特別嚴重的光纜進行了更換。在對光纜進行測試后,發現其中有1段大約長2公里和1段大約長1.5公里的光纜衰耗特別嚴重。在這兩處敷設了新的光纜,對這兩段的原有光纜進行了更換,熔接用時約25分鐘。
2.在提供的服務器上,對“最大重新傳輸超時”(RTO,Retransmission Timeout)、“最大傳輸單元”(MTU)和“最大重傳次數”3個參數進行了修改(服務器采用Windows 2003 Server操作系統),這里將RTO設置為5000ms,將MTU設置為800字節,將“最大重傳次數”設置為5次。
(1)修改RTO這個參數可以采用兩種方法。
方法一:命令修改法。在操作系統中運行“cmd”命令,然后依次運行以下命令,netsh-interfaceipv4-show interface,可以查看到服務器外接的網絡接口所對應的Idx值(如圖1)。
其對外服務的網卡接口名稱為“本地連接”,其對應的Idx值為12。使用“set interface "12"retrasmittime=5000”命令就可以修改RTO這個參數為5000ms,修改的命令和結果如下:

確定。
方法二:修改注冊表法。運行“regedit”命令打開注冊表,分別打開KEY_LOCALMACHINESystemCurrentControlSetServicesTcpipParametersInterfaces適配器ID(適配器ID可以根據對外網絡的網址來確定(如圖2),服務器中共有硬件或軟件等各類“網卡”7個,圖中對外服務的為第三個,其網關為192.168.1.1,自己的IP地址為192.168.1.100),添加“TCPInitialRtt” 名稱的屬性項,數據類型為REG_DWORD,修改其數值為“5000”(即為 5000ms,5 秒)。

圖1 網絡接口所對應的Idx值

圖2 注冊表編輯器界面
此參數控制TCP使用對每個新連接的初始重新傳輸超時。它適用于連接請求(SYN,synchronous) 和每個連接發送的第一個數據段。
(2)修改MTU這個參數可以采用命令修改法。在操作系統中運行“cmd”命令,然后依次運行以下命令,netshinterface-ipv4,使 用“set interface "12" mtu=800”命令就可以修改“最大傳輸單元”這個參數,修改的命令和結果如下:

確定。
(3)修改“最大重傳次數”這個參數可以采用2種方法。
方法一:命令修改法。在操作系統中運行“cmd”命令,然后依次運行以下命令,netsh-interface-ipv4,使 用“set interface "12"dadtransmits=5”命令就可以修改“最大傳輸單元”這個參數為5次,修改的命令和結果如下:

確定。
方法二:修改注冊表法。運行“regedit”打開注冊表,分別打開HKEY_LOCAL_MACHINESystemCurrent Control SetServicesTcpipParameters,添加“TcpMax DataRetransmissions”名稱的屬性項,數據類型為REG_DWORD,修改其數值為“5”(即為5次)。
3.在連接下級單位的交換機端口上,對該接口的MTU這個參數進行了修改(筆者單位使用的交換機為華為交換機,下級單位的交換機設置相同),修改相應接口MTU參數為800字節。


配置注意事項:需要在交換機端口執行命令undo portswitch,配置以太網接口從二層模式切換到三層模式。同時在配置完成后,需要重啟接口以保證配置的MTU生效。可以先執行命令shutdown,關閉接口,再執行命令undo shutdown,開啟接口。也可以直接在接口視圖下執行命令restart,重啟接口。
通過這些方法,可以很好地解決數據重傳的問題,不會造成網絡數據傳輸的中斷。
但有利就有弊,這些方法的采用也存在一定的不足,主要不足體現在以下兩個方面:一是采用了方法2和方法3后,會導致網絡速度減慢。二是在設置了QoS的交換機上,由于QoS隊列長度有限,如果MTU配置過小而報文尺寸較大,可能會造成分片過多,報文會被QoS隊列丟棄,影響數據正常傳輸。