1. 程式人生 > >wireshark抓包常見提示含義解析

wireshark抓包常見提示含義解析

原文轉自:http://blog.sina.com.cn/s/blog_987e00020102wq60.html

             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網路分析的藝術》一書。