淺談網絡故障排除

學識都 人氣:4.62K

排除網絡問題可能很棘手,任何故障排除工作的第一步就是檢查相應網絡部件的統計數字。然而,如果那些統計數字表明一切都很好,可是網絡問題依然出現,那麼你就只好引入故障排除界的“瑞士軍刀”――數據包分析。雖說市面上有好多出色的收費產品可用於分析數據包,不過我還是青睞開源工具Wireshark()。

淺談網絡故障排除

在分析涉及負載均衡系統的問題時,需要解答的第一個問題就是負載均衡系統是不是處於透明模式下。在透明模式下,負載均衡系統會將原始客戶機的IP地址作爲源IP地址來傳送。而在非透明模式下,負載均衡系統會使用負載均衡系統的虛擬IP地址(VIP)對服務器請求進行網絡地址轉換(NAT)處理。非透明模式是最常見的實施模式。

現在你準備獲取跟蹤文件。在理想情況下,下圖中的每一個點都會插入分路器(tap)。要是你沒有分路器,可以使用SPAN(交換機端口分析器)或交換機上的鏡像端口來捕獲流量。或者你也可以對防火牆和負載均衡系統的入站和出站端口使用tcpdump命令。關鍵在於同時捕獲所有四個位置的數據包,分析來自四個不同有利位置的會話。

你捕獲了數據後,必須找到出現在所有四個跟蹤文件中的單一會話。通常,你只要過濾相應的兩個IP地址就可以了。但是記住負載均衡系統在服務器端執行NAT,所以過濾客戶機IP地址並不適用於服務器端痕跡。

進入到第4層可以解決這個問題。你可以按照TCP報頭中的序列號進行過濾。不過要小心;Wireshark在默認情況下顯示相對序列號,你到頭來會遇到數百個序列號爲1的數據包。關鍵在於關閉TCP參數選項中的相對序列號。只要只要取消勾選該選項,實際的十進制數就會顯示,而不是相對會話開始的序列號。一旦你過濾了所有四個痕跡文件中的.同一序列號,你在每個文件中應該有一個數據包。

如果你的負載均衡系統在NAT端創建自己的數據包發往服務器,棘手問題就來了。序列字段然後不再從頭到尾都一樣。這種場景下使用的最佳字段就是應用層所特有的字段。如果是HTTP,我建議使用Cookie字段;如果是HTTPS,則建議使用Client Hello中的Random Bytes字段。

最後,你面對在多個地方捕獲的單一會話,可以分析其痕跡了。首先,尋找數據包丟失現象。在Wireshark的專家分析語言中,那些丟失的數據包會被標爲“Previous segment not captured”(未捕捉到的先前片段)。這會出現在一個或多個痕跡文件中,但並不出現在所有痕跡文件中。比如說,如果你在防火牆痕跡的出站端(而不是入站端)看到來自服務器的響應,就知道防火牆丟失了數據包。

分析數據包丟失現象後,檢查TCP握手機制,確保TCP選項在一路當中並沒有被篡改。當沿途中的某個設備創建自己的數據包,而不是以透明方式一路傳送時,窗口縮放(windows scaling)和選擇性確認(Selective Acknowledgements)往往會消失。那兩個選項對吞吐量而言很重要,不應該去掉。

在痕跡中要關注的最後一個問題是很高的增量時間(delta time)。如果捕獲了四個不同位置的數據,你就真正能夠查看什麼東西在添加延遲(要是果真有什麼東西的話)。先看一下握手機制。使用同步請求(SYN)與同步響應(SYN/ACK)的間隔時間作爲基準。看一下離客戶機最近的防火牆入站端留下的痕跡中的其餘請求和響應。

針對那些增量時間爲一秒或更長的請求/響應組合,逐步檢查每個痕跡,直到你找到哪個端口在增添延遲爲止。是處理器使用激增的防火牆嗎?還是跟蹤NAT表有問題的負載均衡系統?也許是併發連接數量太多的服務器。仔細檢查痕跡,可以告訴你哪裏有問題,哪裏沒有問題。

設置數據包捕獲機制可能在網絡滅火行動中會佔用寶貴的時間,不過從長遠來看它可以節省大量的時間。