Iperf原理介紹

第一部分

Iperf 版本建議採用linux版本,事實上,windows版也很好用。Iperf 是一個 TCP/IP 和 UDP/IP 的性能測量工具,通過調諧各種參數可以測試TCP的最大帶寬,並報告帶寬、延遲,最大段和最大傳輸單元大小等統計信息。Iperf可以運行於Linux/BSD、Unix及Windows等操作系統。

    帶寬測試通常採用UDP模式,因爲能測出極限帶寬、時延抖動、丟包率。在進行測試時,首先以鏈路理論帶寬作爲數據發送速率進行測試,例如,從客戶端到服務器之間的鏈路的理論帶寬爲100Mbps,先用 -b 100M進行測試,然後根據測試結果(包括實際帶寬,時延抖動和丟包率),再以實際帶寬作爲數據發送速率進行測試,會發現時延抖動和丟包率比第一次好很多,重複測試幾次,就能得出穩定的實際帶寬。

1、UDP 模式

服務器端    iperf -u -s

客戶端    

iperf -u -c 192.168.1.1 -b 100M -t 60

在udp模式下,以100Mbps爲數據發送速率,客戶端到服務器192.168.1.1上傳帶寬測試,測試時間爲60秒。

iperf -u -c 192.168.1.1 -b 5M -P 30 -t 60

客戶端同時向服務器端發起30個連接線程,以5Mbps爲數據發送速率。

iperf -u -c 192.168.1.1 -b 100M -d -t 60

以100M爲數據發送速率,進行上下行帶寬測試。

 

2、TCP模式

服務器端    iperf -s

客戶端

iperf -c 192.168.1.1 -t 60

在tcp模式下,客戶端到服務器192.168.1.1上傳帶寬測試,測試時間爲60秒。

iperf -c 192.168.1.1 -P 30 -t 60

客戶端同時向服務器端發起30個連接線程。

iperf -c 192.168.1.1 -d -t 60

進行上下行帶寬測試。

另外,

-p 監聽或者連接的端口號

-w TCP滑動窗口的大小

3、Iperf工作原理

    Iperf主要的功能是測試基於特定路徑的TCP連接的性能,我們知道TCP連接調整最基本的措施是調整TCP窗口的大小,窗口大小控制在任何節點網絡中可以存在的數據大小。如果該值太小,發送者將會在某段時間處於空閒狀態,從而影響發送的性能。TCP窗口大小的理論值爲鏈路瓶頸帶寬與往返時延的乘積:

TCP_Window=Bottleneck_Bandwidth*Round_Trip_Time

例如鏈路瓶頸帶寬爲45Mbps,往返時延爲42ms(可以通過ping來測試),那麼窗口的理論值爲:

45Mbps*42ms=(45*e6)*(42*e-3)=1890000 bits=230KByte

調節窗口大小即可以理論值爲基準,在該值上慢慢增大或減少,即可獲得最好的結果。

    Iperf測試TCP帶寬的原理較簡單,即在客戶端和服務器端建立連接(三次握手)後,客戶端發送一定大小的數據報,並記下發送的時間, 或者客戶端在一定的時間內發送數據,並記下發送的總數據。帶寬的大小等於發送的總數據除以發送的總時間。對服務器端來說,就是在連接建立時間內,接收的總數據除以所花時間即爲服務器端所測得的帶寬。MSS的大小通過TCP內核接口函數直接獲得。

    Iperf測試UDP的性能時,客戶端可以指定UDP數據流的速率。客戶端發送數據時,將根據客戶提供的速率計算數據報發送之間的時延。另外客戶還可以指定發送數據報的大小。每個發送的數據報包含一個ID號,用來惟一地標識該報文。服務器端則根據該ID號來確定數據報丟失和亂序。當把UDP報文大小設置可以將整個報文放入IP層的包(packet)內時,那麼UDP所測得的報文丟失數據即爲IP層包的丟失數據。這提供了一個有效的測試包丟失情況的方法。數據報傳輸延遲抖動 (Jitter)的測試由服務器端完成,客戶發送的報文數據包含有發送時間戳,服務器端根據該時間信息和接收到報文的時間戳來計算傳輸延遲抖動。傳輸延遲抖動反映傳輸過程中是否平滑。由於它是一個相對值,所以並不需要客戶端和服務器端時間同步。

4、Iperf實現
     Iperf源代碼採用面向對象的C++語言實現,主要包括基本類和實現類兩部分。基本類提供了實現中需要用到的一些基本的對象,包括隊列、鏈表、時間管理、鎖、條件、線程等,這些代碼不是特定於Iperf應用的,可以移植到其他應用程序。實現類中主要包括針對Iperf應用的類,包括實現客戶端/服務器端發送和接收數據的類,以及用於統計信息的類等。這裏主要討論一下與應用關係最緊密的幾個類,其他的類不做詳述(轉載者注:後面轉載文章有講解)。

    Iperf主要類圖結構包括9個類。Iperf 的核心部分均在PerfSocket類中實現,包括客戶端和服務器端發送和接收數據、帶寬報告、數據丟失及延遲抖動報告,以及窗口大小和MSS報告等功能。其中Speaker和Client爲客戶端的對象,Listener、Audience和Server爲服務器端的對象。客戶端和服務器端的通信通過三個消息完成:connect、write以及shutdown。這裏connect不同於TCP中的連接,它還包含一個數據報文,其信息爲雙向測試而傳給服務器端 的信息,主要用於雙向測試時讓服務器端啓動客戶端線程而所需要的信息。UDP 測試的過程基本上跟TCP類似。UDP報文包含了一個應用報文頭,其主要字段爲報文ID和時間信息,這個主要是爲了測試UDP報文的丟失、亂序以及延遲抖動性能。UDP的第一個報文用來建立連接,不作爲應用數據,其信息爲雙向測試而傳給服務器端的信息,主要用於雙向測試時讓服務器端啓動客戶端線程而所需要的信息。UDP與TCP第一個報文內容的主要區別是UDP報文還包括一個應用報文頭。UDP傳輸結束通過客戶端發送一個FIN的報文來實現,該報文的報文ID爲負數,服務器端接收到FIN報文後即停止接收報文並回送一個 AckFIN報文給客戶,AckFIN報文包含了服務器端得到的測試數據。

操作舉例:

1)TCP測試

服務器執行:iperf -s -i 1 -w 1M

客戶端執行:iperf -c host -i 1 -w 1M

其中-w表示TCP window size,host需替換成服務器地址。

2)UDP測試

服務器執行:iperf -u -s

客戶端執行:iperf -u -c 10.32.0.254 -b 900M  -i 1  -w 1M  -t 60

其中-b表示使用帶寬數量,千兆鏈路使用90%容量進行測試就可以了。

 

iperf的其他參數參考如下:

Iperf 是一個 TCP/IP 和 UDP/IP 的性能測量工具,能夠提供網絡吞吐率信息,以及震動、丟包率、最大段和最大傳輸單元大小等統計信息;從而能夠幫助我們測試網絡性能,定位網絡瓶頸。


參數說明
-s 以server模式啓動,eg:iperf -s
-c 以client模式啓動,host是server端地址,eg:iperf -c 222.35.11.23


通用參數
-f [k|m|K|M] 分別表示以Kbits, Mbits, KBytes, MBytes顯示報告,默認以Mbits爲單位,eg:iperf -c 222.35.11.23 -f K

-i sec 以秒爲單位顯示報告間隔,eg:iperf -c 222.35.11.23 -i 2

iperf是client端向server端發送數據

server端顯示的是接收速率,最好加i參數,進行速率跟蹤


client 顯示的是發送速率

server 顯示接收速率

-l 緩衝區大小,默認是8KB,eg:iperf -c 222.35.11.23 -l 16

可以使用不同的包長,進行測試

-m 顯示tcp最大mtu值
-o 將報告和錯誤信息輸出到文件eg:iperf -c 222.35.11.23 -o c:/iperflog.txt
-p 指定服務器端使用的端口或客戶端所連接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999

-u 使用udp協議


測試htb的時候最好用udp,udp通信開銷小,測試的帶寬更準確

-w 指定TCP窗口大小,默認是8KB

如果窗口太小,有可能丟包

-B 綁定一個主機地址或接口(當主機有多個地址或接口時使用該參數)
-C 兼容舊版本(當server端和client端版本不一樣時使用)
-M 設定TCP數據包的最大mtu值
-N 設定TCP不延時
-V 傳輸ipv6數據包


server專用參數
-D 以服務方式運行ipserf,eg:iperf -s -D
-R 停止iperf服務,針對-D,eg:iperf -s -R


client端專用參數
-d 同時進行雙向傳輸測試
-n 指定傳輸的字節數,eg:iperf -c 222.35.11.23 -n 100000
-r 單獨進行雙向傳輸測試


-b 指定發送帶寬,默認是1Mbit/s

在測試qos的時候,這是最有用的參數。

-t 測試時間,默認10秒,eg:iperf -c 222.35.11.23 -t 5


默認是10s

-F 指定需要傳輸的文件
-T 指定ttl值

 

 

第二部分

 

【概要】Iperf是一款網絡性能測試工具,可以方便的用它進行SDN網絡帶寬和網絡質量的測試,Iperf支持協議、定時、緩衝區等參數的配置調整,報告TCP/UDP最大帶寬、延遲抖動、數據包丟失等統計信息。

1 Iperf安裝

Iperf安裝方法有多種,可以下載源碼編譯安裝,也可以直接使用編譯好的二進制版本,在ubuntu下安裝使用iperf尤爲簡單,apt-get install iperf 即可,值得一提的是Mininet自帶Iperf,在SDN網絡上測試比較便捷。

2 工作原理

使用Iperf測試時必須將一臺主機設置爲客戶端,一臺主機設置爲服務器。

Iperf測試TCP

Iperf測試TCP帶寬的原理比較簡單,在客戶端和服務端建立三次握手連接後,客戶端帶寬的大小等於發送的總數據除以發送的總時間。對服務端測得的帶寬,則是接收的總數據除以所花時間。

TCP模式下簡單舉例:
Server:iperf -s
Client:iperf -c 10.0.0.1 -i 1

客戶端到服務器10.0.0.1上帶寬測試,每一秒鐘打印一次信息。

Iperf測試UDP

Iperf測試UDP性能時,客戶端可以指定UDP數據流的速率。客戶端發送數據時,將根據客戶端提供的速率計算數據報發送之間的時延。

客戶端還可以指定發送數據報的大小。每個發送的數據報包含一個ID號,用來唯一標識報文,服務器端根據該ID號來確定數據報丟失和亂序。

當把UDP報文大小設置可以將整個報文放入IP層的包(packet)內時,那麼UDP所測得的報文丟失數據即爲IP層包的丟失數據,這提供了一個有效的測試包丟失情況的方法。

數據報傳輸延遲抖動 (Jitter)的測試由服務器端完成,客戶發送的報文數據包含有發送時間戳,服務器端根據該時間信息和接收到報文的時間戳來計算傳輸延遲抖動。傳輸延遲抖動反映傳輸過程中是否平滑。由於它是一個相對值,所以並不需要客戶端和服務器端時間同步。

UDP模式下簡單舉例:
Server:iperf -s -u
Client:iperf -c 10.0.0.1 -u -b 100M

在UDP模式下,客戶端以100Mbps爲數據發送速率,測試客戶端到服務器10.0.0.1上的帶寬。

綜上,用以下方法測試網絡連接的質量:
- 延時(反應時間或者RTT):用ping命令量度
- Jitter(延時變化):用Iperf UDP測試來量度
- 數據報丟失:用Iperf UDP測試來量度
- 帶寬:通過TCP測試來量度

3 參數配置

表 1. 客戶端/服務器端通用參數

Ipef表 1. 客戶端服務器端通用參數

表 2. 服務器端參數

Iperf表 2. 服務器端參數

表 3. 客戶端參數

Iperf表 3. 客戶端參數

4 測試實例

測試環境

1) 已搭建好一套SDN網絡環境,使用Mininet模擬交換機和主機連接到一款OpenFlow控制器
2) 使用Mininet自帶的Iperf工具

應用實例

實例一:最簡參數實例

服務端:

Iperf-test1-s

客戶端:

Iperf-test1-c

Iperf客戶端連接Iperf服務器的TCP默認端口5001,否則我們可以用-p參數修改Iperf服務器的端口,客戶端與服務器必須加上同樣的端口。結果顯示的帶寬是從用戶到服務器之間的帶寬。

實例二:雙向帶寬測試

服務端:

Iperf-test2-s

客戶端:

Iperf-test2-c

-r參數可以量度雙向帶寬,Iperf服務器會主動向客戶端發起連接。

實例三:同步雙向帶寬測試

服務端:

Iperf-test3-s

客戶端:

Iperf-test3-c

使用-d 參數同步測量雙向帶寬,而上例的-r在初始狀態時,只會量度客戶到服務器的帶寬。

實例四:TCP窗口大小

服務端:

Iperf-test4-s

客戶端:

Iperf-test4-c

在連接中,如果接收方來不及驗證,數據會暫時被存在一個緩衝區裏,這個緩衝區的上限就是所謂的TCP窗口大小,窗口的大小可以在2到65,535 bytes之間。

實例五:UDP測試

UDP測試會得到關於Jitter和數據包丟失的重要信息。

服務端:

Iperf-test5-s

客戶端:

Iperf-test5-c

良好的連接質量,數據包的丟失率要小於1%,數據包的丟失率過高會導致許多TCP數據報需要重傳,從而影響帶寬。 Jitter代表的是延時變化,並不依賴於延時本身,你可能擁有很長的反應時間,但是Jitter卻很低。

5 結束語

Jperf與Iperf一起使用的話可以提供一個java寫成的圖形界面,大家可以自行學習,這裏就不做介紹。如有不足之處請指正,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章