前言
大家好,這里是浩道linux,主要給大家分享linux、python、網絡通信相關的IT知識平臺。
今天浩道跟大家分享關于網絡延遲及故障分析方法相關的硬核干貨!
一、Wireshark中的輔助工具
我們在安裝完Wireshark時,會發現系統中還多了一些程序,例如Tshark等。這些程序都采用了命令行的工作方式,雖然體積都很小,但是功能卻十分強大。
1、Wireshark命令行工具
開Wireshark的安裝目錄,然后按照類型對文件進行排序,就可以看到除了Wireshark.exe之外還有如圖所示的一些命令行工具。
首先我們先來簡單地看一下這些工具的功能:
Tshark.exe:這個工具可以看作是Wireshark的命令行版本,可以用來捕獲數據包,也可以讀取保存好的數據包捕獲文件。
editcap.exe:主要用來轉換捕獲數據包捕獲文件的格式。
dumpcap.exe:和tshark.exe一樣用來捕獲數據包,保存為libpcap格式文件。
mergecap .exe:用來將多個數據包捕獲文件合并成一個。
text2pcap.exe:將十六進制轉儲文件轉換為數據包捕獲文件。
2、使用Tshark和Dumpcap進行數據包的捕獲
1. Tshark.exe使用方法
Tshark.exe是Wireshark的一個組件,可以用來捕獲數據包,也可以用來查看之前保存的數據包捕獲文件。
Tshark.exe也提供了對數據包的解析和保存功能。雖然沒有圖形化的工作界面,但是Tshark.exe的功能卻十分強大。如果你希望查看Tshark.exe的全部功能,可以在命令行中輸入“tshark–h”就可以查看幫助文件,這個幫助文件很大,下圖只顯示了其中與網絡接口(網卡)有關的部分。
我們首先來看一個使用Tshark.exe捕獲數據包的簡單示例,這里至少需要指定捕獲數據包所使用的網卡,在Linux下很容易查看到網卡的名稱和編號。
但是查看Windows下網卡的編號則要困難很多,不過在Tshark中,可以使用如下的命令查看每個網卡的編號:
tshark -D
接下來我們使用第4塊網卡來捕獲數據,為了加快捕獲的速度,這里使用-s參數來表示只捕獲數據包的前512個字節數據:
tshark -s 512 -i 4
和Wireshark一樣,Tshark還支持捕獲過濾器和顯示過濾器的使用,這兩種過濾器的語法也和Wireshark中規定的一樣,例如下面就使用了目標端口為80的過濾器:
tshark -s 512 -i 4 -f 'tcp dst port 80'
捕獲到的數據包如圖17-3所示:
需要停止捕獲數據包時,可以使用“Ctrl+C”組合鍵。
Tshark中還提供了強大的統計功能,這個功能通過參數-z來實現,這個參數后面需要使用Tshark所指定的值,可以使用如下命令:
tshark -z -h
Tshark所有可以使用的值如圖所示:
這里面我們選擇使用“io,phs”作為-z參數的值,這里面我們添加了-q來指定不顯示捕獲的數據包信息:
tshark -i 4 -f “port 80” -q -z io,phs
執行該命令的結果如圖所示:
Tshark功能詳情,請參考:tshark(1)
2. Dumpcap的用法
Dumpcap也是Wireshark中自帶的一個命令行工具,這種工具的優勢就在于對資源的消耗較小。
你可以使用dumpcap.exe -h來查看它的幫助文件:
這里首先來介紹幾個最為常用的選項。
-D:列出當前可以的網卡設備。
-i<>:指定要使用的網卡名字或者序號。
-f<capture filter>:使用BPF語法完成的過濾器表達式。
-b filesize:指定文件的大小。
-w<outfile>:指定用來保存文件的名稱。
這個工具的使用與Tshark很相似,dumpcap詳情功能,請參考:dumpcap(1)
3、使用Editcap對數據包進行修改
使用Wireshark在捕獲數據包時得到的文件可能會很大,Editcap就可以將這種大文件分割成較小的文件。另外,Editcap也可以通過開始時間和停止時間來獲取捕獲數據包文件的子集,刪除捕獲數據包文件中重復數據等。
同樣我們了解這個工具最好的辦法還是查看它的幫助文件,使用Editcap -h可以看到:
同樣這個幫助文件也很長,這里只顯示了其中的一部分。
下面我們以實例的方式來介紹一下它的應用:
editcap[options]…<infile><outfile>[<packet
這里面的infile和outfile是必要參數,其中infile表示要處理的捕獲數據包文件,outfile表示經過處理的文件。例如,我們已經將Wireshark中捕獲的數據包文件保存為Traces.pcapng,現在需要將里面的前2000個數據包單獨保存成另一個文件,可以執行如下所示的命令:
editcap –r Traces.pcapng packetrange.pcapng 1-2000
這里面使用了一個參數r,它的作用是保留要處理的文件Traces.pcapng,如果不使用這個參數的話,這個文件就會被刪除掉。
將一個文件拆分成多個文件時,需要指定拆分的條件,例如一個捕獲了100000個數據包的文件,我們就可以按照每2000個數據包為一個新文件的方式作為條件。
拆分時使用的參數為c:
editcap –c 2000 Traces.pcapng SplitTrace.pcapng
當一個文件中包含了重復的數據包時,可以使用參數d或者D來將重復的數據包去掉,其中-d在檢測一個數據包是否重復的時候,只會和當前數據包的前5個進行比較,而參數-D則可以指定范圍(有效值可以是0~100000)。
editcap –d Traces.pcapng nodupes.pcapng
4、使用Mergecap對數據包進行合并
相比起其他工具,Mergecap的功能比較單一,它主要的功能就是將多個文件合并成一個文件,最基本的語法為
mergecap –winfile1.pcapng infile2.pcapng…
也就是mergecap后面跟多個文件名,其中的第一個是其他文件合并生成的。
主要參數的作用如下:
-a:將多個文件拼接成一個文件,默認為按照數據包的時間戳進行合并。
-s<snaplen>:將文件中的數據包均截斷為<snaplen>字節。
-w<outfile>:設置保存為文件名。
-F<capture type>:設置保存的文件類型,默認為pcapng。
-T<encap type>:設置保存文件的封裝類型,默認和原始文件類型一致。
下面的例子中就將source1.pcapng、source2.pcapng、source3.pcapng這3個文件合并成了一個merged.pacap文件。
mergecap –w merged.pacap source1.pcapng source2.pcapng source3.pcapng
另外,我們也可以只截取目標數據包的一部分來進行合并,例如截取每個數據包的前128個字節,使用的命令如下所示:
mergecap –w merged.pacap -s 128 source1.pcapng source2.pcapng source3.pcapng
5、Capinfos的使用方法
capinfos是一個顯示數據包捕獲文件信息的程序。
這個程序最常見的參數如下所示:
-t輸出包文件的類型
-E輸出包文件的封裝類型
-c輸出包的個數
-s輸出包文件的大小(單位:byte)
-d輸出包所有包的總字節長度(單位:byte)
-u輸出包文件中包的時間周期(單位:second)
-a輸出包文件中包的起始時間
-e輸出包文件中包的結束時間
-y輸出包文件中包的平均速率(單位:byte/s)
-i輸出包文件中包的平均速率(單位:bit/s)
-z輸出包文件中包的平均字節長度(單位:byte)
-x輸出包文件中包的平均速率(單位:packet/s)
如果需要查看這個包的所有信息:
capinfos caps.pcap
執行的結果如圖所示:
6、USBPcapCMD的使用方法
USB技術的應用越來越廣泛,我們常用的U盤、鼠標、鍵盤都是USB設備。我們有時也會遇見要對這種設備進行調試的情形,但是很少有人知道其實Wireshark也是可以勝任這一任務的。
Wireshark可以像處理網絡中的通信一樣來捕獲和解析USB設備的通信。
Wireshark2.0之后就加入了對USB協議的支持,USB協議版本有USB1.0、USB1.1、USB2.0、USB3.1等,目前USB2.0比較常用。這里,我們介紹如何使用Wireshark來捕獲和分析USB協議。
使用Wireshark對USB進行調試的時候需要考慮所使用的操作系統,默認情況下,Windows環境中需要安裝專門的軟件才能完成這個工作。不過Wireshark2.0以上的版本提供了一個名為USBPcap的工具。這個工具需要管理員的工作權限,這個工具沒有提供圖形化的操作界面,所以我們需要在命令行下完成這些工作。
首先我們將工作目錄切換到USBPcap的安裝目錄:
cd c:program FilesUSBPcap
使用-h作為參數來查看這個工具的幫助:
C:Program FilesUSBPcap>USBPcapCMD.exe -h
如果現在需要列出當前連接設備的話,我們只需要輸入這個工具的名稱即可,無需任何參數。執行之后你就可以看到一個USB設備里列表,在這個列表可以找到所需要調試的設備。
下圖演示了一個在我的工作環境(Windows 7)下的USB設備列表,這里面我的計算機連接了一個無線網卡,一個USB鼠標,一個USB鍵盤和一個USB2.0集線器,它們都連接到了\.USBPcap1上。
最后一行會顯示“Select filter to monitor(q to quit):”,在這里面輸入要捕獲信息的控制設備。這里只有一個設備\.USBPcap1,所以我們輸入數字1。
之后我們還要再輸入一個文件的名稱,你可以按照自己的習慣來命名。這個文件將用來保存捕獲到的USB設備信息。
我們可以使用Enter鍵來開始捕獲USB流量,當開始捕獲之后,這個控制臺不會有任何的顯示。
當捕獲結束的時候,可以使用Ctrl+C組合鍵。然后USBPcap控制臺就會關閉,所有捕獲的數據將會保存在C:Program FilesUSBPcap下。
然后我們就可以使用Wireshark來查看這個捕獲文件:
二、Wireshark過濾器
Wireshark的世界里有2種過濾器,分別是采集過濾器和顯示過濾器,采用恰當的過濾器,不但能提高數據分析的靈活性,而且能讓分析者更快看到自己想要的分析對象。
1、Wireshark采集過濾器
使用Wireshark采集數據包時,可能有諸多原因會使用到采集過濾器,比如減少采集的數據包大小來節省磁盤空間,加速問題和目標分析,提高軟件自身工作速率等等。
1. 為什么要使用抓包過濾器
當網絡中數據流的規模相當龐大時,只抓取滿足某些條件的流量就顯得十分重要了。如果用戶需要在生產環境中進行流量分析,那他一定遲早會需要使用到抓包過器。用戶要在開始抓包之前使用抓包過濾器。總之,Wireshark抓取的每個數據包都會提交給抓包引擎,再由抓包引擎將抓取的數據包轉換成人類可以讀懂的格式。但是,如果用戶應用了抓包過濾器,那么Wireshark就會丟棄與用戶需求不符的那些數據包。Wireshark不會將這些丟棄的數據包交給抓包引擎進行轉換。相比之下,顯示過器就要具體和強大得多了。在使用抓包過濾器時,用戶一定要謹慎,因為如果有些數據包因為與用戶定義的規則不符可能被丟棄,這些丟棄的數據包是無法恢復的。
創建過源器時要使用伯克利數據包過器(BPF)語法,還有很多協議分析軟件使用的也是這種語法,因為這種語法是行業標準。這種語法很容易學習和使用,使用基本的格式來構建用戶的過濾標準就行了。
2. 如何使用抓包過濾器
最簡單直接的使用方式如下圖,在Wireshark主體界面,直接輸入抓捕過濾器表達即可。
也可以選擇已有的過濾器名稱,直接使用。
如下圖:
3. 如何管理過濾器
管理過濾器的目的是提前定義常用的過濾器,在使用的使用直接使用,以避免再去查找語法或書寫規范等操作。
選擇捕獲——捕獲過濾器,即可打開捕獲過濾器管理窗口。
在捕獲過濾器窗口,你可以定義自己想要的過濾器并保存,下次使用的使用,直接從下拉菜單選擇就行。
在定義捕獲過濾器時,有個小技巧,就是多用復制功能,這種先通過復制形似的過濾器,然后再調整修改的方式能夠加快過濾器的定義速度,提高定義過濾器的準確性。
4. 抓包過濾器語法規則
捕獲過濾器應用于Winpcap,并使用 Berkeley Packet Filter(BPF)語法。這個語法被廣泛用于多種數據包抓包軟件,主要因為大部分數據包抓包軟件都依賴于使用BPF的libpcap/Winpcap庫。
掌握BPF語法對你在數據包層級更深入地探索網絡來說是非常關鍵的。使用BPF語法創建的過濾器被稱為表達式,并且每個表達式包含一個或多個原語。每個原語包含一個或多個限定詞,然后跟著一個ID名字或者數字,如下圖是對限定詞的介紹。
下圖是一個完整的抓包過濾器示例:
在這個給定表達式的組成部分中,一個src限定詞和192.168.0.10組成了一個原語。這個原語本身就是表達式,可以用它只捕獲那些源IP地址是192.168.0.10的流量。
你可以使用以下3種邏輯運算符,對原語進行組合,從而創建更高級的表達式。
連接運算符與(&&)
選擇運算符或(II)
否定運算符非(!)
舉例來說,下面的這個表達式只對源地址是192.168.0.10和源端口或目標端口是80的流量進行捕獲。
src 1921680.108 && port 80
5. 常見抓包過濾器列表
以下是常見的抓包過濾器,供參考。
過濾器 | 過濾器 |
host 192.168.1.1 | 所有與主機192.168.1.1相關的流量 |
port 8080 | 所有與8080端口相關的流量 |
src host 192.168.1.1 | 所有從主機192.168.1.1始發的流量 |
dst host 192. 168.1.1 | 所有去往主機192.168.1.1的流量 |
src port 53 | 所有由53端口發出的流量 |
dst port 21 | 所有去往21端口的流量 |
src 192.168.1.1 and tcp port21 | 所有從19216811且與tcp端口21相關的流量 |
dst 192.168.1.1 or dst 192.168.1.2 | 所有去往192.168.1.1或者去往192.168.1.2的流量 |
not port 80 | 所有與80端口不相關的流量 |
not src host 192.168.1.1 | 所有非主機192.168.1.1發出的流量 |
not port 21 and not port 22 | 所有既與21端口無關,也與22端口無關的流量 |
tcp | 所有tcp流量 |
2、Wireshark顯示過濾器
和抓包過濾器不同,顯示過濾器是在現有的數據包中通過過濾條件,篩選查看想要的對象,不需要顯示的內容被“隱藏”,而執行了抓包過濾器,不需要的數據包則會直接被丟棄,無法挽回。
1. 顯示過濾器簡介
顯示過濾器遠比抓包過濾器更加靈活和強大。顯示過濾器不會丟失數據包,只是為了增強用戶閱讀而將一部分數據包隱藏起來。丟棄數據包有時并非明智選擇,因為一旦數據包被丟棄,這些數據包也就無法再恢復回來了。
在分組列表面板上面的輸入框,你可以輸入顯示過濾器,或者通過下拉顯示近期使用的過濾器記錄,來選擇使用顯示過濾器。
在用戶配置了顯示過濾器之后,只有那些滿足用戶過濾器設置條件的數據包才會被顯示出來。使用應用了顯示過濾器之后,就會在Wireshark狀態欄的第二列看到使用顯示過濾器后的相關信息。
2. 如何快速創建顯示過濾器
顯示過濾器可以在Packet List(數據包列表面板)上面右鍵,從作為過濾器、準備過濾器和對話過濾器中快速生成,如下圖所示。顯示過濾器使用的語法很容易理解并使用。對于新手來說,顯示過濾器是一種超級強大的功能,它會讓你分析起數據包游刃有余。
顯示過濾器可以用很多不同的參數作為匹配標準,比如IP地址協議、端口號、某些協議頭部的參數。此外,用戶也用一些條件工具和組合運算符創建出更加復雜的表達式。用戶可以將不同的表達式組合起來,讓軟件顯示的數據包范圍更加精確。在數據包列表面板中顯示的所有數據包都可以用數據包中包含的字段進行過濾顯示。
3. 顯示過濾器語法結構
每條顯示過濾器通常都是由若干原詞構成,原詞之間通過連接符(如and或or等)連接,原詞之前還可以添加not表示相反的意思,其語法如下所列。
[not]表達式[and or] [not]表達式
下圖是顯示過濾器表達式中條件運算符的解釋。
下圖是邏輯運算符的說明解釋:
4. 常用顯示過濾器參考
以下是常見顯示過濾器,供參考。
5. 如何保存過濾器
當你創建了很多捕獲和顯示過濾器之后,會發現其中有一些使用得格外頻繁。為了每次使用它們的時候都不重新輸入,可以讓Wireshark把常用的過濾器規則保存下來,供以后使用。
選擇分析——顯示過濾器,打開顯示過濾器窗口,就能看到系統默認自帶的部分顯示過濾器。
根據自己的需求,在顯示過濾器窗口,使用新增和刪除功能,進行過濾器創建和刪除,你也可以使用復制這一快捷的方法,先復制類似形式的已有過濾器,再通過修改名稱和過濾器內容,形成新的過濾器。
三、使用Wireshark分析數據包技巧
在進行數據包分析過程,一定會遇到成千上萬的數據包需要分析的常見。如何在如此大量數據的環境中快速得到你想要的對象,提高分析效率和精準度呢?采用常見的分析技巧,也許能給你帶來極大的幫助。
1、使用查找數據包
如果要快速查找到分析想要的數據,按ctr+f快捷鍵,打開查找輸入框,輸入框中可輸入顯示過濾器、十六進制值、字符串和正則表達式內容。
以下是搜索類型和例子,關于正則表達式,這里不再展開。
當你選好選項并在文本框中輸入搜索關鍵詞之后,單擊查找,就會找到滿足該關鍵詞的第一個數據包。如果想要找到下一個匹配的數據包,按Ctrl-N,想要找前一個,按Ctrl-B。
2、標記數據包
在找到那些符合搜索條件的數據包之后,就可以根據需要進行標記。舉例來說,可能你希望將那些需要分開保存的數據包標記出來,或者根據顏色快速查找它們。被標記的數據包會以黑底白字顯示(你也可以單獨將標記了的數據包選擇出來,然后作為數據包捕獲保存下來)。
被標記的數據包將在你的屏幕上以高亮顯示。在下面這個例子中,數據包50被標記并且顯示為深色。
如果你想要標記一個數據包,右擊Packet List面板,并在彈出菜單中選擇 Mark Packet,或者在Packet List面板中選中一個數據包,然后按Ctrl-M。
如果想取消對一個數據包的標記,再按一次Ctrl-M就可以將其取消。在一次捕獲中,你想標記多少個數據包都可以。如果你想要在標記的數據包間前后切換,分別按SHIFT-CTRL-N和SHIFT-CTRL-B切換即可。
3、打印數據包
盡管大多數情況下分析都會在電腦前進行,但你仍然可能需要將捕獲結果打印出來。我經常將數據包打印出來,并貼在顯眼的位置,這樣在做其他分析的時候,就可以快速地參考這些內容。特別是在做報告的時候,能夠將數據包打印成一個PDF文件將是非常方便的。
如果需要打印捕獲的數據包,在主菜單中選擇文件——打印,打開打印對話框。
你可將選中的數據以文本或者Post Script的格式打印或者輸出到一個文件。與 另存為對話框相似,你也可以按一定范圍打印數據包,比如被標記的數據包,或者作為過濾器篩選結果顯示出來的數據包。對于每一個數據包,你也可以在主面板中選擇打印對象。在你做好了這些選擇之后,單擊打印。
4、設定數據包相對時間參考
時間在數據包分析中非常重要。所有在網絡上發生的事情都是與時間息息相關的,并且你幾乎需要在每個捕獲文件中檢查時間規律以及網絡延遲。Wireshark意識到時間的重要性,并提供了一些相關的選項以供設定。下面介紹相對時間參考。
數據包的相對時間參考,可以讓你以一個數據包作為基準,而之后的數據包都以此計算相對時間戳。當一系列的順序事件不是在捕獲開始時被觸發,而是在中間某個地方被觸發,這個功能會變得非常好用。
如果希望將某一個數據包設定為時間參考,在 Packet Listi面板中選擇作為相對參考的數據包,然后右鍵,選擇設置/取消設置時間參考。同樣,如果要取消一個數據包的相對時間參考,還是在這個地方操作。
當你將一個數據包設定為時間參考之后,Packet List面板中這個數據包的Time列就會顯示為REF*,如下圖所示。只有當捕獲的時間顯示格式設定為相對于捕獲開始的時間,設定數據包時間參考才有用處。使用其他設定都不會生成有用的結果,并且其產生的一堆時間會很令人迷惑。
數據包相對時間參考在分析網絡性能問題,網絡延時,應用性能問題及最終用戶體驗時都極為重要,熟練掌握相對時間參考設置,能夠讓分析事半功倍。
下圖為網深科技NetInside企業級應用性能管理系統自動分析出網絡數據包中的各種延時及最終用戶體驗,企業級系統能夠針對任意一個用戶、任意一個IP、任意一個網段或任意一個應用系統做這樣的分析輸出,而這樣的分析只需動動手指就能夠完成。
5、匯總分析一個抓包文件
抓包匯總功能在生成數據包分析報告時常常用到。
1. 如何打開匯總分析
要打開匯總分析,首先要打開一個抓包文件。
打開菜單——捕獲文件屬性,彈出的窗口就是匯總分析界面。
2. 匯總分析功能解讀
下圖是匯總分析界面,詳細顯示了該抓包文件的相關信息,下面我們將詳細解讀匯總分析中各個條目的內容。
捕獲文件屬性對話框可以分為下面幾部分。
文件:顯示的是一些總體的信息,比如文件名、文件所在位、長度、哈希、使用的格式、封裝等。
時間:這一部分顯示抓取第一個數據包和最后一個數據包的時間,以及之間經歷的時間(也就是總的抓包時長)。
捕獲:這一部分會顯示捕獲報文的網卡信息、操作系統信息及當前使用的Wireshark系統版本信息。
接口:這里會顯示所有抓取流量接口的詳細信息
統計:這里會顯示與所有顯示過濾器有關的統計數據,以及應用過濾器之后遭忽略數據包的百分比。
捕獲文件描述:用戶可以在這里寫入備注信息。
下圖是統計部分的內容,它們提供了各種詳細的數據,包括以表格形式提供的匯總數據,其中包含了各類基本信息,如數據包的平均大小、抓取到的數據包總數,第一次抓到數據包和最后一次抓到數據包之間經歷的時間等。
比如,我們在應用顯示過濾器之后生成了一個抓包文件。在此之后,我們再次打開捕獲文件屬性窗口。可以看到統計部分顯示了捕獲文件和使用了顯示過濾器后的結果比較。
捕獲文件屬性窗口所提供的所有信息來源于所有打開的數據包文件,如果使用了顯示過濾器,則顯示使用了過濾器的數據包。
6、查看數據包中協議信息
網絡協議是網絡分析的基礎信息,網絡分析人員拿到一個抓包文件后,往往會快速了解一下。一個抓包文件中都由哪些協議組成,這些協議的占用比例分別是多少,協議層級關系如何等等,這些疑問都可以由Wireshark自帶的協議分級功能來回答。
1. 打開協議分級
要打開協議分析,意味著你已經打開了一個抓包文件。
打開菜單——協議分級,彈出的窗口就是協議分級統計界面。
協議分級統計可以給用戶提供通信中使用到的各個協議的分布信息,同時也可以向用戶展示出那些不符合網絡基準的異常操作。所謂各個協議的分布信息,是指這個界面可以顯示某種協議在兩臺主機間通信數據中所占的百分比以及相關的統計數據,比如顯示每種協議分別發送和接收了多少比特、多少個數據包。用戶網絡當前的流量狀態與網絡正常狀態下建立的流量基線相比較,就很容易發現網絡中的異常操作。
2. 協議分級統計詳細解讀
協議分級統計以直觀的樹形圖展開顯示,第一列分級顯示了協議信息,以及協議之間的層級關系。
后面分別列舉多個指標信息,下面詳細解讀一下。
按分組百分比:顯示了抓包文件中所含數據包在每一種協議類型中的占比情況(按數據包的個數來統計)。
分組:顯示了每一種協議類型的數據包的個數。
按字節百分比:顯示了抓包文件中所含數據包在每一種協議類型中的占比情況(按數據包的字節數來統計)。
字節:顯示了每一種協議類型的數據包的字節數
比特/秒:顯示了某種協議類型的數據包在抓包時段內的傳輸速率。
結束 分組:顯示了隸屬于該協議類型的數據包的凈數量。
結束 字節:顯示了隸屬于該協議類型的數據包的凈字節數。
結束 位/秒:顯示了隸屬于該協議類型的數據包在抓包時段內的凈傳輸速率。
3. 如何知道某人在干什么
如果要快速查看某個人在網絡上干了什么,只需要先做個顯示過濾器,過濾器的內容是這個人的IP地址,例如ip.addr==10.66.2.100。然后在打開協議分析統計查看,查看到的就是這個人相關的所有協議信息。
協議分級統計窗口能夠提供當前網絡中活動的協議信息,是分析者經常使用的功能之一,因為它是當前網絡的直觀寫照。
7、數據包會話分析
在網絡分析中,經常會有這樣一個需求,就是想知道當前網絡誰最活躍,誰和誰之間的流量傳輸最大,即占用的帶寬最多,以及最活躍的對象占用了多大的帶寬。
1. 什么是會話
網絡中的一個會話(conversation),就如同現實中兩個人在接打電話,舉例來說,張三和李四會話可能是這樣子的:“你好嗎?”,“我很好,你呢?”,“非常好!”。
而在網絡中的會話,描述的是兩臺主機(端點)之間進行的通信。192.168.1.2和192.168.0.10之間的一個會話可能就是這樣的“SYN”” SYN/ACK””ACK”。
會話可以說基于數據鏈路層MAC之間的,也可以是基于網絡層IP之間的,如下圖舉例說明這2類會話。
2. 如何打開會話分析
要打開會話分析,點擊菜單統計——會話。
在打開的窗口,用戶就會看到下圖所示內容,這個窗口顯示出很多列信息,包括網絡中正在傳輸的數據包、網絡中傳輸的比特數量、數據流量、設備的MAC地址,以及很多其他的詳細信息。在窗口的最上方,用戶可以看到很多標簽,每個標簽顯示關于一種協議的信息在標簽中除了協議名稱之外,用戶還可以看到個數字,這個數字表示的是當前獨立會話的數量。
3. 如何查看流量最大的會話
想要找出網絡中誰的流量最大,看看這些流量是從哪里傳輸過來的,那么用戶就可以在打開的會話分析窗口,點擊Pv4標簽,然后按照降序來排列數據包。在這里,窗口中顯示的第一行信息就是這位用戶正在尋找的答案。如下圖,該圖顯示了這里所說的信息。
在第一行中,用戶可以看到各個端點收發了多少數據包字節,以及設備抓包的總時長。如果用戶想要創建個過器,也可以用同樣的方法右鍵點擊第一行信息,然后就可以創建出用戶想要設置的表達式了。選擇第一個可選項A<>B,這里只會顯示與地址A( Address A)和地址B( Address B)有關的數據包。
4. 會話分析常用技巧
在會話分析過程中,最常用的是針對網絡第二、三、四層內容進行分析。通過點擊會話分析窗口中不同標簽,找到分析答案。
Ethernet標簽:來觀察具有不同MAC地址的主機間發生過什么樣的“溝通”。
IPv4標簽:來觀察具有不同IPv4地址的主機間有過什么樣的“交流”。
TCP或UDP標簽:來觀察具有不同IPv4地址的主機間所建立的各種TCP(或UDP)會話。
在現實網絡分析中,使用這些常用分析標簽,不但能夠分析二層的廣播風暴、MAC地址沖突等故障,而且能夠分析網絡中存在的掃描現象,感染病毒的主機定位,異常服務器發現,或者異常的應用連接行為。
遺憾的是,Wireshark無法通過圖形方式直觀展現這些內容,只能是一行行的表格信息。
8、數據包終端分析
和會話分析類似,會話分析告訴我們,網絡中誰與誰之間的表現最活躍,占用的流量最大。終端分析,能夠告訴我們,每個終端的不同表現和數據。終端可以是一個MAC地址,也可以是一個IP地址,還可以是一個IP地址+端口(TCP或UDP應用)。
1. 如何使用終端分析
終端即網絡會話中的一側。要打開終端分析,點擊菜單統計——終端。即可打開終端分析窗口。
每臺主機都可以借助網絡接口卡(NIC)中的物理地址(常常稱為MAC地址)進行通信,設備會使用這個地址在一個本地網絡中實現通信。
比如說,在我們觀察到一個網絡中的流量異常繁忙時,就會發現這個流量與網絡中日常傳輸的流量模式不同。接下來,我們就希望能夠找出到底是哪臺設備創建流量的模式與過去不一樣。對于網絡管理員來說,這時就應該使用終端分析,在打開終端分析窗口之前,可以從數據包列表面板中隨便點擊一個TCP數據包。此時,用戶會在頂部看到很多標簽,每個標簽分別顯示一種不同的協議。其中有些協議是激活的,有些則是非激活的。當流量中包含了與某種協議有關的數據包時,這個標簽中顯示的協議就是激活的;否則,這個協議就是非激活的。
首次打開終端分析界面,默認顯示二層網絡的終端分析信息。在窗口中,用戶可以看到很多關于各個端點的詳細信息,比如傳輸的數據包總數、傳輸的總字節數,以及一個端點接收和傳輸的字節總數與數據包總數。
如果想要分析網絡三次信息,只需點IPv4標簽。就可以輕而易舉的查看到網絡中IP地址信息,通過排序,就能找到數據量最大的終端地址。
2. 終端分析技巧
在終端分析窗口,顯示了大量的標簽和密密麻麻的數據排列,可能有讓人摸不著頭腦。下面介紹部分終端分析的技巧,用來識別和分析常見的網絡故障。
Ethernet端點(MAC地址)少,IP端點(IP地址)多:對于這種現象,可能的原因是有一臺路由器來負責轉發所有進、出本地LAN(IP子網)的IP流量。也就是說,對于源或目的IP地址不隸屬于本地IP子網的所有數據包,其源或目的MAC地址都會是那臺路由器內網LAN口的MAC地址,這屬于正常情況。
IP端點(IP地址)少,TCP端點(TCP端口號)多:就是每個IP端點都試圖建立或已經建立了多條TCP連接。對于
這種現象,可能正常也可能不正常。若建立或試圖建立多條TCP連接的IP端點為服務器,這就屬于正常情況;否則,極有可能是有人在發動網絡攻擊(比如, TCP SYN攻擊),或開啟了基于P2P的程序而導致的。
終端分析通常與會話分析結合使用,可以快速發現網絡中占用流量最大的節點或會話,也可以配合顯示過濾器使用。通過終端分析,也能夠發現部分常見網絡或應用故障,協助管理員快速解決問題。
9、HTTP協議分析工具
Web應用作為全球使用最多的應用,HTTP協議可謂功不可沒。無論是個人博客、電子交易平臺或是新聞資訊,Web站點隨處可見,而后臺默默無聞支撐其運行的則是HTTP協議,因此,如果要運維和優化好關鍵的基于Web應用的核心業務系統,掌握HTTP協議基礎和工作原理,常見故障分析和性能優化等技能必不可少。
Wireshark內置了強大的HTTP協議分析功能。
點擊菜單統計——HTTP,就可以看到Wireshark內置的針對HTTP的分析功能列表,一共4個,分別是分組計數器、請求、負載分配和請求序列(Request Sequences)。
如下圖:
分組計數器:用來了解抓包文件中HTTP數據包的總數,以及其中HTTP請求數據包和HTTP響應數據包分別為多少。
請求:用來了解(主機)請求訪問的Web站點的分布情況,以及所訪問的Web站點上的具體資源(指向資源的URL)。
負載分配:用來了解抓包文件中HTTP數據包(包括HTTP請求和HTTP響應數據包)在各Web站點間的分布情況(即訪問過哪些web站點)。
請求序列:HTTP請求序列使用HTTP的Referer和Location頭部信息,將捕獲的HTTP請求排序以樹狀顯示。該功能可以讓分析人員能夠看到一個HTTP請求與下一個HTTP請求的關系。
10、讓Wireshark圖形說話
Wireshark內置了強大的數據流圖形,通過圖形可以直觀的分析和定位故障原因。使用者想要精準的分析出問題原因,熟練掌握和使用圖形功能是必備要求之一。
Wireshark自帶了I/O圖表、流量圖、TCP流圖形、UDP多播流以及對語音流量分析中的部分圖形,由于UDP多播流正在開發,語音流分析使用相對較少,目前重點簡單介紹前三種圖形功能。
1. I/O圖表
I/O圖表,借助于該工具,同時配搭預先定義的顯示過濾器,便可以生成各種易于閱讀的信息統計圖表。比如,可生成單一IP主機吞吐量統計圖表、兩臺或多臺主機間流量負載統計圖表、應用程序網絡吞吐量統計圖表,以及TCP現象分布統計圖表等。
通過這種方式,我們可以看到流量的波峰和波谷,這個圖形可以用來找出網絡中的問題,甚至可以用來進行流量監測。在圖中x軸的數據表示時間,單位為秒,而y軸的數據表示的則是每單位時間的數據包數量。x軸和y軸的范圍可以根據用戶的需要而進行調整,X軸的范圍是從10到0.001秒,而y軸數值的范圍則是數據包/字節比特。
2. 流量圖
流量圖,該工具直觀顯示了會話節點之間的信息,包括時間、端口及詳細的TCP傳輸控制和數據傳輸報文信息。
這是Wireshark最強大的特性之ー,當用戶需要面對存在大量連接斷開、大量數據幀丟失或者大量流量重傳等情況的環境時,這種特性就可以協助用戶進行排錯。數量圖可以讓我們創建一個很多列的圖,這張圖會顯示兩個端點間傳輸流量的匯總信息,它甚至可以讓用戶將輸出結果導出為一個簡單的文本格式文件。這是驗證客戶端和服務器之間連接狀態的最佳方式。
3. TCP流圖形
TCP流圖形,利用該工具,可深入分析單個TCP連接的內部傳輸和控制細節。因此,該工具能大大幫助網管人員分析和查找TCP故障,定位故障根本原因。
TCP流圖形又可以按照功能細分,分別有時間分析、吞吐量分析、往返延時分析及窗口大小變化分析等等。
四、基于生成的IP統計分析
在網絡分析過程,往往會使用到對某個地址的詳細內容進行分析和統計,這個要求使用顯示過濾器配合會話及終端分析功能還不足以滿足。
1、怎樣打開IP統計
基于IP統計分別針對IPv4和IPv6,這里只介紹IPv4的統計功能。點擊菜單統計——IPv4 Statistics下拉菜單,能看到Wireshark自帶的4個統計IP的功能(分別是所有地址、目標和端口、IP協議類型及源–目標地址)。
如下圖:
2、IP統計分析詳細介紹
以下是對各個IP統計功能的詳細介紹。
1. 所有地址
所有地址IP統計,顯示抓包文件中每個IP地址的數據包個數,頻率,占有百分百和高峰值相關信息。
使用者也可以通過顯示過濾器,只查看某一個或幾個IP的統計數據,顯示過濾器在下方直接輸入即可。
2. 目標和端口
目標和端口,統計了各個IP傳輸層端口的數據包個數及相關信息。這個功能能夠詳細查看任意IP地址都在通過哪些端口傳輸數據。
3. IP協議類型
IP協議類型,統計不同協議的數據包個數,占比及相關信息。
4.源-目標地址
源和目標地址統計,分別查看作為源地址或目的地址的IP統計信息。
在一份分析報告中,如果要詳細分析并記錄某個IP地址的內容和網絡活動,采用上述IP統計功能,就能夠精確、細致的統計該地址的所有細節信息,該功能也可用于異常分析。
五、如何定位網絡性能問題
定位分析網絡性能問題是網絡分析中最為常見的需求之一,影響網絡性能的因素很多,每一個轉發數據包的環節出現了問題,都有可能會造成性能的下降。
幸運的是,如果我們采集到了這些數據傳輸過程的原始報文,那么則可以通過Wireshark撥繭抽絲,一步步找到問題的可能答案。
1、IO圖形分析工具介紹
首先,打開你想要分析的抓包文件。
點擊菜單統計——I/O圖表。
下圖是I/O圖表信息,在圖形窗口中,上半部分區域為圖形顯示區域,下半部分區域為顯示過濾器配置區域。
在下半部分區域,通過“+”或復制按鈕,新增一個圖形名稱,寫入過濾器內容,設置顏色,同樣可以設置圖形的樣式,Y軸和X軸的信息,以及圖形顯示粒度。勾選最前面的enabled列復選框,就能生效。
在Style列,雙擊對應的行,可以選擇圖形顯示風格,例如line(線)、 Impulse(脈沖)、Fbar(粗線)、Dot(點)等等。
在Y Axis列,雙擊對應的行,可以選擇Y軸數據單位,例如Packets(數據包)、 Bytes(字節)、bits(位)等等,還有很多公式可選擇,具體內容后續會有詳細講解。
還有很多其它設置,比如Y字段,顯示粒度,顯示間隔,鼠標行為,顯示時間等,相對比較簡單,不再一一細述。
2、使用I/O工具分析
上面講述了I/O圖形分析工具的基本信息,以下看看如何使用該工具分析。
I/O分析工具的精髓在于與顯示過濾器的配合使用,所以對使用者來說,對顯示過濾器的理解和熟練程度,直接關系到I/O分析工具的功能發揮如何。
例如,如果要分析192.168.30.124這個地址在某段時間的數據傳輸狀況,使用者可以創建過濾器,然后設置該對象的圖形顯示格式,調整Y軸和X軸的信息,不但能夠從整體上查看這個地址的數據傳輸情況,也能夠查看到更細微信息(例如把X軸時間調整為10毫秒的時間傳輸情況)。
3、測試網絡吞吐量
網絡吞吐量在網絡分析中常常遇到,比如分析者想知道某個客戶端和服務器的傳輸速率,或者某臺服務器在網絡中的帶寬大小等。利用數據包分析軟件,能夠精確分析任何對象的網絡吞吐量,這為進一步容量規劃、策略調整及應用優化都有重要意義。
1. Wireshark能測試哪些吞吐量
所謂測試網絡吞吐量,既可以指測算通信線路上兩臺設備(客戶端和服務器、IP電話-IP電話等)間相互通信的吞吐量,也可以指測算兩臺設備上運行的某一具體應用程序間相互通信的吞吐量。
一般來說,常規的流量測試方法包括:測算主機到主機的流量、測試發往某指定服務器的所有流量、測試發往某指定服務器運行的某種應用程序的所有流量、統計發生在某指定服務器與TCP性能有關的所有現象。
如下圖:
測試鏈路上未端設備之間基于單個連接所發生的流量,并了解流量的來源,是定位網絡故障的第一步。
2. 測試兩端設備的吞吐量
打開需要測試的抓包文件,點擊菜單統計——I/O圖表,在選項中,設置所有分組Y軸單位為bits,默認看到的就是該抓包文件中所有對象的吞吐量。
如下圖:
假如,要測試客戶端192.168.30.124與服務器114.112.96.29之間的吞吐量,則可以在I/O圖表下部添加過濾器,表達式為 ip.addr==114.112.96.29 && ip.addr==192.168.30.124,再設置顯示樣式和顏色,Y軸設置為bits,時間間隔使用默認的1秒。這時候新建項目所顯示的內容,就是我們想要測試的這2個終端之間的吞吐量。
如下圖:
3.測試某個應用程序的吞吐量
測試某個應用程序的吞吐量,方法與測試兩端連接吞吐量的類似。只是過濾器內容不同。假如要測試某個抓包文件443端口的所有流量。方法如下。
打開抓包文件,點擊菜單統計——I/O圖表,設置過濾器,表達式為tcp.port==443,太簡單調整顯示設置,即可得到443端口應用的流量。如下圖。
4、使用TCP數據流圖形分析窗口大小
滑動窗口控制機制,是整個TCP協議工作的中控臺或核心站。當TCP連接建立時,協議棧會為不同的連接劃分出獨立的緩沖空間,而在數據傳輸過程中,則存在復雜的傳輸控制過程。由于這個過程管理和處理的復雜性,很多性能問題往往就出現在這里。
1. 打開TCP窗口分析界面
打開需要分析的抓包文件。選擇想要分析的數據幀。
點擊菜單統計——TCP流圖形——窗口尺寸。
如下圖:
窗口大小分析面向單向TCP會話,從打開的窗口可以看到題目信息,窗口尺寸對于某某連接及方向。如下圖,顯示了114.112.96.29向192.168.30.124流向中,443端口發往54645端口數據的窗口大小及數據傳輸情況。
2. 分析TCP滑動窗口
在TCP窗口分析界面,默認顯示2類線條。最上面淺綠色的是接收方宣告的窗口大小(Windows Size),代表接收方還有多大緩沖空間可接收數據。下方深色黑點則代表數據發送方的實際數據傳輸大小。
在滑動窗口分析過程,分析人員可以使用鼠標放縮功能,定位到具體的某一個細節,詳細分析。如下圖,通過鼠標放縮,查看數據發送方在某一時刻具體的數據發送大小和數量。
3. 常見TCP窗口故障分析技巧
TCP滑動窗口分析是網絡性能分析中關鍵的分析對象之一。針對TCP窗口可能出現的相關信息或錯誤,Wireshark通過內置專家系統會自動提示,或者以不同的顏色區分顯示。分析人員也可以根據自己的喜好或分析習慣,自定義顯示樣式。
下面簡要列舉一下在Wireshark專家系統中,可能會看到的關于TCP窗口的相關信息,這其中可能是錯誤,也可能是告警或記錄。
Zero Window:如果TCP接收方窗口已滿,這時接收方會通知發送方,讓發送方暫停一段時間,不要繼續發送消息。這時,在Wireshark專家系統中就會查看到這類消息。
Zero Window Probe:如果從客戶端那里接收數據包的服務器不能以客戶端發送數據包的相同速率來處理數據包,就會導致丟包的情況。在這種情況下,服務器就會向客戶端發送零窗口探測包。讓客戶端暫停一段時間不要發送數據包,同時保持這條連接不會斷開。
Zero Window Probe ACK:和Zero Window Probe消息的例子有關。Zero Window Probe ACK消息是客戶端發送的消息,其作用是對服務器的請求做出響應。
Window is full:這種消息的作用是通知發送方主機,TCP接收窗口當前已滿。
Windows Update:這類消息可以讓發送方意識到TCP接收窗口的大小已更新。
當然,與TCP窗口相關的分析信息不僅限于上述列舉出來的。總之,滑動窗口分析在數據包分析過程占有較高的比重和分量,是分析人員不能忽視的對象。只有詳細了解了在Wireshark中顯示的這些關于TCP窗口的信息的意義和產生原因,才能在實戰中得心應手,精準分析出問題根本原因。
5、服務器響應延時分析
下面這臺關鍵主機,服務器的響應延時竟然有1秒多。
因為表單中看到的數據是個平均值,所以時延分布情況,需要時一步確認。在單個IP最終用戶體驗分析中,搜索43的主機,情況如下:
發現這臺主機的服務器響應延時都在秒級波動,最高值達到4秒,基于采樣時間原因,我們有理由相信真實延時肯定會更大,且在同時間段,幾乎沒有流量,那么這個現象就比較奇怪了。
沒有連接失敗請求,沒有多大流量,但服務器響應延時較大,因為生產網都是千M網絡,看上去根本不存在影響時延的因素,所以什么原因導致此情況,值得探究。
為了進一步分析,我們在netinside系統里面,把這臺主機在時間點13:36前后的數據包下載下來(按時間點下載主要是為了減少數據包的大小,更精準分析問題),導入wireshark,一探究竟。
因為服務器的響應時間,本質上就是RTT(RoundTrip Time),即往返時間。測量方法是發送一個特定序號的字節,并記錄時間。
當收到確認的ACK之后,把ACK的時間,減掉之前記錄的發送時間,就可以得到RTT值,該值比較大時,通常會被專家系統診斷為“網絡或服務器繁忙“。
1.配置wireshark
數據包導入wireshark后,分析RTT需要先進行簡單配置,如下:
該步驟是開啟TCP會話時間戳計算,默認可能已經開啟,如果沒有開啟的話,手動按上面方法開啟即可,然后按以下方法,把RTT應用為列:
列的名字,可以自行修改。需要注意的是,這個時間戳是由發送端系統依據自己的時鐘打上去的,如果系統時間本身有誤,則會給分析帶來困擾,所以分析之前,先要確認各系統,包括抓包系統的時間沒有問題。
2.RTT分析
經過上個步驟的配置,在wireshark中分析RTT就很簡單了,只要在“應用顯示過濾器”中,輸入“tcp.analysis.ack_rtt > 4”,然后回車就可以了。
里面的“4”,就是我們在netinside系統中看到的4秒延遲,因為我們確定實際延遲比會比這個大,所以我們只要”>4″即可,結果如下圖:
通過過濾,我們可以快速找到RTT>4數據包,因為我們之前是精確定位下載,所以可以看到有一個數據包的RTT值是9秒多,這與我們推測符合。
很顯然,光看一個數據看不出什么情況,此時我們就需要把綠色框中“86”記下,并通過這個流ID,把這個數據包相關的流過濾出來進行分析,如下圖:
把TCP流過濾出來后,發現個奇怪地方,即>4的RTT好像有三個(紅框),而我們剛才過濾時,只看到了9.99的這個,那么為什么10秒的就不算RTT呢?
這個是不是wireshark有問題?請注意綠框,數據長度為0的ACK,我們先把TCP流圖打開看下,如下圖:
通過上圖,我們可以看到兩個間隔10秒,都是由43產生的,并非是一個有效的交互,上下兩個報文的seq及ACK都相同。
這種現象原因是,上面playload長度為0的ACK僅僅是通知對端滑窗,因為沒有傳數據,所以對端不再響應,處于等待狀態。
而后43開始正常發送數據時,接著使用相同的SEQ與ACK,這樣就把TCP的交互繼續流動起來。所以,這個10秒是由43本身等待造成,不算是RTT,而真正算RTT的就是綠框標注的,即9秒的那個交互。
由此產生的一個疑問就是,43到底在干什么,在一個TCP的交互中,總是會停下來休息一伙?我們接著查看觸碼內容,如下圖:
基于解碼內容,基本可以推斷,這可能是一個操作mongoDB的定時任務,這樣話,前面的間隔10秒與第三條間隔9秒的,本質上沒有太大區別,都屬于43向170的請求。
也就是說43主機每間隔差不多10秒左右就會發一個請求給170。因為是請求間隔,所以我們基本認為,這種延遲理論上不影響實際業務。
不過需要注意的是,netinsdie系統里面看到是43這臺服務器的響應延時,而我們分析的實際情況是43服務器的請求延時,這明明就是兩個概念,這兩種不同的延時對是否存在問題的判斷是有顯著區別的,那這是什么問題呢?
實際上,在一個TCP流里面,其實是無法區別應用請求方向的,TCP的主動打開還是被動打開,并不能決定應用層哪個是請求,哪個是響應,所以站點TCP層的角度,方向是可以切換分析,如下圖:
從43往170這個方向看,服務器延時(RTT)在0.3MS左右,所以很顯然,170的響應延時挺正常。而如果我們切換方向,則會如下:
從上可以看到,切換方向后,就有一個近10秒的延遲,而從TCP層看,這個延遲是由43來響應產生的,而我們通過上面的分析也就知道,這其實是43的請求間隔,而非響應延遲。
所以,如果站在43是臺服務器的角度,把這個10秒延遲歸到服務器響應延遲里面,從TCP的角度是完全沒有問題的。
從剛才的分析中,我們在wireshark里面對問題抽絲剝繭,進行了透視,得出明確的結論。
一般情況下,不帶業務請求的,通常是在三次握的時候,所以也被叫做IRTT,這個時間,基本只包含網絡與服務器內核響應延時,所以會當做業務分析延時的一個基準。
在wireshark里面,如果你抓包有抓到三次握手,那么它會聰明的把這兩個時間放在一起,供我們分析,如下圖:
所以,基于這兩個數值的對比,我們就可以大概率確定,問題所在方向,是應用還是網絡或服務器本身。而且通過服務器響應延時的方向,即服務端或者客戶端,我們也可以看到與wireshark中切換方向看到的同一效果。
到這階段,我們基本上可以預見,應用可能存在問題,只不過,這種問題,對于業務來講,是正常還是不正常,我們就得看業務邏輯了,而這個時候,就只能導到wireshark中去解個碼。
對于內部不同業務場景下,對TCP的使用建立模型,標定基線,是后續進一步高效運維,快速發現并排除潛在業務影響的關鍵基礎。
九、網絡延遲排查實戰
1、建立一個訪問遠程服務器的仿真網絡
我們在生活和工作中經常會遇到應用程序可以使用,但是速度卻變得十分緩慢的情況。例如,在使用瀏覽器查看某個網頁的時候,可能會等待很長時間才能查看到頁面的內容。對于大多數人來說,這是一個非常棘手的問題,因為在這個過程中有很多設備參與其中,而這些設備又分布在不同的位置,使用者不可能對它們逐一進行排查,所以也很難找到問題所在。
為了能夠更好地了解整個網絡的狀況,我們首先來構建一個模擬的仿真網絡,在這個網絡中存在著客戶端、服務器以及連接它們的各種設備。
構建完成的仿真網絡如圖所示:
這個網絡主要由以下3個部分組成:
客戶端所在網絡,包括“客戶端”“內部交換機”“網關”“DNS服務器”。
互聯網,包括“互聯網路由器”。
服務器所在網絡,包括“目標網關”“交換機”“HTTP服務器”。
下面我們給出這個網絡的具體設計過程,步驟如下所示。
(1)設計中的兩個主要網絡的IP地址分配為:客戶端所在網絡IP地址為192.168.1.0/24,目標網絡所在網絡IP地址為192.168.4.0/24。
(2)打開ENSP,按照圖7-1中所示向網絡拓撲中添加兩個Server,一個Client,一個交換機S3700,3臺路由器AR1220。
(3)其中client的設置如圖所示。
(4)DNS服務器的基礎設置如圖所示。
如下圖所示,在服務器信息中的“DNSServer”中添加一條DNS記錄,主機域名為“www.a.com”,IP地址為“192.168.4.100”,單擊“增加”按鈕之后將其添加到DNS記錄之后,再單擊“啟動”按鈕。
(5)兩臺交換機不進行任何配置,3臺路由器的左側均為GE0/0/0接口,右側為GE0/0/1接口。
(6)3個路由器使用了動態路由協議rip,其中網關路由器的配置如下:
[Huawei]interface GigabitEthernet0/0/0
[Huawei-GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0
[Huawei-GigabitEthernet0/0/0]quit
[Huawei]interface GigabitEthernet0/0/1
[Huawei-GigabitEthernet0/0/1]ip address 192.168.2.1 255.255.255.0
[Huawei-GigabitEthernet0/0/1]quit
[Huawei-rip-1]network 192.168.1.0
[Huawei-rip-1]network 192.168.2.0
(7)互聯網路由器的配置如下:
[Huawei]interface GigabitEthernet0/0/0
[Huawei-GigabitEthernet0/0/0]ip address 192.168.2.2 255.255.255.0
[Huawei-GigabitEthernet0/0/0]quit
[Huawei]interface GigabitEthernet0/0/1
[Huawei-GigabitEthernet0/0/1]ip address 192.168.3.1 255.255.255.0
[Huawei-GigabitEthernet0/0/1]quit
[Huawei-rip-1]network 192.168.2.0
[Huawei-rip-1]network 192.168.3.0
(8)HTTP路由器的配置如下:
[Huawei]interface GigabitEthernet0/0/0
[Huawei-GigabitEthernet0/0/0]ip address 192.168.3.2 255.255.255.0
[Huawei-GigabitEthernet0/0/0]quit
[Huawei]interface GigabitEthernet0/0/1
[Huawei-GigabitEthernet0/0/1]ip address 192.168.4.1 255.255.255.0
[Huawei-GigabitEthernet0/0/1]quit
[Huawei-rip-1]network 192.168.3.0
[Huawei-rip-1]network 192.168.4.0
(9)HTTP服務器的基礎配置,如圖所示。
在其中的服務器信息中設置HttpServer,這里需要建立一個網頁。如果你手頭沒有專門用來設計網頁的工具,可以使用最常見的Word來完成,在C盤下建立一個名為net的文件夾。然后新建一個Word文檔,在文檔中輸入“Hello word”。
然后在菜單欄中依次單擊“另存為”→“其他格式”,起名為“default.htm”。將其保存到C盤net文件夾中(該文件更需要讀者自行創建),如圖所示。
接下來我們在HTTP服務器中將net文件夾作為網站發布出去,這個網站只包含了一個名為“default.htm”的頁面,如圖所示。
好了,到現在為止,我們已經完成了整個仿真環境的模擬,不妨使用client來訪問HTTP服務器以驗證它是否能正常工作。我們在客戶端中打開“客戶端信息”選項卡,左側首先選擇HttpClient,然后在右側的地址欄中輸入“http://192.168.4.100/default.htm”。
可以看到當在地址欄中輸入地址之后單擊獲取按鈕時,就會顯示一個“File download”的文件保存對話框,這就表示已經成功地打開了目標頁面。這里需要注意的是,模擬的瀏覽器并沒有IE或者Firefox那么強大的功能,它無法真正地從數據包中解析并顯示網頁的內容。
2、在Wireshark中觀察遠程訪問的過程
現在我們已經建立好了一個仿真網絡,它雖然簡化了很多,但是運行原理和真實網絡是完全一樣的。剛剛我們使用客戶端的瀏覽器訪問了HTTP服務器,這個過程一共只用了幾秒(甚至更短)。但是在這個過程中都發生了什么呢,我們對此一無所知。那么現在我們就在Wireshark的幫助下來解讀剛剛所經歷的一切。
在仿真網絡中,我們可以使用Wireshark在任何一個節點查看數據包,這也是它的優勢所在。但是在實際工作中,我們是不可能做到這一點的。因此在這個示例中,我們僅考慮在上圖網絡中的內部進行數據包的觀察,實驗過程如下所示。
(1)如下圖所示,在client的端口上啟動Wireshark,在實際工作中,你可以選擇使用TAP來分流client的數據。
(2)在client的客戶端中輸入“http://www.a.com/default.htm”,按下“獲取”按鈕,如圖所示。
(3)返回Wireshark,查看捕獲到的數據包,如圖所示。
下面我們就以捕獲到的數據包文件為例來詳細地了解剛剛都發生了什么?
按照最簡單的思路來說,客戶端會產生一個請求發送給服務器,然后服務器再將資源發回給客戶端。
不過實際的情形要遠遠比這復雜得多,該如何做才能將請求數據包發送到目標服務器呢?
首先我們需要明確的一點是在這個過程中客戶端的工作是由“操作系統”和“應用程序”兩個部分共同完成的。而客戶端上網的這個過程就是先從“操作系統”開始的。
(1)首先我們使用的客戶端計算機位于一個局域網內部,它所有的通信要分為局域網內部通信和局域網外部通信兩種。當我們在嘗試使用瀏覽器去訪問HTTP服務器的時候,第一個步驟就是要判斷這個訪問的服務器與我們所使用的主機是否在同一個局域網中。這個判斷需要由操作系統完成,本例中我們要訪問HTTP服務器的IP地址為192.168.4.100。
操作系統要先將自己的IP地址和子網掩碼轉換成二進制,然后進行“與”運算。例如當前主機的IP地址為192.168.1.10,子網掩碼為255.255.255.0。
計算的過程如下表所示:
將轉換為二進制的11000000.10101000.00000001.00001010與11111111.11111111.11111111.00000000進行與運算之后,11000000.10101000.00000001.00000000就是客戶端所在的子網,轉換成十進制就是192.168.1.0。
同樣的方法計算目標地址192.168.4.100所在的子網為192.168.4.0,二者不在同一子網。因此這個訪問的服務器與我們所使用的主機不在同一個局域網中。
(2)同一局域網的通信可以直接發送給目標,但是發往不同局域網的通信則要先交給網關。因為HTTP服務器位于局域網的外部,所以現在客戶端計算機的第一個工作就是要找到網關。之前客戶端的設置中已經將網關設置為“192.168.1.1”。在這次通信中所有的數據包都應該由這個網關轉發。 但是在局域網內部是無法使用IP地址進行通信的,因為局域網中的交換機只能識別MAC地址。
如果你僅僅告訴交換機IP地址,交換機是不能將其轉發到網關的。所以現在我們需要一種可以將IP地址轉換成MAC地址的機制,在網絡協議中就提供了一個專門完成這個任務的協議:ARP。
ARP是通過一個查找表(ARP緩存)來執行這種轉換的。當在ARP緩存中沒有找到地址時,則向網絡發送一個廣播請求,網絡上所有的主機和路由器都接收和處理這個ARP請求,但是只有相同IP地址的接收到廣播請求的主機或路由器,發回一個ARP應答分組,應答中包含它的IP地址和物理地址,并保存在請求主機的ARP緩存中。其他主機或路由器都丟棄此分組。
(3)當我們成功地找到網絡出口之后,接下來要做的就是客戶端和服務器建立一個連接。這個連接也正是通過TCP協議的三次握手實現的。
(4)當連接成功建立之后,操作系統的工作就完成了,此時將會由應用程序來構造HTTP請求數據包。那么需要注意的是,TCP 3次握手的最后一個數據包是由客戶端的操作系統發出的,而HTTP請求數據包是由客戶端上的應用程序所完成的。
一般情況下,操作系統在完成TCP操作時所消耗的時間可以忽略不計。但是應用程序在構造請求或者回應時卻可能造成明顯的延遲。在這個階段,客戶端所發送的TCP數據包和HTTP之間的間隔就是應用程序產生所花費的時間。
(5)當客戶端上應用程序產生的請求發送出去之后,經過路徑到達服務器之后,服務器會給出回應,這兩個數據包之間的時間就是數據包傳送的時間加上服務器上應用程序的響應時間。
3、Wireshark中時間顯示
在對數據包進行分析的時候,時間是一個很重要的參考值。Wireshark會根據系統的時鐘來為捕獲到的每個數據包加上一個時間戳。Wireshark在保存文件的時候,也會將捕獲數據包的時間保存起來。當你使用另外一臺設備來打開這個文件的時候,Wireshark會根據新設備所處的時區對時間進行調整。我們在分析一些Wireshark官方的數據包時,就會遇到這種情況。因為這些數據包往往是在美國產生的,而我們位于中國,看到數據包的時間會與當時捕獲的時間有所不同。
我們平時使用的時間格式有兩種,一種是常用的某年某月某日,稱為絕對格式。另一種就是形如秒表上的顯示,這個示數表示的是經過了多久,例如2分21秒,稱為相對格式。
默認情況下,Wireshark中提供了一個顯示捕獲數據包時刻的“Time”列,如下圖所示。
這個列中顯示的是相對值,捕獲到第一個數據包的時間定義為零點,之后捕獲到數據包的時間值都是距離這個零點的時間間隔,單位為微秒。
Wireshark為了能夠更好地對數據包進行分析,還提供了多種時間的顯示方式。如果要修改這些顯示方式的話,可以在菜單欄上依次單擊“視圖”→“時間顯示格式”,Wireshark中提供的包括如圖所示的選項。
默認情況下,Wireshark使用的“自捕獲開始經過秒數”,那么第一個捕獲到數據包的時間值就是0.000000,所有其他的數據包都是參照第一個數據包定的,這樣就是顯示了從捕獲開始所經過的時間。我們也可以使用其他的格式,從Wireshark這個菜單中提供的名稱上可以很清楚地了解到這些格式的意義。例如“自上一個捕獲分組經過的秒數”就表示顯示當前數據包和它前面時間數據包的間隔。而“自上一個顯示分組經過的秒數”則表示在使用了顯示過濾器的情況下,當前數據包和它前面數據包的間隔。
這個菜單的下半部分顯示了時間的精度,默認為自動。這里我們同樣可以對其進行調整,這些精度可以設置為秒、十分之一秒、百分之一秒、毫秒、微秒、納秒等。大部分的設備都可以精確到毫秒級,但是如果要精確到納秒級別的話,就需要考慮網卡是否支持。如果使用一個不支持納秒的設備捕獲數據包的話,而我們又在這里設置了精度為納秒的話,最后面的3位就會顯示全部為0。 只使用某一種時間格式的話不太容易看出數據包之間的關聯,但是來回切換時間格式又過于煩瑣。這時我們就可以選擇在原有時間列的基礎上再添加新的列,這個列用來顯示當前包與前面包的時間間隔,具體的步驟如下。
(1)首先單擊菜單欄上的“編輯”→“首選項”,或者直接單擊工具欄上的“首選項”按鈕。
(2)然后在如下圖所示的首選項窗口左側選擇“外觀”→“列”。
(3)這時首選項窗口的右側就會顯示出當前數據包列表中的全部列,點擊左下方的“+”號就可以添加新的一列。
(4)這時在首選項窗口的右側就會添加新的一行,這一行分成兩個標題和類型兩個部分,我們單擊標題處為新添加的列起一個名字,這里我們為其起名為tcp.time_delta。
(5)在類型下面的Number下拉列表框處,選中我們需要的列內容。
其中和時間有關的選項如圖所示:
“Absolute date,as YYYY-MM-DD,and time”:這個選項用來顯示捕獲設備所處時區的日期和時間,例如“2018-04-25 12:53:06.775724”。
“Absolute date,as YYYY/DOY,and time”:這個選項同樣是用來顯示捕獲設備所處時區的日期和時間。但是不顯示月和日,而是一年中的第多少天。例如2018年4月25日就是這一年的第115天,按照這個格式顯示就是“2018/115 12:53:06.775724”。
Relative time:這個選項用來顯示當前數據包距離捕獲第一個數據包的時間間隔。
Delta time:這個選項用來顯示當前數據包距離上一個數據包的時間間隔。
Delta time displayed:這個選項用來顯示當前數據包距離上一個數據包(在使用了顯示過濾的情況下)的時間間隔。
Custom:雖然上面提供了很多可以使用的時間格式,但是我們可能還會需要進行一些自定義的操作。例如在計算同一個會話中這些數據包之間的時間間隔,這時前面的格式就無法滿足這個需求了,于是Wireshark還提供了一個Custom(自定義)功能。
如圖所示,我們在類型里選擇使用Custom類型,在字段處輸入“tcp.time_delta”,最后在字段發生處添加一個“0”。
(6)單擊“OK”按鈕即可將這個列添加到數據包列表面板中。
在數據包列表面板中已經多了一個名為“tcp.time_delta”的列,但是現在該列還不能正常工作。我們還需要完成如下的步驟。
在Wireshark首選項窗口中依次選擇“Protocols”→“TCP”。
勾選“Calculate conversation timestamps”,默認這個選項是不被選中的。選中之后Wireshark會為TCP會話中的數據包再加上一個新的時間戳,用來表示該數據包在當前會話的產生時間。
單擊“OK”按鈕。這時再查看數據包列表面板就可以看到新的一列已經起作用了。
Wireshark提供了這么多的時間格式,那么我們又該如何對它們進行選擇呢?這個問題的答案其實很簡單,首先我們需要明確Wireshark分析的目的是什么,然后才能確定要使用的時間格式。比如我們需要知道捕獲數據包的具體日期和時間,或者需要找出與系統日志相關的數據包時,就可以采用“Absolute date,as YYYY-MM-DD,and time”這種絕對時間格式。如果我們要研究在開始捕獲之后的一段特定時間內發生的事件,就可以使用”“Relative time”這種相對時間格式。如果你希望對特定數據包(例如客戶端和服務器之間的請求和應答)之間的時間間隔進行研究,“Delta time”這種時間格式則是很好的選擇。
這里還必須提到一點,在默認情況下,Wireshark會以捕獲第一個數據包的時間作為原點。但是我們也可以自行將某一個數據包定義為原點,具體的方法是在一個數據包上單擊鼠標右鍵,在彈出的菜單上選中“設置/取消設置時間參考”,此時這個數據包的時間列就會顯示為“*REF*”。如果我們使用了相對時間格式的話,它之后的所有數據包都會將這個數據包的捕獲時間作為原點。
4、各位置延遲時間的計算
在整個上網過程中,一共可以分成4個階段,但是由于其中的ARP階段位于內網,而且速度非常快,因此通常不會引起網絡延遲,這里只考慮后面的3個階段,分別是網絡傳輸延遲、客戶端應用程序引起的延遲和服務器應用程序引起的延遲。需要注意的一點是,這種延遲分類的方法是基于Wireshark捕獲數據包得出的。
下圖顯示了上網過程中捕獲到的數據包:
這5個數據包的含義如下圖所示,其中①②③④⑤分別對應著上圖中的第9、10、11、12、13這幾個數據包。
網絡拓撲圖:
1. 網絡傳輸延遲的計算
當發生網絡延遲時,我們首先需要考慮的就是傳輸線路導致的延遲。如圖所示,我們首先來查看捕獲到的TCP 3次握手中的第2個數據包。
它的tcp.time_delta值為0.062,這個值是由3個時間共同組成的:
從客戶端到服務端的時間;
服務端操作系統接收TCP 3次握手的syn請求,并回應一個(syn,ack)回應;
從服務端到客戶端的時間。
考慮操作系統在處理TCP握手時的時間很短,這個值可以看作是由第一個和第3個時間組成的,也就是數據包在線路上傳輸所花費的時間。如果這個值較大的話,則說明線路傳輸時出現了延時,這個原因可能是由服務端和客戶端之間的設備造成的。
2. 客戶端延遲的計算
第2個網絡延遲的位置就位于客戶端,這是由于客戶端上的應用程序造成的。我們平時所使用的瀏覽器就是一個典型的例子,當你使用瀏覽器打開了太多的窗口時,速度就會變得十分緩慢。另外,很多用來完成網絡操作的客戶端由于設計的缺陷也會消耗大量的時間。
這部分延遲時間的值可以通過查看第12個數據包的time_delta值得到。其中第11個數據包是由操作系統產生并發送出去的,這是因為客戶端操作系統在處理TCP連接時的時間很短,例如圖中這個值為0(實驗環境,實際情況中要比這大一些)。
在客戶端操作系統向目標發送了TCP 3次握手的最后一次握手包之后,客戶端的應用程序還會繼續向目標發送一個HTTP請求。這個請求所花費的時間就是客戶端延遲的時間。
3.服務端延遲的計算
如果排除了前面兩個網絡延遲的可能性,那么延遲的位置就只能位于服務器。由于我們現在的觀察點位于客戶端,所以并不能直接獲得服務器產生HTTP回應的時間。我們可以觀察第12個數據包(客戶端發出的HTTP請求)和第13個數據包(服務端發出的HTTP回應)之間的時間來計算這個時間。
如圖所示,這個0.109秒是由網絡傳輸和服務端產生回應共同構成的,所以我們可以大致估計服務端用來生成回應的時間為0.109?0.062=0.047。
如果網絡發生延遲的話,我們可以根據下面的方法來確定延遲發生的位置。
如果上面網絡拓撲圖中的②處數據包的延時較大的話,則可以確定延遲發生在傳輸的路徑上。
如果上面圖網絡拓撲圖中的④處數據包的延時較大的話,則可以確定延遲發生在客戶端處。
如果上面圖網絡拓撲圖中的⑤處數據包的延時較大的話,則可以確定延遲發生在服務器處。
十、網絡故障排查實戰
1、建立一個用于測試的仿真網絡
為了能夠更好地了解整個網絡的狀況,我們首先來構建一個模擬的仿真網絡,在這個網絡中存在著客戶端、服務器以及連接它們的各種設備。
構建完成的仿真網絡如圖所示:
這個網絡結構的配置和延遲的網絡拓撲圖基本一樣,只是在內部網絡中多添加了PC1和PC2,其中PC1的配置如圖所示。
而PC2的IPv4配置中采用了DHCP方式,如圖所示。
另外由于這個實驗中我們還需要一臺DHCP服務器,這里為了精簡網絡結構,所以我們在原來的網關路由器上開啟了DHCP功能,開啟的命令如下所示:
interface GigabitEthernet0/0/0
ip address 192.168.1.1 255.255.255.0
2、導致不能上網的原因
在實際生活中導致計算機不能上網的原因有很多,正常情況下我們可以按照如下的步驟來進行故障排除。
檢查用戶所用設備的網卡是否正常啟動。
檢查用戶所用設備上每個網卡的IP地址、子網掩碼、默認網關配置是否正確。
檢查用戶所在網絡的ARP協議是否正常工作,例如網關的MAC地址是否正確。
檢查用戶所在網絡的DNS協議是否正常工作。
檢查用戶所使用的具體網絡服務是否正常工作。
下面我們就按照這個順序來分別研究一下這些故障,其中前兩個故障的排除都屬于計算機的基本配置。
3、檢查計算機的網絡設置
1. 確保網卡正常啟動
雖然在正常情況下設備的網卡都是啟用的,但是也有很多情況網絡故障確實是由于網卡沒有啟動所造成的。在Windows操作系統中我們可以使用命令行中的ipconfig命令來查看網卡的狀態和基本信息(IP地址、子網掩碼、網關等信息)。如果在Linux系統中的話,可以使用ifconfig命令。
如圖所示,這里面的①部分的“本地連接4”就是一個沒有啟動的網卡,而②部分的“本地連接2”則是一個正常工作的網卡,我們需要確保當前要使用的網卡已經啟動。
2. 檢查IP配置的正確性
一臺計算機如果需要正常上網的話,那么就需要配置如下信息:
IP地址;
子網掩碼;
網關地址;
DNS服務器地址。
通常一臺計算機的IP配置有兩種方法,一是手動配置,二是使用DHCP分配的方式。這里面的網絡配置包括IP地址、子網掩碼、網關和DNS服務器地址。當你使用ipconfig命令查看之后,發現網卡雖然啟用,但是沒有顯示IP地址時,就需要詢問網絡管理員,或者參考同一單位其他人的計算機來確定IP配置所使用的方法。如果該計算機所處網絡采用手動配置的方法,那么就需要根據網絡的部署對其進行配置。
下圖給出了Windows環境下對IP配置的方法:
如果這個網絡要求采用DHCP動態分配IP方法的話,那么我們就需要對其進行分析了。
如圖所示,以內部網絡的PC2為例,該主機采用DHCP動態分配IP地址的方式。但是在工作中卻發現該主機無法上網。
我們對這個主機進行檢查,使用“ipconfig”命令查看這臺主機的網絡設置,發現并沒有得到IP地址等信息。
現在我們可以確定該計算機不能上網的原因在于沒有通過DHCP協議獲得IP地址等信息,但是究竟是由于本機受到病毒感染從而造成DHCP協議不能正常工作,還是DHCP服務器沒有正常工作,這還需要我們進一步分析。
首先我們可以在PC2處使用Wireshark進行抓包分析:
在Wireshark中使用“bootp”作為顯示過濾器,可以看到如下圖所示的數據包。
這里可以看到PC2在網絡中持續發送“DHCP Discover”數據包,這些數據包的目的地址為“255.255.255.255”,表示這是一個廣播數據包。而源IP地址為“0.0.0.0”則是因為該計算機現在還沒有得到IP地址,不過由于它本身具有MAC地址,所以可以在局域網內部通信。
我們打開這個數據包的Ethernet部分可以看到它的MAC地址為“54:89:98:1c:67:fb”,如圖所示,這也正表明了該數據包來自于PC2。
繼續向下移動到Bootstrap位置,我們可以看到這個信息的類型為Boot Request (1)。
DHCP的消息一共有8種,下表給出了DHCP協議中的8種類型。
按照DHCP協議的要求,客戶端會在網絡中廣播“DHCP Discover”請求,用來尋找DHCP服務器,而當服務器收到這個請求之后,會用DHCP Offer來響應DHCP DISCOVER報文,此報文攜帶了各種配置信息。但是在我們剛剛捕獲到的數據包中,卻沒有發現“DHCP Offer”報文,這說明在DHCP服務器端出現了問題。
通過排查,我們發現DHCP服務器已經被關閉。我們隨后啟動DHCP服務器,然后繼續使用Wireshark查看捕獲到的數據包。
如果一臺機器正常啟動的話,最先捕獲到的兩個數據包分別為DHCP Discover和DHCP Offer數據包,然后是DHCP Request和DHCP Acknowledgment數據包。
在DHCP Offer數據包中包含如下數據:
你(客戶端)的IP地址:這是DHCP服務器提供可以使用的IP地址。
子網掩碼:這是DHCP服務器提供的可以在網絡上使用的子網掩碼。
域名服務器:這是DNS服務器的IP地址。
網關:這是網關的IP地址。
這些信息是保證網絡通信最基本的內容,正常情況下,用戶的設備會收到一個這樣的DHCP Offer數據包回應。
下面我們給出了一個完整的DHCP Offer數據包的詳細內容,如圖所示。
當網絡比較繁忙時,我們也可以使用過濾器來只顯示出指定類型的DHCP數據包,例如只顯示DHCP Acknowledgement類型的數據包,這個過濾器表達式為:
bootp.option.dhcp==5
如果方便的話,可以將這個過濾器作為一個按鈕。另外我們也可以將顯示異常的DHCP過濾器字符串作為一個按鈕,例如當網絡中出現第4類型、第6類型、第7類型的DHCP數據包都會導致用戶設備不能上網,這個過濾器如下所示:
bootp.option.dhcp==4||bootp.option.dhcp==6||bootp.option.dhcp==7
可以單擊過濾表達式右側的“+”,然后在標簽里輸入名稱DHCP Error,在過濾器中輸入上面的表達式,然后單擊“OK”按鈕。
以后如果你需要使用這個過濾器,只需要單擊右側的“DHCP Error”。
4、檢查與網關的連接
當客戶端獲得了IP地址、網關和DNS服務器信息之后,接下來要檢查的就是網關。因為網關充當著整個網絡的出入口,所以客戶端必須要能夠連接到它。
如圖所示,我們可以使用“ping”命令來測試與網關的連接情形。
如果ping不通的話,則說明與網關的連接出現了問題。如果線路沒有問題的話,則可能考慮兩種情況,一是網關已經關閉,二是ARP協議出現了問題。
計算機需要使用ARP協議來解析位于同一網絡的網關的MAC地址。如果希望更好地對ARP數據包進行觀察的話,可以使用過濾器來完成對ARP數據包的過濾,顯示過濾器的寫法為“arp”。
另外你也可以在用戶的設備上使用“arp-a”命令來查看系統緩存中的IP與MAC地址的對應關系,如下圖所示。
如果ARP緩存中網關的IP地址與MAC地址對應沒有問題,就可以判斷ARP協議能夠正常工作。
5、檢查DNS協議
當我們需要連接到互聯網的某個網站的時候,使用的往往是一個域名而不是IP地址,這個過程中需要連接到DNS服務器對其進行查詢。
一個正常的DNS應答數據包的格式如圖所示:
如果一個客戶機不能獲取Web服務器或者應用服務器的IP地址,那么我們可以通過數據包分析的方法來分析這個故障,分析的目標就是來自DNS服務器的響應。
通過對比對失敗的DNS響應與正常的DNS響應之間的區別可以找出故障的根源。這種失敗可能由于DNS服務器配置的故障,或者由于你查詢時使用了錯誤的URL和主機名。
6、檢查網絡傳輸路徑
好了,如果之前的檢查都沒有問題的話,那么從現在開始起,發出的數據包將遠離我們,踏上去往目標服務器的路上,雖然不到一秒,但是這個數據包可能已經穿越了半個世界。
這里我們會使用Wireshark協議來分析離開網關之后的數據包。在這個分析過程中需要用到traceroute工具,它將顯示出一條從我們主機到目標主機的通路。在Windows系統中,啟動traceroute工具的命令為tracert。
下圖顯示了從本機到百度官方網站的路徑:
這個工具利用了數據包中TTL值的特性,這個值就是數據包的生存時間。雖然稱之為生存時間,但是這和我們平時所講到的時間并不相同,它的值只有在經過一個路由器之后才會減少。當一個路由器收到TTL值為0的數據包就會將其丟棄掉,并向這個數據包的源地址發回一個ICMP報文。
利用這個TTL的這個特性,traceroute程序會先向目標發送一個數據包,但是這個數據包永遠不會到達目標。因為它的TTL值被設置為1,所以它僅僅到達了第一個中轉站(路由器)就被丟棄,但是這個路由器需要向源地址發送一個ICMP數據包。這樣源主機就知道數據所經過的第一個路由器了。
接著向目標發送TTL值為2的數據包,收到應答之后,再發送TTL值為3的數據包。這樣一直到數據包到達目標為止,利用traceroute程序,我們就可以知道從源地址到達目標地址之間所經過的路由器。
這里推薦使用一個更好的工具PingPlotter,這個工具要遠遠比系統自帶的工具要強大,你可以從PingPlotter官網下載一個免費的版本。這個工具相對traceroute最大的優勢在于可以指定發送數據包的大小。
首先我們啟動Wireshark,然后PingPlotter中的對話框中輸入要目標地址“www.baidu.com”。
按下右側的三角形按鈕,這時就會開始向目標發送數據包了。等數據包到達www.baidu.com時,就可以在Wireshark中停止數據包的捕獲了,在此期間數據包經過的路徑如圖所示。
在Wireshark找到并選中PingPlotter發出的第一個數據包,然后在數據包詳細信息面板中選中IP協議部分。
利用這個工具我們就可以查看在到達目標網站之前,數據包都經過了哪些路由器以及在哪個路由器出現了問題。
7、檢查目標服務器
如果一個用戶到達目標服務器的故障是功能性的,也就是說兩者的連接沒有問題,但是用戶卻不能正常使用目標服務器上的應用。
可能導致故障的原因如下:
用戶提供的URL或者端口是錯誤的;
這個端口被防火墻所屏蔽;
應用程序不再正常工作。
第一個原因往往是用戶錯誤輸入造成的,另外兩個因素往往會導致所有人都無法訪問。我們還需要確定到底是目標主機整體都無法訪問,還是僅僅是一個程序無法訪問。如果服務器無法訪問,那么顯示ICMP信息應該為Destination Host is Unreachable或者Destination Port is Unreachable,如果目標防火墻啟用了屏蔽,那么所有的ICMP數據包都得不到回應。
如果服務器正常工作,但是應用程序卻是無法訪問的,僅僅在客戶端進行數據包捕獲獲取的信息可能并不足以找到故障的原因。但是通過查看TCP會話連接建立的數據包可以找到很多有用的信息。
如果用戶可以與目標程序建立TCP連接,但是應用程序卻不能正常工作。這時我們需要考慮的因素很多,最簡單的方法就是比較用戶與其他用戶連接目標的數據包有什么不同。
如果排除了上面提到的這些可能性,下面列出的這些因素也可能會導致出現一個功能性的故障。
(1)用戶認證:這種故障出現的主要原因是用戶缺少適當的認證、授權、權限等。這是我們檢查用戶是否正常工作的第一個步驟。
(2)用戶自己計算機上的配置:很多應用程序需要特定的配置,例如將特定文件放置在特定目錄中。還有一些應用程序需要考慮特殊插件例如java、net framework等。通常,應用程序會提供應用程序配置的錯誤故障。
審核編輯:湯梓紅
-
網絡
+關注
關注
14文章
7553瀏覽量
88732 -
python
+關注
關注
56文章
4792瀏覽量
84628 -
Wireshark
+關注
關注
0文章
49瀏覽量
6513
原文標題:【建議收藏】網絡延遲及故障分析方法指南匯總!
文章出處:【微信號:浩道linux,微信公眾號:浩道linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論