基本使用:html
http://www.javashuo.com/article/p-ajezgawo-cn.html瀏覽器
協議解析:緩存
https://www.jianshu.com/p/a384b8e32b67服務器
(1)版本 ,佔4位,指IP協議的版本,目前普遍使用的IP協議版本號爲4(即IPv4)。網絡
2)首部長度 ,佔4位,可表示的最大十進制數值是15。請注意,這個字段所表示數的單位是32位字長(1個32位字長是4字節),所以,當IP的首部長度爲1111時(即十進制的15),首部長度就達到60字節。當IP分組的首部長度不是4字節的整數倍時,必須利用最後的填充字段加以填充。所以數據部分永遠在4字節的整數倍開始,這樣在實現IP協議時較爲方便。首部長度限制爲60字節的缺點是有時可能不夠用。但這樣作是但願用戶儘可能減小開銷。最經常使用的首部長度就是20字節(即首部長度爲0101),這時不使用任何選項。tcp
(3)服務類型 ,佔8位,用來得到更好的服務,但實際上一直沒有被使用過。1998年IETF把這個字段更名爲區分服務DS(Differentiated Services)。只有在使用區分服務時,這個字段才起做用。ide
(4)總長度 ,總長度指首部和數據之和的長度,單位爲字節。總長度字段爲16位,所以數據報的最大長度爲2^16-1=65535字節。在IP層下面的每一種數據鏈路層都有本身的幀格式,其中包括幀格式中的數據字段的最大長度,這稱爲最大傳送單元MTU(Maximum Transfer Unit)。當一個數據報封裝成鏈路層的幀時,此數據報的總長度(即首部加上數據部分)必定不能超過下面的數據鏈路層的MTU值。函數
PS:圖中總長度爲84個字節,ping包默認爲56個字節,ICMP包頭是8個字節,再加上首部長度20個字節。下圖我將包長度設置爲112個字節後,總長度就變成140個字節了工具
(5)標識(identification),佔16位。IP軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給標識字段。但這個「標識」並非序號,由於IP是無鏈接服務,數據報不存在按序接收的問題。當數據報因爲長度超過網絡的MTU而必須分片時,這個標識字段的值就被複制到全部的數據報的標識字段中。相同的標識字段的值使分片後的各數據報片最後能正確地重裝成爲原來的數據報。性能
PS:我的理解就是一個數據報對應一個標識,當數據報長度超過最大MTU時會被分片,但被分片的標識字段是同樣的。下面ping一個3100字節的包驗證一下,百度大包經禁ping了,改pingMOP:
從上圖能夠看出3100字節的大包被分爲3片字段都是同樣的(12312)。
(6)標誌(flag),佔3位,但目前只有2位有意義。標誌字段中的最低位記爲MF(More Fragment)。MF=1即表示後面「還有分片」的數據報。MF=0表示這已經是若干數據報片中的最後一個。標誌字段中間的一位記爲DF(Don’t Fragment),意思是「不能分片」。只有當DF=0時才容許分片。
(7)片偏移,佔13位。片偏移指出:較長的分組在分片後,某片在原分組中的相對位置。也就是說,相對用戶數據字段的起點,該片從何處開始。片偏移以8個字節爲偏移單位。這就是說,除了最後一個分片,每一個分片的長度必定是8字節(64位)的整數倍
PS:片偏移就是相對數據報字段的起點,以標識中的ping包來看,第一個分片的片偏移是0,第二個是1480,第3個是2960,以下圖所示:
(8)生存時間,佔8位,生存時間字段經常使用的的英文縮寫是TTL(Time To Live),代表是數據報在網絡中的壽命。由發出數據報的源點設置這個字段。其目的是防止沒法交付的數據報無限制地在因特網中兜圈子,於是白白消耗網絡資源。最初的設計是以秒做爲TTL的單位。每通過一個路由器時,就把TTL減去數據報在路由器消耗掉的一段時間。若數據報在路由器消耗的時間小於1秒,就把TTL值減1。當TTL值爲0時,就丟棄這個數據報。後來把TTL字段的功能改成「跳數限制」(但名稱不變)。路由器在轉發數據報以前就把TTL值減1.若TTL值減小到零,就丟棄這個數據報,再也不轉發。所以,如今TTL的單位再也不是秒,而是跳數。TTL的意義是指明數據報在網絡中至多可通過多少個路由器。顯然,數據報在網絡上通過的路由器的最大數值是255.若把TTL的初始值設爲1,就表示這個數據報只能在本局域網中傳送。
(9)協議佔8位,協議字段指出此數據報攜帶的數據是使用何種協議,以便使目的主機的IP層知道應將數據部分上交給哪一個處理過程。
(10)首部檢驗和,佔16位。這個字段只檢驗數據報的首部,但不包括數據部分。這是由於數據報每通過一個路由器,路由器都要從新計算一下首部檢驗和(一些字段,如生存時間、標誌、片偏移等均可能發生變化)。不檢驗數據部分可減小計算的工做量。
(11)源地址,佔32位。
(12)目的地址,佔32位。
(13)數據部分,可變,最大爲總長度-首部長度。
基本IO Graphs:
IO graphs是一個很是好用的工具。基本的Wireshark IO
graph會顯示抓包文件中的總體流量狀況,一般是以每秒爲單位(報文數或字節數)。默認X軸時間間隔是1秒,Y軸是每一時間間隔的報文數。若是想要查看每秒bit數或byte數,點擊「Unit」,在「Y
Axis」下拉列表中選擇想要查看的內容。這是一種基本的應用,對於查看流量中的波峯/波谷頗有幫助。要進一步查看,點擊圖形中的任意點就會看到報文的細節。
過濾:
每個圖形均可以應用一個過濾條件。這裏建立兩個不一樣的graph,一個HTTP一個ICMP。能夠看到過濾條件中Graph 1使用「http」Graph 2使用「icmp」。圖中能夠看到紅色ICMP流量中有些間隙,進一步分析。
經常使用排錯過濾條件:
對於排查網絡延時/應用問題有一些過濾條件是很是有用的:
tcp.analysis.lost_segment:代表已經在抓包中看到不連續的序列號。報文丟失會形成重複的ACK,這會致使重傳。
tcp.analysis.duplicate_ack:顯示被確認過不止一次的報文。大涼的重複ACK是TCP端點之間高延時的跡象。
tcp.analysis.retransmission:顯示抓包中的全部重傳。若是重傳次數很少的話仍是正常的,過多重傳可能有問題。這一般意味着應用性能緩慢和/或用戶報文丟失。
tcp.analysis.window_update:將傳輸過程當中的TCP window大小圖形化。若是看到窗口大小降低爲零,這意味着發送方已經退出了,並等待接收方確認全部已傳送數據。這可能代表接收端已經不堪重負了。
tcp.analysis.bytes_in_flight:某一時間點網絡上未確認字節數。未確認字節數不能超過你的TCP窗口大小(定義於最初3此TCP握手),爲了最大化吞吐量你想要得到儘量接近TCP窗口大小。若是看到連續低於TCP窗口大小,可能意味着報文丟失或路徑上其餘影響吞吐量的問題。
tcp.analysis.ack_rtt:衡量抓取的TCP報文與相應的ACK。若是這一時間間隔比較長那可能表示某種類型的網絡延時(報文丟失,擁塞,等等)。
函數:
IO Graphs有六個可用函數:SUM, MIN, AVG, MAX, COUNT, LOAD。
MIN( ), AVG( ), MAX( )
首先看一下幀之間的最小,平均和最大時間,這對於查看幀/報文之間的延時很是有用。咱們能夠將這些函數結合「frame.time_delta」過濾條件看清楚幀延時,並使得往返延時更爲明顯。若是抓包文件中包含不一樣主機之間的多個會話,而只想知道其中一個pair,可將「frame.time_delta」結合源和目標主機條件如「ip.addr==x.x.x.x &&ip.addr==y.y.y.y」。以下圖所示:
咱們作了如下步驟:
將Y軸設置爲「Advanced」,讓Caculation域可見。不作這一步就看不到計算選項。
X軸時間間隔1秒,因此每一個柱狀圖表明1秒間隔的計算結果。
過濾出兩個特定IP地址的HTTP會話,使用條件:「(ip.addr==192.168.1.4&& ip.addr==128.173.87.169) && http」。
使用3個不一樣的graph,分別計算Min(), Avg(), Max()。
對每個計算結果應用條件「frame.time_delta」,將style設置成「FBar」,顯示效果最佳。
Count( ):此函數計算時間間隔內事件發生的次數,在查看TCP分析標識符時頗有用,例如重傳。
Sum( ):該函數統計事件的累加值。有兩種常見的用例是看在捕獲TCP數據量,以及檢查TCP序列號。
協議過濾器:
arp:顯示全部包括ARP請求和回覆在內的全部ARP數據流。
ip:顯示內含IPv4頭在內的(如ICMP目的地址不可達報文,在ICMP報文頭以後返回到來方向的IPv4頭)IP數據流。
ipv6:顯示全部IPv6數據流,包括內含IPv6報文頭的IPv4報文,如6to4,Teredo,以及ISATAP數據流。
tcp:顯示全部基於TCP的數據流。
應用過濾器:
bootp:顯示全部DHCP數據流(基於BOOTP)。
dns:顯示包括TCP區域傳輸以及基於標準UDP的DNS請求和回覆在內的全部DNS數據流。
tftp:顯示全部TFTP(Trivial File Transfer Protocol)數據流。
http:顯示全部HTTP命令,回覆以及數據傳輸報文,但不顯示TCP握手報文,TCP ACK報文以及TCP結束報文。
icmp:顯示全部ICMP報文。
域過濾器:
boot.option.hostname:顯示全部包含主機名的DHCP數據流(DHCP基於BOOTP)。
http:host:顯示全部包含HTTP主機名字段的全部HTTP報文。此報文是客戶端向網絡服務器發送請求時發出的。
ftp.request.command:顯示全部包含命令的FTP數據流,好比USER,PASS,或RETR命令。
字符過濾器:
tcp.analysis.flags:顯示全部包含TCP分析標識的全部報文,包括報文丟失,重傳,或零窗口標識。
tcp.analysis,zero_window:顯示含有代表發送方的接收緩存用完標識的報文。
顯示過濾器比較運算符:
經過擴展過濾條件可查找某一域值,Wireshark針對此功能支持數字比較運算符。
1. ==或eq
例如:ip.src == 10.2.2.2
顯示全部源地址爲10.2.2.2的IPv4數據流
2. !=或ne
例如:tcp.srcport != 80
顯示源端口除了80之外的全部TCP數據流
3. >或gt
例如:frame.time_relative > 1
顯示距前一個報文到達時間相差1秒的報文
4. <或lt
例如:tcp.window_size < 1460
顯示當TCP接收窗口小於1460字節時的報文
5. >=或ge
例如:dns.count.answers >= 10
顯示包含10個以上answer的DNS響應報文
6. <=或le
例如:ip.ttl <= 10
顯示IP報文中Time to Live字段小於等於10的報文
7. contains
例如:http contains 「GET」
顯示全部HTTP客戶端發送給HTTP服務器的GET請求
對於基於TCP應用的過濾條件採用比較運算符。例如,若是想看端口80上面的HTTP數據流,使用HTTP.port==80。
小貼士:
運算符兩邊不用留空格。ip.src == 10.2.2.2與ip.src==10.2.2.2的效果是相同的。
過濾HTTP數據流:
在排查網頁瀏覽器會話或檢查網速過慢問題時,對瀏覽器會話進行過濾就顯得尤其重要。過濾HTTP數據流有兩種方式:
http
tcp.port==xx(xx表示所使用的HTTP端口)
第二種過濾方法更加有效。