wireshark抓包常見提示含義解析

wireshark抓包常見提示含義解析

轉自:http://www.cnblogs.com/redsmith/p/5462547.html

1.[Packet size limited during capture]

當你看到這個提示,說明被標記的那個包沒有抓全。以圖1的4號包爲例,它全長有171字節,但只有前96個字節被抓到了,因此Wireshark給了此提示。

【大咖講網絡】Wireshark的提示

圖1
在這裏插入圖片描述

這種情況一般是由抓包方式引起的。在有些操作系統中,tcpdump默認只抓每個幀的前96個字節,我們可以用“-s”參數來指定想要抓到的字節數,比如下面這條命令可以抓到1000字節。

[root@my_server /]# tcpdump -i eth0 -s 1000 -w /tmp/tcpdump.cap

2.[TCP Previous segment not captured]

在TCP傳輸過程中,同一臺主機發出的數據段應該是連續的,即後一個包的Seq號等於前一個包的Seq Len(三次握手和四次揮手是例外)。如果Wireshark發現後一個包的Seq號大於前一個包的Seq Len,就知道中間缺失了一段數據。假如缺失的那段數據在整個網絡包中都找不到(即排除了亂序),就會提示[TCP Previous segment not captured]。比如在圖2這個例子中,6號包的Seq號1449大於5號包的Seq Len=1 0=1,說明中間有個攜帶1448字節的包沒被抓到,它就是“Seq=1, Len=1448”。

【大咖講網絡】Wireshark的提示

圖2
在這裏插入圖片描述

網絡包沒被抓到還分兩種情況:一種是真的丟了;另一種是實際上沒有丟,但被抓包工具漏掉了。在Wireshark中如何區分這兩種情況呢?只要看對方回覆的確認(Ack)就行了。如果該確認包含了沒抓到的那個包,那就是抓包工具漏掉而已,否則就是真的丟了。

順便分析一下圖2這個網絡包,它是HTTPS傳輸異常時在客戶端抓的。因爲“Len: 667”的小包(即6號包)可以送達,但“Len: 1448”的大包卻丟了,說明路徑上可能有個網絡設備的MTU比較小,會丟棄大包。後來的解決方式證實了這個猜測,只要把整個網絡路徑的MTU保持一致,問題就消失了。

3.[TCP ACKed unseen segment]

當Wireshark發現被Ack的那個包沒被抓到,就會提示 [TCP ACKed unseen segment]。這可能是最常見的Wireshark提示了,幸好它幾乎是永遠可以忽略的。以圖3爲例,32號包的Seq Len=6889 1448=8337,說明服務器發出的下一個包應該是Seq=8337。而我們看到的卻是35號包的Seq=11233,這意味着8337~11232這段數據沒有被抓到。這段數據本應該出現在34號之前,所以Wireshark提示了[TCP ACKed unseen segment]。

【大咖講網絡】Wireshark的提示

圖3

在這裏插入圖片描述

不難想象,在一個網絡包的開頭會經常看到這個提示,因爲只抓到了後面的Ack但沒抓到前面的數據包。

4.[TCP Out-of-Order]

在TCP傳輸過程中(不包括三次握手和四次揮手),同一臺主機發出的數據包應該是連續的,即後一個包的Seq號等於前一個包的Seq Len。也可以說,後一個包的Seq會大於或等於前一個包的Seq。當Wireshark發現後一個包的Seq號小於前一個包的Seq Len時,就會認爲是亂序了,因此提示 [TCP Out-of-Order] 。如圖4所示,3362號包的Seq=2685642小於3360號包的Seq=2712622,所以就是亂序。

【大咖講網絡】Wireshark的提示

圖4

在這裏插入圖片描述

小跨度的亂序影響不大,比如原本順序爲1、2、3、4、5號包被打亂成2、1、3、4、5就沒事。但跨度大的亂序卻可能觸發快速重傳,比如打亂成2、3、4、5、1時,就會觸發足夠多的Dup ACK,從而導致1號包的重傳。

5.[TCP Dup ACK]

當亂序或者丟包發生時,接收方會收到一些Seq號比期望值大的包。它每收到一個這種包就會Ack一次期望的Seq值,以此方式來提醒發送方,於是就產生了一些重複的Ack。Wireshark會在這種重複的Ack上標記[TCP Dup ACK] 。

以圖5爲例,服務器收到的7號包爲“Seq=29303, Len=1460”,所以它期望下一個包應該是Seq Len=29303 1460=30763,沒想到實際收到的卻是8號包Seq=32223,說明Seq=30763那個包可能丟失了。因此服務器立即在9號包發了Ack=30763,表示“我要的是Seq=30763”。由於接下來服務器收到的10號、12號、14號也都是大於Seq=30763的,因此它每收到一個就回復一次Ack=30763,從圖中可見Wireshark在這些回覆上都標記了[TCP Dup ACK]。

【大咖講網絡】Wireshark的提示

圖5
在這裏插入圖片描述

6.[TCP Fast Retransmission]

當發送方收到3個或以上[TCP Dup ACK],就意識到之前發的包可能丟了,於是快速重傳它(這是RFC的規定)。以圖6爲例,客戶端收到了4個Ack=991851,於是在1177號包重傳了Seq=991851。

【大咖講網絡】Wireshark的提示

圖6

在這裏插入圖片描述

7.[TCP Retransmission]

如果一個包真的丟了,又沒有後續包可以在接收方觸發[Dup Ack],就不會快速重傳。這種情況下發送方只好等到超時了再重傳,此類重傳包就會被Wireshark標上[TCP Retransmission]。以圖7爲例,客戶端發了原始包(包號1053)之後,一直等不到相應的Ack,於是只能在100多毫秒之後重傳了(包號1225)。

【大咖講網絡】Wireshark的提示

圖7

在這裏插入圖片描述

超時重傳是一個非常有技術含量的知識點,比如等待時間的長短就大有學問,本文就不細說了,畢竟需要懂這個的人很少。

8.[TCP zerowindow]

TCP包中的“win=”代表接收窗口的大小,即表示這個包的發送方當前還有多少緩存區可以接收數據。當Wireshark在一個包中發現“win=0”時,就會給它打上“TCP zerowindow”的標誌,表示緩存區已滿,不能再接受數據了。比如圖8就是服務器的緩存區已滿,所以通知客戶端不要再發數據了。我們甚至可以在3258~3263這幾個包中看出它的窗口逐漸減少的過程,即從win=15872減小到win=1472。

【大咖講網絡】Wireshark的提示

圖8

在這裏插入圖片描述

9.[TCP window Full]

當Wireshark在一個包中打上[TCP window Full]標誌時,就表示這個包的發送方已經把對方所聲明的接收窗口耗盡了。以圖9爲例,Britain一直聲明它的接收窗口只有65535,意味着Middle East最多能給它發送65535字節的數據而無需確認,即“在途字節數”最多爲65535字節。當Wireshark在包中計算出Middle East已經有65535字節未被確認時,就會發出此提示。至於Wireshark是怎麼計算的,請參考本書的《計算“在途字節數”》一文。

【大咖講網絡】Wireshark的提示

圖9

在這裏插入圖片描述

[TCP window Full]很容易跟[TCP zerowindow]混淆,實際上它們也有相似之處。前者表示這個包的發送方暫時沒辦法再發送數據了,後者表示這個包的發送方暫時沒辦法再接收數據了,也就是說兩者都意味着傳輸暫停,都必須引起重視。

10.[TCP segment of a reassembled PDU]

當你收到這個提示,肯定已經在EditàPreferencesààTCP菜單裏啓用了Allow sub dissector to reassemble TCP streams。它表示Wireshark可以把屬於同一個應用層PDU(比如SMB的Read Response和Write Request之類)的TCP包虛擬地集中起來。如圖10所示,這一個SMB Read Response由39~48號包共同完成,因此Wireshark在最後一個包中虛擬地把所有包集中起來。這樣做有個好處,就是可以右鍵點擊圖10底部的方框,選擇CopyàBytesàPrintable Text Only,從而複製整個應用層的PDU。做研發的同學可能比較需要這個功能。
【大咖講網絡】Wireshark的提示
圖10

在這裏插入圖片描述

11.[Continuation to #]

你看到這個提示,說明已經在EditàPreferencesàProtocolsàTCP菜單裏關閉了Allow sub dissector to reassemble TCP streams。比如圖10的那些包,一關閉就變成圖11這樣。
【大咖講網絡】Wireshark的提示

圖11

在這裏插入圖片描述

仔細對比圖10和圖11,你會發現Read Response在圖10中被算在了48號包頭上,而在圖11中被算到了39號包頭上。這樣會帶來一個詭異的結果:圖10的讀響應時間爲2.528毫秒(38號包和48號包的時間差),而圖11的讀響應時間爲2.476毫秒(38號包和39號包的時間差)。究竟哪個算正確呢?這個問題很難回答,如果在乎的是實際的總性能,那就看前者;如果想忽略TCP/IP協議的損耗,單看服務器的響應速度,那就看後者。在某些特殊情況下,這兩者相差非常大,所以必須搞清楚。

12.[Time-to-live exceeded (Fragment reassembly time exceeded)]

ICMP的報錯有好多種,大都不難理解,所以我們只舉其中的一種爲例。 [Fragment reassembly time exceeded]表示這個包的發送方之前收到了一些分片,但是由於某些原因遲遲無法組裝起來。比如在圖12中,由於上海發往北京的一些包被分片傳輸,且有一部分在路上丟失了,所以北京方無法組裝起來,便只好用這個ICMP報錯告知上海方。

【大咖講網絡】Wireshark的提示

圖12

在這裏插入圖片描述

作者信息:

林沛滿

林沛滿是一位有近十年存儲經驗的技術專家,擅長文件存儲的性能分析、歸檔和備份。同時也專注於網絡協議分析,比如CIFS/NFS/HTTP/TCP/UDP等,是《Wireshark網絡分析就這麼簡單》、《Wireshark網絡分析的藝術》等書的作者。

注:本《大咖講網絡》系列文章取自《Wireshark網絡分析的藝術》一書。

發佈了59 篇原創文章 · 獲贊 14 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章