1. 程式人生 > >從wireshark中學網路分析(二)

從wireshark中學網路分析(二)

在上一篇文章中提到了TCP的延遲確認,延遲確認並不一定能提高效能,在某些場景下,開啟延遲確認甚至會嚴重降低網路傳輸效能。

(一)下面列出幾個開啟延遲確認降低網路效能的場景:

場景一

想象這樣一個場景,服務端開啟了延遲確認,客戶端在同一時刻傳送了9個TCP包,其中3、4、5號因為擁塞丟失了。

那麼傳輸過程中發生了以下事件:

  1. 到達伺服器的6、7、8、9號包觸發了4個“Ack 3”,於是客戶端快速重傳3號包,此時它並不知道4號包也丟失了。
  2. 由於伺服器上開啟了延遲確認,所以它收到3號包之後,等待了200ms才回復Ack 4。
  3. 客戶端重傳4號包,然後伺服器又等待了200ms才回復Ack 5。
  4. 客戶端重傳5號包,然後伺服器又等待了200ms才回復Ack 10。
  5. 客戶端傳輸新的10號包,自此網路擁塞就完全恢復了。

這樣不斷的等待回覆,造成了傳輸效率的大幅降低。還有另一種可能是在某個200ms的延遲過程中,那些丟包的RTO已經被觸發,所以進入了超時重傳階段,由於RTO階段網路已經擁塞,發出的包幾乎都沒有達到目的地,所以這段時間相當於並沒有傳輸任何資料。無論符合哪一種可能,效能都會嚴重下降。

解決方案:

  1. 關閉延遲確認,這樣浪費在延遲確認上的600ms就省下來了。只要RTT不是太長,那麼丟包也不會觸發超時重傳。

  2. 啟用TCP SACK(Selective Acknowledgment)功能,在Ack的時候可以告知對方自己已經收到拿些包了,這樣在大量丟包的時候不需要每個重傳包都確認一次,也就不怕延遲確認的影響了。

如上圖,SACK在wireshark中很容易看到,只要把SACK: 694121-702161 651241-672681Ack=623101 綜合起來,我們就知道623101-651240,672682-694120已經丟失。因此它只需要重傳這段資料。由此可見啟用SACK其實比關閉延遲確認更高效,因為它可以一次性重傳多個丟包,而不用每重傳一個就等待一次Ack,白費多個RTT。

場景二

從本質上看,延遲確認之所以會在大量重傳時影響效能,是因為它在該場景下會多次出現,那麼還有什麼場景會導致延遲確認多次出現呢?當TCP視窗極小的情況下,此時啟用延遲確認簡直就是雪上加霜。因為假如伺服器的接收視窗只有2920位元組(兩個MSS),客戶端每傳送兩個包就會耗光視窗,所以不得不停下來等待伺服器的確認。假如這時候伺服器上啟用了延遲確認,傳輸效率會大受影響。

場景三

Nagle和延遲確認本身都沒問題,但是一起用就會影響效能。Nagle演算法用程式設計師喜聞樂見的方式表達就是這樣的:

if有新資料要傳送
    if資料量超過MSS(即一個TCP包所能攜帶的最大資料量)
        立即傳送
    else
        if之前發出去的資料尚未確認
            把新資料快取起來,湊夠MSS或確認到達後再發送
        else
            立即傳送
        endif
    endif
endif

在ssh客戶端等小包環境下,啟用Nagle的客戶端攜帶資料量很小的情況下(小於MSS),只能等待上一個包被確認才能接著發。但此時服務端若啟用了延遲確認的話,一等就是200ms,嚴重影響傳輸效率。

(二)估算網路擁塞點

先說一個概念,在途位元組數。注意,只有在資料傳送方抓到的包才能用來分析在途位元組數。某一時刻的計算在途位元組數的公式為在途位元組數=Seq+Len-Ack,其中Seq和Len是來自上一個資料傳送方的包,而Ack則是來自上一個資料接收方的包。

先從Wireshark中找到一連串重傳包中的第一個,再根據該重傳包的Seq值找到其原始包,最後計算該原始包傳送時刻的在途位元組數。由於網路擁塞就是在該原始包發出去的時刻發生的,所以這個在途位元組數就大致代表了擁塞點的大小。多次取樣後建議選一個較小的值,參考這個值來設定視窗,從而儘量避免擁塞。

(三)奇怪的接受視窗

如下圖,接收視窗為什麼只有這麼小?!

這裡寫圖片描述

很多人的直覺是這個伺服器存在問題,因為接收視窗太小了,肯定會影響網路效能。但是你忽略了一個重要的提示就是“window size scaling factor: -1(unknown)”,上一篇文章中的問題三,我們提及了“Window Scale”這個引數的意義,真實的接收視窗的值需要乘上2的指數(引數作為指數)。

由於這個值是在三次握手期間宣告的,所以如果你在三次握手之後才開始抓包的話,wireshark無從知曉Window Scale的值,也就無法計算出係數,只好顯示出沒有係數時的大小,“window size scaling factor:-1(unknown)”正好提示了這種情況。所以,wireshark此時顯示出的值並不是真實的接收視窗的值。

(四)網路加速器:

一般網路加速器的採用的技術手段:

  1. 啟用TCP window scale。這樣可以使最大接收視窗突破65535的限制,只要記憶體跟得上,接收視窗幾乎不受限制。

  2. 監測延遲來避免擁塞。網路包是以佇列的方式通過網路裝置的,當擁塞即將發生時,佇列變長,延遲就會顯著提高。根據這一特點,我們可以讓加速器在延遲明顯增加時,自動放慢傳送速度,從而避免擁塞的發生。這其實是TCP Vegas的理念。

  3. 利用傳送視窗實現優先順序控制,使用者體驗就會更好。

  4. 啟用SACK。SACK必須在傳送方和接收方都啟用,這就是我們在兩邊各架設一臺加速器的優勢。單邊加速器的效果很可能因為另一端沒有啟用SACK而大打折扣。

(五)wireshark常見提示

參考資料

《wireshark網路分析的藝術》
《計算機網路》謝希仁
RFC文件

相關推薦

wireshark中學網路分析()

在上一篇文章中提到了TCP的延遲確認,延遲確認並不一定能提高效能,在某些場景下,開啟延遲確認甚至會嚴重降低網路傳輸效能。 (一)下面列出幾個開啟延遲確認降低網路效能的場景: 場景一: 想象這樣一個場景,服務端開啟了延遲確認,客戶端在同一時刻傳送了9個T

wireshark中學網路分析(一)

網路是很抽象的,但是在wireshark裡面卻又是相對直觀的。這裡我們列舉了5個問題來進一步直觀地學習TCP協議,並且從中瞭解分析網路效能的一般方法。 問題一:關於子網掩碼和閘道器 伺服器A和B的網路配置如下: A: IP address:

wireshark抓包分析rtmp協議,並提取出H264視頻流

tmp mage idt 進制 tro shark src 技術 wid 利用wireshark抓取rtmp流數據, 分析到rtmp流後,寫入過濾條件,如 tcp.stream eq 6導出tcp流保存16進制的數據為純文本格式一定要選擇 Hex轉儲,然後點擊 “Sava

examples中學spark():ModelSelectionViaCrossValidationExample.scala以及模型儲存

學習前理論 學習中領悟 學習後實踐 總結 參考 學習前(理論) 最小二乘法、嶺迴歸、Lasso等 學習中(領悟) 1.首先是一段包匯入,跳過 import org.apache.log4j.{Level, Logger} im

wireshark網路分析

首先感謝偉大程式設計師Ark Zhang提供這些乾貨資料,我只是稍為整理一下而已網路程式除錯中最常用的工具就是wireshark,下面為如何通過抓包分析網路情況:1.客戶端連結伺服器三次握手成功連結後,6秒後傳送5個位元組 HELLO資料後主動傳送FIN包斷開連結,正常的一次

計算機網路實驗()之Wireshark抓包分析獲取URL列表(去重、排序、統計)

實驗要求 本試驗要求基於第一次實驗中訪問某官網主頁時所抓取到的資料包,用Python 3語言、Jupyter Notebook和Pyshark編寫程式碼進行協議分析所需的開發環境,編寫程式碼,以輸出的方式列出首頁以及其所包含的所有資源(至少包含如下型別

WireShark資料包分析實戰》、讓網路不再卡

TCP的錯誤恢復我是我們定位、診斷、並最終修復網路高延遲的最好工具。1.TCP重傳      重傳資料包是TCP最基本的錯誤恢復特性之一,它被設計用來對付資料包丟失。     資料包丟失可能有很多原因,包括出故障的應用程式、流量負載沉重的路由器,或者臨時性的服務中斷。資料包層

銳捷CCNA系列() Wireshark抓包分析Ping過程

銳捷 CCNA 銳捷實戰 銳捷CCNA 數通 實訓目的 初步了解Wireshark的使用。 能分析Ping過程。 實訓背景 PING(Packet Internet Groper, 因特網包探索器),用於測試網絡是否連通的程序,在Windows、Linux、Unix下都是標配程序,Pi

使用tcpdump+wireshark抓包分析網路資料包

最近和學弟在除錯一個GPRS通訊模組,需求是通過GPRS模組通過http協議傳送資料到伺服器,但是http協議一直失敗,伺服器返回400,通過查詢http狀態碼得知,http400錯誤是請求無效,因為GPRS模組沒有實現http協議的封裝,需要在TCP協議的基礎上,手動拼裝http格式的報文.所以初步猜測是h

以太坊原始碼分析之 P2P網路、節點發現流程)

區塊鏈特輯 :https://blog.csdn.net/fusan2004/article/details/80879343,歡迎查閱,原創作品,轉載請標明!上一篇文章簡單介紹了下一些基礎的型別定義,從這一篇開始我們將描述p2p網路的更多細節。從關於節點的定義來看,其實不同

TensorFlow 入門到精通():MNIST 例程原始碼分析

按照上節步驟, TensorFlow 預設安裝在 /usr/lib/python/site-packages/tensorflow/ (也有可能是 /usr/local/lib……)下,檢視目錄結構: # tree -d -L 3 /usr/lib/pyt

比特幣原始碼分析-網路

比特幣原始碼分析-網路(二) https://www.jianshu.com/p/4b42d8698f35   眾所周知,比特幣網路是採用的P2P網路體系,所以,沒有明顯的客戶端與服務端的區別或者是概念,每一個節點既是自身的客戶端,又是其它節點的服務端。 在sync.h中,

ECMAScript規範深度分析JavaScript():變數物件(下)

本文譯自Dmitry Soshnikov的《ECMA-262-3 in detail》系列教程。其中會加入一些個人見解以及配圖舉例等等,來幫助讀者更好的理解JavaScript。 宣告:本文不涉及與ES6相關的知識。 前言 在本系列教程上一篇文章《從ECMAScript規範深度分

ECMAScript規範深度分析JavaScript():變數物件(上)

本文譯自Dmitry Soshnikov的《ECMA-262-3 in detail》系列教程。其中會加入一些個人見解以及配圖舉例等等,來幫助讀者更好的理解JavaScript。 宣告:本文不涉及與ES6相關的知識。 前言 在學習變數物件之前,我們要對執行期上下文有所瞭解,可以先

rtsp詳解wireshark抓包分析

一、概述     RTSP(Real-Time Stream Protocol )是一種基於文字的應用層協議,在語法及一些訊息引數等方面,RTSP協議與HTTP協議類似。     RTSP被用於建立的控制媒體流的傳輸,它為多媒體服務扮演“網路遠端控制”的角

網路協議棧深入分析()--sk_buff的操作函式

1、alloc_skb()函式 該函式的作用是在上層協議要傳送資料包的時候或網路裝置準備接收資料包的時候會呼叫alloc_skb()函式分配sk_buff結構體,需要釋放時呼叫kfree_skb()函式。 staticinlinestruc

Wireshark網路分析例項集錦(大學霸內部資料)

Wireshark網路分析例項集錦 試讀文件下載 前  言 由於網路廣泛廣泛,與網路相關的安全問題也就變的非常重要。為了更好的分析整個網路的情況,人們開始使用各種專業的資料包分析工具。Wireshark是一款最知名的開源網路封包分析軟體。它可以抓取

Wireshark網路分析的藝術》《Wireshark網路分析就這麼簡單》書評

這兩本書是應該算是同一個作者寫的兩個版本吧。兩本書獨立看,都是沒有問題的。書籍內容這兩本書基本就是講述作者如何使用wireshark解決在工作,生活中遇到的網路問題。每一個小節都是一個獨立的網路問題,涉及面非常廣,幾個tcp協議效能調優案例,幾個ssh登陸延遲原因分析,幾個防

Wireshark網路分析就這麼簡單 -- 目錄

這不僅僅是一本講解 Wireshark 的書,更重要的,理解:從巨集觀層面看微觀,用工具的手段看協議。 Wireshark 是強大的協議分析工具,有 Window、Mac、Linux 等多種版本,依靠它,可以洞悉各種協議的巨集觀和微觀,可以更快的學習協議。相比較 Char

wireshark+共享網路抓包分析手機APP

Wireshark使用說明Wireshark 是網路包分析工具。網路包分析工具的主要作用是嘗試捕獲網路包, 並嘗試顯示包的儘可能詳細的情況。你可以把網路包分析工具當成是一種用來測量有什麼東西從網線上進出的測量工具,就好像使電工用來測量進入電信的電量的電度表一樣。(當然比那個更