Wireshark數(shù)據(jù)包分析三板斧
引言
Wireshark是IT技術(shù)人員必備大殺器,Wireshark分析數(shù)據(jù)包的能力十分強(qiáng)大,能夠分析IT界的各種數(shù)據(jù)包。 本運(yùn)維老狗利用和業(yè)務(wù)同學(xué)撕逼的空隙,總結(jié)了Wireshark數(shù)據(jù)包分析三板斧。
咱們以理服人,通過(guò)數(shù)據(jù)包的分析來(lái)證明系統(tǒng)沒(méi)問(wèn)題、網(wǎng)絡(luò)沒(méi)問(wèn)題。每板斧都能砍透甩鍋同學(xué)的腦門(mén),讓撕逼從此優(yōu)雅從容。
好了,廢話不多說(shuō),下面來(lái)展示三板斧。
第一板斧:參數(shù)設(shè)置功能使用
Wireshark默認(rèn)的參數(shù)設(shè)置能夠滿足絕大多數(shù)的場(chǎng)景需求,但是咱們不能滿足于此對(duì)吧,下面第一板斧介紹一些參數(shù)優(yōu)化設(shè)置,讓數(shù)據(jù)分析更深入。
1.協(xié)議參數(shù)的優(yōu)化

A.相對(duì)序列號(hào):系統(tǒng)默認(rèn)使用相對(duì)序列號(hào)是為了在分析會(huì)話時(shí),易讀易看。
但這也會(huì)同學(xué)們帶來(lái)困惑:序列號(hào)不是由隨機(jī)生成的32bit數(shù)值作為初始值么,技術(shù)書(shū)中都是這么說(shuō)的,怎么看到seq都是從1開(kāi)始的呢?
咱們這里可以可通過(guò)去掉勾選,看到真實(shí)的序列號(hào),達(dá)到書(shū)中的效果。
B.計(jì)算會(huì)話時(shí)間戳:開(kāi)啟后會(huì)顯示首幀距此幀,上一幀距此幀的時(shí)間間隔。適用于排查業(yè)務(wù)超時(shí)類(lèi)故障。

2.顯示時(shí)間的調(diào)整
A.不同的同學(xué)可根據(jù)自己的閱讀習(xí)慣具體調(diào)整每幀顯示的時(shí)間格式及時(shí)間精度。

B.設(shè)置參考時(shí)間,將某幀設(shè)置為參考時(shí)間,后續(xù)的幀以此幀為基準(zhǔn)時(shí)間。適用于排查業(yè)務(wù)超時(shí)類(lèi)故障。

第二板斧:查找數(shù)據(jù)包、顯示過(guò)濾器
Wireshark的功能強(qiáng)大的原因之一就是因?yàn)樗胸S富的過(guò)濾條件表達(dá)式,能夠準(zhǔn)確過(guò)濾和分析出想要的數(shù)據(jù)信息。下面就第二板斧做詳細(xì)介紹。
1.查找數(shù)據(jù)包
該模塊只顯示分組,并不進(jìn)行過(guò)濾。點(diǎn)擊"放大鏡"按鈕,出現(xiàn)顯示過(guò)濾器的下拉框,下面給同學(xué)們展示下拉框中的四種過(guò)濾條件。
A."顯示過(guò)濾器":查找包含符合過(guò)濾規(guī)則的幀。具體過(guò)濾條件在捕獲過(guò)濾器中介紹。

B."十六進(jìn)制":查找包含相應(yīng)十六進(jìn)制的幀。比如查找MAC地址。

C."字符串":查找包含相應(yīng)字符串的幀。比如在報(bào)文中查找域名。

D."正則表達(dá)式":查找包含相應(yīng)正則表達(dá)式的幀。正則表達(dá)式的詳細(xì)用法,這里不做介紹,有興趣的同學(xué)可移步百度自行學(xué)習(xí)。

E.標(biāo)記數(shù)據(jù)包:對(duì)特定數(shù)據(jù)包進(jìn)行標(biāo)記。
下圖中使用黑底白字標(biāo)記了2233和2236兩幀,方便在整個(gè)數(shù)據(jù)包查找。

同時(shí),標(biāo)記的數(shù)據(jù)包可以進(jìn)行具體導(dǎo)出。也可導(dǎo)出兩標(biāo)記之間的數(shù)據(jù)包。如下圖所示。

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

2.統(tǒng)計(jì)->對(duì)話
通過(guò)"對(duì)話"查找會(huì)話兩端的IP地址,并可進(jìn)行數(shù)據(jù)包的統(tǒng)計(jì),確定不同會(huì)話的通信量。

3. 統(tǒng)計(jì)->I/O圖表
通過(guò)"I/O圖表"可以判斷出數(shù)據(jù)包中整個(gè)會(huì)話周期或者特定時(shí)間段內(nèi)的數(shù)據(jù)包情況,比如默認(rèn)定義的數(shù)據(jù)包量的情況、錯(cuò)報(bào)的情況。也可自定義查詢條件,個(gè)性化分析,比如下圖就自定義了TCP重置的情況(下圖紅線部分)。

4. 統(tǒng)計(jì)->流量圖
"流量圖"可查看會(huì)話的流量情況。特別適合分析丟包、重傳、重復(fù)ACK等情況。

5. 統(tǒng)計(jì)->HTTP->分組計(jì)數(shù)器
"分組計(jì)數(shù)器"可展示HTTP應(yīng)答的情況,并進(jìn)行數(shù)量統(tǒng)計(jì)。比如說(shuō)200 OK的數(shù)量,404的數(shù)量等。非常直觀的就能看到HTTP會(huì)話的應(yīng)答情況。

6. 統(tǒng)計(jì)->TCP流圖形
通過(guò)"TCP流圖形"可以判斷出數(shù)據(jù)包中整個(gè)會(huì)話周期或者特定時(shí)間段內(nèi)會(huì)話的吞吐量、往返時(shí)間、窗口尺寸等情況。
下圖展示了窗口尺寸,能夠直觀的看出在會(huì)話周期內(nèi)接收窗口的大小和發(fā)出字節(jié)之間的變化情況。

7.定位TCP流
我們?cè)诜治鰯?shù)據(jù)包時(shí),找到了有問(wèn)題的一幀,想看看此幀所屬的TCP流的情況。鼠標(biāo)落在此幀上右擊,找到"追蹤流",選中"TCP流"即可過(guò)濾出此幀所屬的TCP會(huì)話。

8.分析->專家信息
通過(guò)調(diào)試"專家信息",可展示出數(shù)據(jù)包所有分組的問(wèn)題,并自動(dòng)進(jìn)行問(wèn)題分級(jí),便于查看數(shù)據(jù)包的錯(cuò)誤情況。
找到相應(yīng)的錯(cuò)誤后,右擊"作為過(guò)濾器應(yīng)用"->"選中",即可過(guò)濾出該類(lèi)型的所有數(shù)據(jù)包。下圖過(guò)濾出了重復(fù)序列號(hào)的所有數(shù)據(jù)包。

總結(jié)
通過(guò)三板斧的學(xué)習(xí),同學(xué)們一定迫不及待的想小試牛刀了吧。但又有同學(xué)會(huì)發(fā)現(xiàn)三板斧拿到手了,但TCPIP的原理不太精通,不知道如何使用好斧頭。