Wireshark數據包分析三板斧
引言
Wireshark是IT技術人員必備大殺器,Wireshark分析數據包的能力十分強大,能夠分析IT界的各種數據包。 本運維老狗利用和業務同學撕逼的空隙,總結了Wireshark數據包分析三板斧。
咱們以理服人,通過數據包的分析來證明系統沒問題、網絡沒問題。每板斧都能砍透甩鍋同學的腦門,讓撕逼從此優雅從容。
好了,廢話不多說,下面來展示三板斧。
第一板斧:參數設置功能使用
Wireshark默認的參數設置能夠滿足絕大多數的場景需求,但是咱們不能滿足于此對吧,下面第一板斧介紹一些參數優化設置,讓數據分析更深入。
1.協議參數的優化

A.相對序列號:系統默認使用相對序列號是為了在分析會話時,易讀易看。
但這也會同學們帶來困惑:序列號不是由隨機生成的32bit數值作為初始值么,技術書中都是這么說的,怎么看到seq都是從1開始的呢?
咱們這里可以可通過去掉勾選,看到真實的序列號,達到書中的效果。
B.計算會話時間戳:開啟后會顯示首幀距此幀,上一幀距此幀的時間間隔。適用于排查業務超時類故障。

2.顯示時間的調整
A.不同的同學可根據自己的閱讀習慣具體調整每幀顯示的時間格式及時間精度。

B.設置參考時間,將某幀設置為參考時間,后續的幀以此幀為基準時間。適用于排查業務超時類故障。

第二板斧:查找數據包、顯示過濾器
Wireshark的功能強大的原因之一就是因為它有豐富的過濾條件表達式,能夠準確過濾和分析出想要的數據信息。下面就第二板斧做詳細介紹。
1.查找數據包
該模塊只顯示分組,并不進行過濾。點擊"放大鏡"按鈕,出現顯示過濾器的下拉框,下面給同學們展示下拉框中的四種過濾條件。
A."顯示過濾器":查找包含符合過濾規則的幀。具體過濾條件在捕獲過濾器中介紹。

B."十六進制":查找包含相應十六進制的幀。比如查找MAC地址。

C."字符串":查找包含相應字符串的幀。比如在報文中查找域名。

D."正則表達式":查找包含相應正則表達式的幀。正則表達式的詳細用法,這里不做介紹,有興趣的同學可移步百度自行學習。

E.標記數據包:對特定數據包進行標記。
下圖中使用黑底白字標記了2233和2236兩幀,方便在整個數據包查找。

同時,標記的數據包可以進行具體導出。也可導出兩標記之間的數據包。如下圖所示。

2.顯示過濾器
顯示過濾器會過濾出來符合條件的數據包,并加以顯示。為了讓同學們更好的掌握顯示過濾器的用法,下面按照TCP/IP層級模型歸類了常用的過濾器。
A.以太網過濾器
- eth.addr == e8:fc:af:f7:7e:35 #顯示指定MAC地址的數據幀
- eth.src == e8:fc:af:f7:7e:35 #顯示指定源MAC地址的數據幀
- eth.dst == e8:fc:af:f7:7e:35 #顯示指定目的MAC地址的數據幀
- eth.type == 0x0800 #顯示指定類型(這里顯示TCP)的幀
B.IP過濾器
- ip #顯示網絡層為IP類型的數據包
- ip.addr = 192.168.0.1 #顯示包含指定IP地址的數據包
- ip.src == 192.168.0.1 #顯示包含指定源IP地址的數據包
- ip.dst == 192.168.0.1 #顯示包含指定目的IP地址的數據包
- ip.len == 40 #顯示包含指定長度(IP首部+數據部分)的IP數據包
C.傳輸層過濾器
- tcp #顯示網絡層為IP類型的數據包
- tcp.port == 80 #顯示指定TCP端口的數據包
- tcp.src == 80 #顯示指定TCP端口的數據包
- tcp.dst == 80 #顯示指定TCP端口的數據包
- tcp.analysis.retransmission #顯示TCP重傳數據包
- tcp.analysis.duplicate_ack #顯示TCP重復確認數據包
- tcp.analysis.zero_window #顯示包含零窗口通告信息的TCP數據包
- tcp.connection.syn #顯示TCP會話第一個包
- tcp.connection.rst #顯示TCP會話的RST包
- tcp.flags.syn ==1 #顯示TCP會話中SYN置位的包
- tcp.flags.reset ==1 #顯示TCP會話中RST置位的包
- tcp.window_size < 100 #顯示TCP窗口小于指定大小的包
- tcp.stream eq 10 #顯示特定TCP流
- tcp.len == 20 #顯示包含指定長度(TCP中的數據部分的長度)的TCP數據包
D.應用層過濾(以HTTP為例)
- http contains "XXXXX" #顯示HTTP包中包含指定內容的數據包
- http.request.uri contains "XXXXX" #顯示HTTP請求包中包含指定內容的數據包
- http.time >=0.1 #顯示HTTP響應時間大于等于指定時間的數據包
- http.request #顯示HTTP請求數據包
- http.respone #顯示HTTP應答數據包
- http.response.code == 404 #顯示代碼為404的HTTP響應數據包
- http.content_length < 10 #顯示HTTP的內容長度小于指定長度的數據包
- E.按時間過濾
- frame.time == "May 27, 2019 15:23:57.932344000"
- #顯示特定時間的數據包
- frame.time >= "May 27, 2019 15:23:57.0" && frame.time < "May 27, 2019 15:23:58.0"
- #顯示時間間隔的數據包
F.比較運算符
上面介紹了過濾器多用的是"==",其實還可以擴展,使用以下運算符。
- eq 或 == #等于
- ne 或 != #不等于
- gt 或 > #大于
- lt 或 < #小于
- ge 或 >= #大于等于
- le 或 <= #小于等于
第三板斧:統計與專家信息
前面兩板斧都屬于精準定位,是在有明確目標的情況下進行的。比如說咱們知道TCP有重傳問題,咱們就用過濾器過濾出現RST包進行分析。
第三板斧屬于整體的分析,通過統計和專家信息來判斷數據包存在哪方面的問題,然后再用前兩板斧進行精細診斷。
下面咱們具體學習第三板斧的使用。
1. 統計->已解析地址
如果咱們排查的是和公網通信的問題,可通過"已解析地址"查看地址對應的域名情況。

2.統計->對話
通過"對話"查找會話兩端的IP地址,并可進行數據包的統計,確定不同會話的通信量。

3. 統計->I/O圖表
通過"I/O圖表"可以判斷出數據包中整個會話周期或者特定時間段內的數據包情況,比如默認定義的數據包量的情況、錯報的情況。也可自定義查詢條件,個性化分析,比如下圖就自定義了TCP重置的情況(下圖紅線部分)。

4. 統計->流量圖
"流量圖"可查看會話的流量情況。特別適合分析丟包、重傳、重復ACK等情況。

5. 統計->HTTP->分組計數器
"分組計數器"可展示HTTP應答的情況,并進行數量統計。比如說200 OK的數量,404的數量等。非常直觀的就能看到HTTP會話的應答情況。

6. 統計->TCP流圖形
通過"TCP流圖形"可以判斷出數據包中整個會話周期或者特定時間段內會話的吞吐量、往返時間、窗口尺寸等情況。
下圖展示了窗口尺寸,能夠直觀的看出在會話周期內接收窗口的大小和發出字節之間的變化情況。

7.定位TCP流
我們在分析數據包時,找到了有問題的一幀,想看看此幀所屬的TCP流的情況。鼠標落在此幀上右擊,找到"追蹤流",選中"TCP流"即可過濾出此幀所屬的TCP會話。

8.分析->專家信息
通過調試"專家信息",可展示出數據包所有分組的問題,并自動進行問題分級,便于查看數據包的錯誤情況。
找到相應的錯誤后,右擊"作為過濾器應用"->"選中",即可過濾出該類型的所有數據包。下圖過濾出了重復序列號的所有數據包。

總結
通過三板斧的學習,同學們一定迫不及待的想小試牛刀了吧。但又有同學會發現三板斧拿到手了,但TCPIP的原理不太精通,不知道如何使用好斧頭。