顯形“不可見”的網(wǎng)絡(luò)包
網(wǎng)絡(luò)世界中的數(shù)據(jù)包交互我們?nèi)庋凼强床灰姷模鼈兙秃孟耠[形了一樣,我們對著課本學習計算機網(wǎng)絡(luò)的時候就會覺得非常的抽象,加大了學習的難度。
還別說,我自己在大學的時候,也是如此。
直到工作后,認識了兩大分析網(wǎng)絡(luò)的利器:tcpdump 和 Wireshark,這兩大利器把我們“看不見”的數(shù)據(jù)包,呈現(xiàn)在我們眼前,一目了然。
唉,當初大學學習計網(wǎng)的時候,要是能知道這兩個工具,就不會學的一臉懵逼。
tcpdump 和 Wireshark 有什么區(qū)別?
tcpdump 和 Wireshark 就是最常用的網(wǎng)絡(luò)抓包和分析工具,更是分析網(wǎng)絡(luò)性能必不可少的利器。
- tcpdump 僅支持命令行格式使用,常用在 linux 服務(wù)器中抓取和分析網(wǎng)絡(luò)包。
- Wireshark 除了可以抓包外,還提供了可視化分析網(wǎng)絡(luò)包的圖形頁面。
所以,這兩者實際上是搭配使用的,先用 tcpdump 命令在 Linux 服務(wù)器上抓包,接著把抓包的文件拖出到 windows 電腦后,用 Wireshark 可視化分析。
當然,如果你是在 Windows 上抓包,只需要用 Wireshark 工具就可以。
tcpdump 在 Linux 下如何抓包?
tcpdump 提供了大量的選項以及各式各樣的過濾表達式,來幫助你抓取指定的數(shù)據(jù)包,不過不要擔心,只需要掌握一些常用選項和過濾表達式,就可以滿足大部分場景的需要了。
假設(shè)我們要抓取下面的 ping 的數(shù)據(jù)包:
要抓取上面的 ping 命令數(shù)據(jù)包,首先我們要知道 ping 的數(shù)據(jù)包是 icmp 協(xié)議,接著在使用 tcpdump 抓包的時候,就可以指定只抓 icmp 協(xié)議的數(shù)據(jù)包:
那么當 tcpdump 抓取到 icmp 數(shù)據(jù)包后, 輸出格式如下:
從 tcpdump 抓取的 icmp 數(shù)據(jù)包,我們很清楚的看到 icmp echo 的交互過程了,首先發(fā)送方發(fā)起了 ICMP echo request 請求報文,接收方收到后回了一個 ICMP echo reply 響應報文,之后 seq 是遞增的。
我在這里也幫你整理了一些最常見的用法,并且繪制成了表格,你可以參考使用。
首先,先來看看常用的選項類,在上面的 ping 例子中,我們用過 -i 選項指定網(wǎng)口,用過 -nn 選項不對 IP 地址和端口名稱解析。其他常用的選項,如下表格:
tcpdump 常用選項類
接下來,我們再來看看常用的過濾表用法,在上面的 ping 例子中,我們用過的是 icmp and host 183.232.231.174,表示抓取 icmp 協(xié)議的數(shù)據(jù)包,以及源地址或目標地址為 183.232.231.174 的包。其他常用的過濾選項,我也整理成了下面這個表格。
tcpdump 常用過濾表達式類
說了這么多,你應該也發(fā)現(xiàn)了,tcpdump 雖然功能強大,但是輸出的格式并不直觀。
所以,在工作中 tcpdump 只是用來抓取數(shù)據(jù)包,不用來分析數(shù)據(jù)包,而是把 tcpdump 抓取的數(shù)據(jù)包保存成 pcap 后綴的文件,接著用 Wireshark 工具進行數(shù)據(jù)包分析。
Wireshark 工具如何分析數(shù)據(jù)包?
Wireshark 除了可以抓包外,還提供了可視化分析網(wǎng)絡(luò)包的圖形頁面,同時,還內(nèi)置了一系列的匯總分析工具。
比如,拿上面的 ping 例子來說,我們可以使用下面的命令,把抓取的數(shù)據(jù)包保存到 ping.pcap 文件
接著把 ping.pcap 文件拖到電腦,再用 Wireshark 打開它。打開后,你就可以看到下面這個界面:
是吧?在 Wireshark 的頁面里,可以更加直觀的分析數(shù)據(jù)包,不僅展示各個網(wǎng)絡(luò)包的頭部信息,還會用不同的顏色來區(qū)分不同的協(xié)議,由于這次抓包只有 ICMP 協(xié)議,所以只有紫色的條目。
接著,在網(wǎng)絡(luò)包列表中選擇某一個網(wǎng)絡(luò)包后,在其下面的網(wǎng)絡(luò)包詳情中,可以更清楚的看到,這個網(wǎng)絡(luò)包在協(xié)議棧各層的詳細信息。比如,以編號 1 的網(wǎng)絡(luò)包為例子:
ping 網(wǎng)絡(luò)包
- 可以在數(shù)據(jù)鏈路層,看到 mac 包頭信息,如源 MAC 地址和目標 MAC 地址等字段;
- 可以在 IP 層,看到 IP 包頭信息,如源 IP 地址和目標 IP 地址、TTL、IP 包長度、協(xié)議等 IP 協(xié)議各個字段的數(shù)值和含義;
- 可以在 ICMP 層,看到 ICMP 包頭信息,比如 Type、Code 等 ICMP 協(xié)議各個字段的數(shù)值和含義;
Wireshark 用了分層的方式,展示了各個層的包頭信息,把“不可見”的數(shù)據(jù)包,清清楚楚的展示了給我們,還有理由學不好計算機網(wǎng)絡(luò)嗎?是不是相見恨晚?
從 ping 的例子中,我們可以看到網(wǎng)絡(luò)分層就像有序的分工,每一層都有自己的責任范圍和信息,上層協(xié)議完成工作后就交給下一層,最終形成一個完整的網(wǎng)絡(luò)包。