虛擬網絡運維––基于wireshark報文分析快速過濾(tcp,icmp,http)報文時延
前言
在網絡運維中,在報文分析時,時延類問題是比較常見的問題場景,如何快速定位到高時延的報文就會比較有用;這里簡單介紹一下基于wireshark快速過濾tcp、http、icmp協議報文的高時延報文;
文章原創輸出,請認準作者[[海淵_haiyuan]],感謝;
tcp協議高時延報文定位
在過濾tcp協議報文的高時延報文時,就不得不提到兩個字段:
Time since first frame in this TCP stream # 自此TCP流中第一幀以來的時間,tcp.time_relative
Time since previous frame in this TCP stream # 距此TCP流中的上一幀的時間,tcp.time_delta
如下圖所示:
可能部分wireshark 展開tcp協議后無法看到這兩個字段;是需要在首選項配置時,進行一下配置,需要勾選“Calculate conversation timestamps”;如果是windows平臺下,支持中文的話,就是首選項;
勾選該字段后,即可在tcp協議層看到該字段;
如前面所講,這兩個字段分配代表一條tcp流中,該幀報文和上一幀報文的時間間隔;該幀報文和所在tcp流的第一幀報文的時間間隔;也就是說這兩個字段是代表是一個相對的時間差;
取值來自wireshark中Time那一列,由該列中的時間戳的值相減得到,有關該列的詳細說明可見我的其他文檔有說明;這里需要提醒的一點是time這列的值,這個時間戳是取值與OS 系統的當前時間,所以在多個節點抓包分析時延時,由于每個機器的OS時間會存在偏差,或大或小,分析時需要將這個因素考量進去,不然會對時延的分析產生極大的干擾,這一點本人曾經吃過虧;
當時是一個高時延的場景,兩臺物理機之間的復現問題時延是在十幾秒;而兩臺機器的OS時間又相差10s左右;導致抓包分析時,從報文計算的時延只有幾秒,而客戶端的請求統計卻有十幾秒;導致沒有通過報文精準計算出高時延的鏈路段,走了很多彎路;
應用為列,快速過濾較大時延:
選中字段“Time since previous frame in this TCP stream”,右鍵選擇“Apply as Column”應用為列;
然后點擊wireshark 列名,wireshark工具就會自動進行從小到大的排序,再點擊一下就是從大到小的排序:
這樣就可以快速看到高時延的報文,然后右鍵追蹤流即可詳細查看該數據流的情況;
過濾器表達式篩選高時延報文:
可以在wireshark官網查看相關字段對應的wireshark過濾器名稱,
https://www.wireshark.org/docs/dfref/t/tcp.html
或者直接選擇對應字段右鍵選擇“Apply as Filter” 或 “Prepare as Filter” 以及后面的各種條件;
實際運維中,常用的場景時,過濾ip為192.168.1.121,tcp協議,時延大于1s 的報文,過濾表達式即為:
ip.addr == 192.168.1.121 and tcp and tcp.time_delta >= 1
http協議高時延報文定位
http協議是基于tcp協議的7層應用層協議,所以前面所有的tcp報文時延分析同樣適用;
不過對于http請求來說,實際場景中也是需要只分析http層的時延,即http request 報文 和 http response 報文的時延計算;
這是由于,很多http的 request 和 response 報文中,會有tcp ack 確認報文、tcp psh數據傳輸報文;
以下圖為例:
如果只需要計算http request 和 http response 的時延,即 frame 532 time - frame 526 才是這次http response的時延;
實際 http 協議中也存在記錄時延的字段,字段為:
Time since request # 該字段只在http response報文中有;記錄這次response的時延;
同理可以將該字段應用為列或直接在過濾器中使用:
例如:
ip.addr == 192.168.1.121 and http.response.code == 200 and http.time > 0.5
icmp協議高時延報文
icmp 作為在運維中使用最高頻的協議之一,在測試網絡連通性等場景下,使用及其豐富;關于快速定位icmp協議高時延報文和前面的tcp、http協議同樣很重要;
在icmp reply 報文中,一樣存在字段記錄icmp協議 response time;
Response time # icmp 協議響應報文,注意取值對應單位,注意單位
同前面描述的類似,應用為列,或 過濾器中過濾使用:
icmp.resptime > 3