1. 程式人生 > >學習Wireshark(四):網路效能排查之TCP重傳與重複ACK

學習Wireshark(四):網路效能排查之TCP重傳與重複ACK

作為網路管理員,很多時間必然會耗費在修復慢速伺服器和其他終端。但使用者感到網路執行緩慢並不意味著就是網路問題。

解決網路效能問題,首先從TCP錯誤恢復功能(TCP重傳與重複ACK)和流控功能說起。之後闡述如何發現網路慢速之源。最後,對網路各組成部分上的資料流進行概況分析。這幾張內容將會幫助讀者識別,診斷,以及排查慢速網路。

更多資訊
接下來的內容,較多是黑白圖片了。雖然看起來有點不爽,但還是很值得一看。

TCP錯誤恢復功能:

TCP的錯誤恢復功能是定位,診斷及修復網路延時的最佳工具。延時可以在單程也可以往返方向測量。高延時是網路管理員的頭號大敵。本節我們討論TCP高延時是如何導致序列號和確認號亂序的。

TCP重傳:

主機報文重傳是TCP最基本的錯誤恢復功能,它的目的是防止報文丟失。

報文丟失的可能因素有很多種,包括應用故障,路由裝置過載,或暫時的服務宕機。報文級別速度是很高的,而通常報文丟失是暫時的,因此TCP能夠發現和恢復報文丟失顯得尤為重要。

決定報文是否有必要重傳的主要機制是重傳計時器(retransmission timer),它的主要功能是維護重傳超時(RTO)值。當報文使用TCP傳輸時,重傳計時器啟動,收到ACK時計時器停止。報文傳送至接收到ACK的時間稱為往返時間(RTT)。對若干次時間取平均值,該值用於確定最終RTO值。在最終RTO值確定之前,確定每一次報文傳輸是否有丟包發生使用重傳計時器,下圖說明了TCP重傳過程。

當報文傳送之後,但接收方尚未傳送TCP ACK報文,傳送方假設源報文丟失並將其重傳。重傳之後,RTO值加倍;如果在2倍RTO值到達之前還是沒有收到ACK報文,就再次重傳。如果仍然沒有收到ACK,那麼RTO值再次加倍。如此持續下去,每次重傳RTO都翻倍,直到收到ACK報文或傳送方達到配置的最大重傳次數。

最大重傳次數取決於傳送作業系統的配置值。預設情況下,Windows主機預設重傳5次。大多數Linux系統預設最大15次。兩種作業系統都可配置。
示例如下圖:

TCP重傳過程傳送的第一個報文如下圖所示(圖片不很清楚,已經盡力了):

這是一個TCP PSH/ACK報文①,包含648位元組資料②,從10.3.30.1傳送至10.3.71.7。這是一個典型的資料報文。

在通常情況下,第一個報文傳送之後很快會收到TCP ACK報文。然而,在這個case裡,第二個是重傳報文。可以在Packet list面板裡看到。Info欄清楚的標明“TCP Retransmission”,報文以黑色背景紅色字型標出。下圖是Packet List面板中的重傳示例(仍然不清楚,但可參見上圖):

也可以在Packet Details和Packet Bytes面板中檢視來確定是否是重傳報文,如下圖所示:

注意此報文與源報文相同(除了IP標識和checksum欄位)。要驗證這一點,比較兩個報文的Packet Bytes①。

在Packet Details面板,注意到重傳報文在SEQ/ACK Analysis下面有些額外的資訊②。這些資訊是由Wireshark提供的而並非報文字身。SEQ/ACK Analysis告訴我們這確實是一個重傳報文,RTO值是0.206秒,此時的RTO是基於報文1的時間增量。

檢查剩下的報文會得到類似的結果,不同之處只有IP標識和checksum,以及RTO值。要使報文之間的時間間隔形象化,在Packet List面板中檢視Time欄,如下圖所示。這裡可以看到RTO值的翻倍增長關係。

TCP重複ACK以及快速重傳:

重複ACK是指在接收方收到亂序報文時,所發出的一類TCP報文。TCP使用報文頭的序列號和確認號以有效保證資料按照發送的順序接收和重組。

當TCP連線建立以後,握手過程中交換的一個最重要的資訊是初始序列號(ISN)。一旦連線雙方設定了ISN之後,接下來發送的報文所包含的序列號增加一個數據載荷值。

假設有個主機ISN是5000,傳送500位元組報文至接收方。一旦報文接收之後,接收端回覆一個ACK號為5500的TCP ACK報文,基於以下公式:

Sequence Number In + Bytes of Data Received = Acknowledgment Number Out

按照上述計算結果,返回傳送端的確認編號實際上是接收端希望收到的序列號。示例如下圖:

資料接收方通過序列號來檢查報文丟失。接收方通過追蹤接收到的序列號,能夠確認序列號是否亂序。當接收方收到一個不正常的序列號,它會假設傳輸過程中有報文丟失。為了正確重傳資料,接收方必須擁有丟失報文,所以它傳送包含有丟失報文正確序列號的ACK報文,以便傳送方重傳此報文。

當重傳主機從傳送端接收到3個重複ACK時,它會假設此報文確實在傳送中丟失,並且立即傳送一個快速重傳。一旦觸發了快速重傳,所有正在傳輸的其他報文都被放入佇列中,直到快速重傳報文傳送為止。過程如下圖所示:

承接上文的彩圖:

本例中第一個報文如下圖:

這是一個TCP ACK報文,從資料接收端(172.31.136.85)發給傳送端(195.81.202.68)①,確認前一個報文所傳送的資料。
此報文中的確認編號是1310973186②,應當是下一個接收報文的序列號,如下圖所示:


不幸的是接收端的序列號是1310984130①,並不是所期望的值。這意味著報文在傳送中丟失。接收端注意到報文亂序,並且在第三個報文中傳送重複ACK,如下圖所示:

可以通過以下兩種方式之一來確認這是一個重複ACK:

在Packet Detaisl面板中的Info欄。報文呈現黑色背景紅色字型。

SEQ/ACK Analysis下的Packet Deatails面板。擴充套件這一欄會發現報文顯示為duplicate ACK。接下來幾個報文重複此過程。如下圖所示:

此檔案中的第四個報文是傳送端所發出具有錯誤序列號①的另一個數據塊。因此,接收端傳送第二個重複ACK②。接收端又收到一個亂序報文③。從而觸發了第三以及最後一個重複ACK④.

一旦傳送方接收到接收方所發來的第三個重複ACK,它就會暫停所有傳輸報文並且重傳丟失報文,下圖顯示了快速重傳過程:

重傳報文同樣可以通過Packet List面板的Info欄觀察到。報文呈現黑色背景紅色字型。這個報文的SEQ/ACK Analysis截面告訴我們這可能是一個快速重傳幀。(標識報文為快速重傳的資訊不是報文字身所包含的內容,而是Wireshark的功能)。最後一個報文是接收到快速重傳的ACK。

相關推薦

一站式學習Wireshark網路效能排查TCP重複ACK

作為網路管理員,很多時間必然會耗費在修復慢速伺服器和其他終端。但使用者感到網路執行緩慢並不意味著就是網路問題。 解決網路效能問題,首先從TCP錯誤恢復功能(TCP重傳與重複ACK)和流控功能說起。之後闡述如何發現網路慢速之源。最後,對網路各組成部分上的資料流進行概況

學習Wireshark網路效能排查TCP重複ACK

作為網路管理員,很多時間必然會耗費在修復慢速伺服器和其他終端。但使用者感到網路執行緩慢並不意味著就是網路問題。 解決網路效能問題,首先從TCP錯誤恢復功能(TCP重傳與重複ACK)和流控功能說起。之後闡述如何發現網路慢速之源。最後,對網路各組成部分上的資料流進行概況分析。這

Wireshark系列網路效能排查TCP重複ACK

一站式學習Wireshark(四):網路效能排查之TCP重傳與重複ACK 介紹   作為網路管理員,很多時間必然會耗費在修復慢速伺服器和其他終端。但使用者感到網路執行緩慢並不意味著就是網路問題。 解決網路效能問題,首先從TCP錯誤恢復功能(TCP重傳與重複ACK)和流控

一站式學習Wireshark狙擊網路高延時點

在某些情況下,丟包可能並不是造成延時的原因。你可能會發現儘管兩臺主機之間通訊速度很慢,但這種慢速並沒有伴隨著TCP重傳或是重複ACK的徵兆。在這種情況下,需要使用另一種方式來定位高延時點。 查詢高延時點最有效的方法之一是檢查最初的握手訊號以及跟隨其後的幾個報文。例如

一站式學習Wireshark應用Wireshark觀察基本網路協議

TCP: TCP/IP通過三次握手建立一個連線。這一過程中的三種報文是:SYN,SYN/ACK,ACK。 第一步是找到PC傳送到網路伺服器的第一個SYN報文,這標識了TCP三次握手的開始。 如果你找不到第一個SYN報文,選擇Edit -> Find Packe

機器學習實驗用tensorflow實現卷積神經網路識別人類活動

在近幾年,越來越多的使用者在智慧手機上安裝加速度感測器等一些裝置,這就為做一些應用需要收集相關的資料提供了方便。人類活動識別(human activity recognition (HAR))是其中的一個應用。對於HAR,有很多的方法可以去嘗試,方法的performance很大程度上依賴於特徵工程。傳統的機

一站式學習WiresharkWireshark基本用法

11g 實現 alt href ascii 根據 無線網絡 完成 analyze 按照國際慣例,從最基本的說起。 抓取報文: 下載和安裝好Wireshark之後,啟動Wireshark並且在接口列表中選擇接口名,然後開始在此接口上抓包。例如,如果想要在無線網絡上抓取流量

Unity3DMecanim動畫系統學習筆記Animation State

大致 面板 輸入 jpg any 動畫播放 速度 nsf 顯示 動畫的設置 我們先看看Animation Clip的一些設置: Loop time:動畫是否循環播放。 下面出現了3個大致一樣的選項: Root Transform Rotation:表示為播放動畫

JavaScript學習日誌BOM

特殊符號 對話框 核心 混淆 == script delet 網頁 port BOM的核心對象就是window,這一章沒什麽好說的,總結一些比較常用的: 1,a未定義,a; //報錯window.a; //undefined 不能用delete刪除全局變量 2

.net core 2.0學習筆記遷移.net framework 工程到.net core

編譯 its evel hashtable ref 學習筆記 inline null 創建 在遷移.net core的過程中,第一步就是要把.net framework 工程的目標框架改為.net core2.0,但是官網卻沒有提供轉換工具,需要我們自己動手完成了

java學習筆記import語法

employee sign cnblogs java 調用 變量賦值 temp 職位 求職 Import 語法是給編譯器尋找特定類的適當位置的一種方法。 創建一個Employee 類,包括四個實體變量姓名(name),年齡(age),職位(designation)和薪水(s

HADOOP學習筆記HBase

系統 唯一性 創建時間 必須 就是 入口 計算 hfile mapreduce HBase簡介 Hbase是分布式、面向列的開源數據庫(其實準確的說是面向列族)。HDFS為Hbase提供可靠的底層數據存儲服務,MapReduce為Hbase提供高性能的計算能力,Zooke

javaweb學習筆記會話管理1

目錄 會話管理 1.概念 2.cookie技術 2.1 Cookie一般處理流程 2.2 Cookie類 會話管理 1.概念 一次會話: 開啟瀏覽器 -> 訪問一些伺服器內容 -> 關閉瀏覽器。(瀏覽器A給伺服器傳送請求,訪問web程式,該次會話就

深度學習筆記——神經網路和深度學習淺層神經網路

1.神經網路概覽 神經網路的結構與邏輯迴歸類似,只是神經網路的層數比邏輯迴歸多一層,多出來的中間那層稱為隱藏層或中間層。從計算上來說,神經網路的正向傳播和反向傳播過程只是比邏輯迴歸多了一次重複的計算。正向傳播過程分成兩層,第一層是輸入層到隱藏層,用上標[1]來表示;第二層是隱藏層到輸出層,用上標

學習筆記使用K近鄰演算法檢測WebShell

1.資料蒐集       載入ADFA-LD中正常樣本資料: def load_adfa_training_files(rootdir): x=[] y=[] list = os.listdir(rootdir) for i in

Scala學習筆記apply方法說明

調用 我們 val sca 關鍵字 語法糖 方式 rgs 類型 當scala中類或者對象有一個主要用途的時候,apply方法就是一個很好地語法糖。請看下面一個簡單的例子: class Foo(foo: String) {} object Foo { def appl

Python3學習筆記用Python實現深度優先

這裡主要是用Python實現下深度優先的概念,由於程式碼寫得比較隨意,就沒有封裝成類,而是寫成一個函式 用一個列表做為實驗資料,模擬成二叉樹結構,用遞迴的方式不斷獲取二叉樹上的左節點,一直到左節點 序號超出列表範圍,然後迴歸獲取右節點,以此來實現深度優先。 以下是程式碼

安卓開發學習筆記Android Stuidio無法實現隱式Intent是為什麼?

1 package com.example.lenovo.activitytest; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.view

圖解演算法學習筆記快速排序

本章內容:學習分而治之,快速排序 1) 示例1: 假設你是農場主,有一小塊土地,你要將這塊地均勻分成方塊,且分出的方塊儘可能大。如何分? 你要將這塊地均勻分成方塊,且分出的方塊要儘可能大。顯然,下面的分法不符合要求。 此時,你應該使用D&C策略(div

Maven學習總結更改maven的編碼格式方式

fis mtu avd WAD nav npe env unp bcp 安裝系統之後,一般中文系統默認字符集是GBK。我們安裝的軟件一般都繼承使用操作系統的默認字符集。所以當在中文XP或者win7系統開發,在使用maven(mvn compile)編譯項目的時候,就會出現“