Wireshark抓包,丟包分析?
前言
我們都知道,一般流量分析設(shè)備都支持pcap回放離線分析的功能,但如果抓的pcap丟了包,會(huì)影響最終安全測(cè)試的效果。比如說(shuō)競(jìng)測(cè)現(xiàn)場(chǎng)需要提供pcap包測(cè)試惡意文件的檢測(cè)功能,如果pcap中丟包,可能會(huì)導(dǎo)致文件還原失敗,最終惡意文件檢測(cè)功能“實(shí)效”。
那問(wèn)題來(lái)了,我們?cè)趺醋R(shí)別pcap包是否有丟包呢?接下來(lái),我們通過(guò)wireshark來(lái)查找pcap文件中的丟包線索。
完整?丟包?
思路1:透過(guò)現(xiàn)象看現(xiàn)象。
在真實(shí)的網(wǎng)絡(luò)分析場(chǎng)景中,特別是傳輸大文件時(shí),經(jīng)常會(huì)發(fā)現(xiàn)這樣的現(xiàn)象:
大文件已經(jīng)傳輸?shù)搅藢?duì)端,但是pcap中卻存在丟包。
這是為什么呢?網(wǎng)絡(luò)數(shù)據(jù)包真的有完整地傳輸給對(duì)端嗎?
毋庸置疑,對(duì)端收到了完整地文件,數(shù)據(jù)包時(shí)肯定傳輸?shù)搅藢?duì)端。那為什么wireshark中的pcap包丟包了呢?
我們還是來(lái)看看wireshark的抓包原理吧!
wireshark在Linux操作系統(tǒng)中,底層是基于libpcap進(jìn)行抓包的,tcpdump底層也是基于libpcap的,關(guān)于tcpdump的底層的收包原因已經(jīng)在tcpdump能進(jìn)行丟包分析嗎?一文中已經(jīng)分析過(guò)了網(wǎng)卡層面的流程和入口,這里就不再贅述了。
由此我們可明確一點(diǎn):產(chǎn)生上述現(xiàn)象的原因,并不是網(wǎng)卡丟包,因?yàn)榫W(wǎng)卡層面的丟包肯定會(huì)影響文件數(shù)據(jù)的完整性,由此如果我們排除wireshark使用錯(cuò)誤產(chǎn)生的丟包,還可能是在下面這個(gè)過(guò)程中丟的包:
通過(guò)deliver_skb來(lái)進(jìn)入 packet_rcv階段 ,packet_rcv 把收到的skb放到當(dāng)前的packet socket緩沖區(qū),應(yīng)用層調(diào)用recvfrom就可以將緩沖區(qū)中的數(shù)據(jù)包拷貝到應(yīng)用層,從而實(shí)現(xiàn)libpcap的收包,大致過(guò)程如圖1所示:

圖1:libpcap的收包過(guò)程
所以我們能夠得出wireshark丟包的原因可能是:
- packet socket緩沖區(qū)已滿導(dǎo)致丟包;
 - 從緩沖區(qū)拷貝到應(yīng)用層中斷異常導(dǎo)致丟包。
 - 當(dāng)然排除以上兩條,也有可能是多路徑網(wǎng)絡(luò)結(jié)構(gòu)允許屬于同一 TCP 會(huì)話的數(shù)據(jù)包通過(guò)不同的網(wǎng)絡(luò)接口,導(dǎo)致wireshark捕獲的數(shù)據(jù)包不全。
 
可是在我們?nèi)粘5牧髁糠治龉ぷ髦?,往往?huì)根據(jù)對(duì)端有沒(méi)有完整地?cái)?shù)據(jù)包來(lái)判斷我們用wireshark抓的數(shù)據(jù)包是否完整,這樣做可能會(huì)嚴(yán)重影響安全測(cè)試的工作效率。那有沒(méi)有能夠快速分析pcap包中是否丟包的方法呢?
答案是有,可以用wireshark的專家信息快速分析丟包的效果。
丟包線索
思路2:透過(guò)本質(zhì)看現(xiàn)象。
打開wireshark,在工具欄中點(diǎn)擊“分析->專家信息”,如圖1、圖2所示:

圖1:wireshark的專家信息位置
wireshark的專家信息中提供了錯(cuò)誤、警告、注意、對(duì)話這4種信息,選中任意一條都能定位到具體的數(shù)據(jù)包。

圖2:wireshark的丟包警告1

圖3:wireshark的丟包警告2
那專家信息中的哪些信息提示了丟包的線索呢?
- Acked segment that wasn't capture(common at capture start),如圖2所示:表示此數(shù)據(jù)包已經(jīng)ack了未捕獲的數(shù)據(jù)。 傳輸正常,接收方已經(jīng)確認(rèn),但 Wireshark 無(wú)法在捕獲的數(shù)據(jù)中找到某段數(shù)據(jù)包, 這通常發(fā)生在捕獲設(shè)備不夠快的時(shí)候,比如libpcap的接收緩沖區(qū)已滿,或者由緩沖區(qū)向應(yīng)用層拷貝的時(shí)候?qū)е碌膩G包。
 - TCP Previous segment not captured,如圖3所示:表示如果數(shù)據(jù)包 N 標(biāo)有未捕獲的前一個(gè)段,則表示在捕獲中沒(méi)有來(lái)自同一 TCP 會(huì)話的數(shù)據(jù)包,其 [seq + 長(zhǎng)度≠數(shù)據(jù)包 N 的 seq ]。最典型的原因是數(shù)據(jù)包丟失或延遲啟動(dòng)捕獲,但也有可能是發(fā)送方的 TCP 堆棧有問(wèn)題,或者是多路徑網(wǎng)絡(luò)結(jié)構(gòu)允許屬于同一 TCP 會(huì)話的數(shù)據(jù)包通過(guò)不同的網(wǎng)絡(luò)接口,導(dǎo)致數(shù)據(jù)包確實(shí)到達(dá)目的地,但沒(méi)被 Wireshark 捕獲到。
 
結(jié)論
- 1句忠告:不能通過(guò)判斷數(shù)據(jù)包是否已被接收端收到來(lái)判斷pcap中是否丟包。
 - 1個(gè)小tip:pcap丟包可以通過(guò)wireshark的專家信息快速定位和判斷。
 - 4條經(jīng)驗(yàn):由wireshark產(chǎn)生的丟包可能有4種原因,
 
①packet socket的緩沖區(qū)已滿導(dǎo)致丟包;
②從緩沖區(qū)拷貝到應(yīng)用層中斷異常導(dǎo)致丟包;
③wireshark使用不當(dāng),延遲啟動(dòng)捕獲導(dǎo)致丟包;
④也有可能是多路徑網(wǎng)絡(luò)結(jié)構(gòu)允許屬于同一 TCP 會(huì)話的數(shù)據(jù)包通過(guò)不同的網(wǎng)絡(luò)接口,導(dǎo)致wireshark捕獲的數(shù)據(jù)包不全。















 
 
 









 
 
 
 