網絡性能測量的五項指標
可用性(availability)
響應時間(response time)
網絡利用率(network utilization)
網絡吞吐量(network throughput)
網絡帶寬容量(network bandwidth capacity)
1. 可用性
測試網絡性能的第一步是確定網絡是否正常工作,最簡單的方法是使用 ping 命令。通過向遠端的機器發送 icmp echo request,並等待接收 icmp echo reply 來判斷遠端的機器是否連通,網絡是否正常工作。
Ping 命令有非常豐富的命令選項,比如 -c 可以指定發送 echo request 的個數,-s 可以指定每次發送的 ping 包大小。
網絡設備內部一般有多個緩沖池,不同的緩沖池使用不同的緩沖區大小,分別用來處理不同大小的分組(packet)。例如交換機中通常具有三種類型的包緩沖:一類針對小的分組,一類針對中等大小的分組,還有一類針對大的分組。為了測試這樣的網絡設備,測試工具必須要具有發送不同大小分組的能力。Ping 命令的 -s 就可以使用在這種場合。
2. 響應時間
Ping 命令的 echo request/reply 一次往返所花費時間就是響應時間。有很多因素會影響到響應時間,如網段的負荷,網絡主機的負荷,廣播風暴,工作不正常的網絡設備等等。
在網絡工作正常時,記錄下正常的響應時間。當用戶抱怨網絡的反應時間慢時,就可以將現在的響應時間與正常的響應時間對比,如果兩者差值的波動很大,就能說明網絡設備存在故障。
3. 網絡利用率
網絡利用率是指網絡被使用的時間占總時間(即被使用的時間+空閑的時間)的比例。比如,Ethernet 雖然是共享的,但同時卻只能有一個報文在傳輸。因此在任一時刻,Ethernet 或者是 100% 的利用率,或者是 0% 的利用率。
計算一個網段的網絡利用率相對比較容易,但是確定一個網絡的利用率就比較復雜。因此,網絡測試工具一般使用網絡吞吐量和網絡帶寬容量來確定網絡中兩個節點之間的性能。
4. 網絡吞吐量
網絡吞吐量是指在某個時刻,在網絡中的兩個節點之間,提供給網絡應用的剩余帶寬。
網絡吞吐量可以幫助尋找網絡路徑中的瓶頸。比如,即使 client 和 server 都被分別連接到各自的 100M Ethernet 上,但是如果這兩個 100M 的Ethernet 被 10M 的 Ethernet 連接起來,那么 10M 的 Ethernet 就是網絡的瓶頸。
網絡吞吐量非常依賴於當前的網絡負載情況。因此,為了得到正確的網絡吞吐量,最好在不同時間(一天中的不同時刻,或者一周中不同的天)分別進行測試,只有這樣才能得到對網絡吞吐量的全面認識。
有些網絡應用程序在開發過程的測試中能夠正常運行,但是到實際的網絡環境中卻無法正常工作(由於沒有足夠的網絡吞吐量)。這是因為測試只是在空閑的網絡環境中,沒有考慮到實際的網絡環境中還存在着其它的各種網絡流量。所以,網絡吞吐量定義為剩余帶寬是有實際意義的。
5. 網絡帶寬容量
與網絡吞吐量不同,網絡帶寬容量指的是在網絡的兩個節點之間的最大可用帶寬。這是由組成網絡的設備的能力所決定的。
測試網絡帶寬容量有兩個困難之處:在網絡存在其它網絡流量的時候,如何得知網絡的最大可用帶寬;在測試過程中,如何對現有的網絡流量不造成影響。網絡測試工具一般采用 packet pairs 和 packet trains 技術來克服這樣的困難。
收集網絡性能數據的方式
當確定了網絡性能的測試指標以后,就需要使用網絡測試工具收集相應的性能數據,分別有三種從網絡獲取數據的方式:
- 通過snmp協議直接到網絡設備中獲取,如net-snmp工具
- 偵聽相關的網絡性能數據,典型的工具是tcpdump
- 自行產生相應的測試數據,即本文中介紹的iperf、netperf、mz工具
Iperf
Iperf 是一個網絡性能測試工具。Iperf可以測試最大TCP和UDP帶寬性能,具有多種參數和UDP特性,可以根據需要調整,可以報告帶寬、延遲抖動和數據包丟失。
0
客戶端與服務器共用選項
命令行選項 | 描述 |
---|---|
-u | –udp:使用UDP方式而不是TCP方式。需要客戶端與服務器端同時使用此參數。 |
-p | –port : 設置端口,與服務器端的監聽端口一致。默認是5001端口。 |
-l | –len : 設置讀寫緩沖區的長度。TCP方式默認為8KB,UDP方式默認為1470字節。 |
-w | –window : 設置套接字緩沖區為指定大小。對於TCP方式,此設置為TCP窗口大小。對於UDP方式,此設置為接受UDP數據包的緩沖區大小,限制可以接受數據包的最大值。 |
-m | –print_mss :輸出TCP MSS值(通過TCP_MAXSEG支持)。MSS值一般比MTU值小40字節。通常情況 |
服務器端專用選項
命令行選項 | 描述 |
---|---|
-s | –server : Iperf服務器模式 |
-c | –client host : 如果Iperf運行在服務器模式,並且用-c參數指定一個主機,那么Iperf將只接受指定主機的連接。此參數不能工作於UDP模式。 |
-P | –parallel: 服務器關閉之前保持的連接數。默認是0,這意味着永遠接受連接。 |
客戶端端專用選項
命令行選項 | 描述 |
---|---|
-c | –client host : 運行Iperf的客戶端模式,連接到指定的Iperf服務器端。 |
-b | –bandwidth :UDP模式使用的帶寬,必須配合-u參數,默認值是1 Mbit/sec。 |
-d | –dualtest : 運行雙測試模式。這將使服務器端反向連接到客戶端,使用-L 參數中指定的端口(或默認使用客戶端連接到服務器端的端口)。這些在操作的同時就立即完成了。如果你想要一個交互的測試,請嘗試-r參數。 |
-r | –tradeoff : 往復測試模式。當客戶端到服務器端的測試結束時,服務器端通過-l選項指定的端口(或默認為客戶端連接到服務器端的端口),反向連接至客戶端。當客戶端連接終止時,反向連接隨即開始。如果需要同時進行雙向測試,請嘗試-d參數。 |
-L | –listenport : 指指定服務端反向連接到客戶端時使用的端口。默認使用客戶端連接至服務端的端口。 |
-t | –time : 設置傳輸的總時間。Iperf在指定的時間內,重復的發送指定長度的數據包。默認是10秒鍾。 |
-P | –parallel: 線程數。指定客戶端與服務端之間使用的線程數。默認是1線程。需要客戶端與服務器端同時使用此參數。 |
實例
帶寬測試通常采用UDP模式,因為能測出極限帶寬、時延抖動、丟包率。在進行測試時,首先以鏈路理論帶寬作為數據發送速率進行測試,例如,從客戶端到服務器之間的鏈路的理論帶寬為100Mbps,先用-b 100M進行測試,然后根據測試結果(包括實際帶寬,時延抖動和丟包率),再以實際帶寬作為數據發送速率進行測試,會發現時延抖動和丟包率比第一次好很多,重復測試幾次,就能得出穩定的實際帶寬。
UDP模式
服務器端:
iperf -u -s
客戶端:
/*在udp模式下,以100Mbps為數據發送速率,客戶端到服務器192.168.1.1上傳帶寬測試,測試時間為60秒*/
iperf -u -c 192.168.1.1 -b 100M -t 60
/*客戶端以5Mbps為數據發送速率,同時向服務器端發起30個連接線程*/
iperf -u -c 192.168.1.1 -b 5M -P 30 -t 60
/*以100M為數據發送速率,進行上下行帶寬測試,-L參數指定本端雙測試監聽的端口*/
iperf -u -c 192.168.1.1 -b 100M -d -t 60 -L 30000
TCP模式
服務器端:
iperf -s
客戶端:
/*在tcp模式下,客戶端到服務器192.168.1.1上傳帶寬測試,測試時間為60秒*/
iperf -c 192.168.1.1 -t 60
/*進行上下行帶寬測試*/
iperf -c 192.168.1.1 -d -t 60
/*測試單線程TCP*/
iperf –c 192.168.1.1 –p 12345 –i 1 –t 10 –w 20K
-c:客戶端模式,后接服務器ip
-p:后接服務端監聽的端口
-i:設置帶寬報告的時間間隔,單位為秒
-t:設置測試的時長,單位為秒
-w:設置tcp窗口大小,一般可以不用設置,默認即可
對應服務器端:
iperf –s –p 12345 –i 1 –t 10 –m -y
/*測試多線程TCP: 客戶端同時向服務器端發起30個連接線程*/
iperf -c 192.168.1.1 -P 30 -t 60
發包完成后,可以通過ifconfig ethx 和 ethtool -S ethx 查看對應收發包情況,確定發包數、包長、是否丟包等。
Netperf
Netperf是一種網絡性能的測量工具,主要針對基於TCP或UDP的傳輸。Netperf根據應用的不同,可以進行不同模式的網絡性能測試,即批量數據傳輸(bulk data transfer)模式和請求/應答(request/reponse)模式。
參數 | 說明 |
---|---|
-H host | 指定遠端運行netserver的server IP地址 |
-l testlen | 指定測試的時間長度(秒) |
-t testname | 指定進行的測試類型(TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR) |
可選參數有如下幾個:
參數 | 說明 |
---|---|
-s size | 設置本地系統的socket發送與接收緩沖大小 |
-S size | 設置遠端系統的socket發送與接收緩沖大小 |
-m size | 設置本地系統發送測試分組的大小 |
-M size | 設置遠端系統接收測試分組的大小 |
-D | 對本地與遠端系統的socket設置TCP_NODELAY選項 |
-r req,resp | 設置request和reponse分組的大小 |
實例:
服務器端:
#./netserver
客戶端:
1、批量(bulk)網絡流量的性能
1) TCP_STREAM
Netperf缺省情況下進行TCP批量傳輸,即-t TCP_STREAM。測試過程中,netperf向netserver發送批量的TCP數據分組,以確定數據傳輸過程中的吞吐量:
#./netperf -H 192.168.0.28 -l 60
TCP STREAM TEST to 192.168.0.28
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 60.00 88.00
從netperf的結果輸出中,我們可以知道以下的一些信息:
1)遠端系統(即server)使用大小為87380字節的socket接收緩沖
2)本地系統(即client)使用大小為16384字節的socket發送緩沖
3)向遠端系統發送的測試分組大小為16384字節
4)測試經歷的時間為60秒
5)吞吐量的測試結果表明,TCP帶寬為88Mbits/秒
通過修改可選參數,並觀察結果的變化,我們可以確定是什么因素影響了連接的吞吐量。例如,如果懷疑路由器由於缺乏足夠的緩沖區空間,使得轉發大的分組時存在問題,就可以增加測試分組(-m)的大小,以觀察吞吐量的變化:
#./netperf -H 192.168.0.28 -l 60 -- -m 2048
TCP STREAM TEST to 192.168.0.28
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 2048 60.00 87.62
在這里,測試分組的大小減少到2048字節,而吞吐量卻沒有很大的變化(與前面例子中測試分組大小為16K字節相比)。相反,如果吞吐量有了較大的提升,則說明在網絡中間的路由器確實存在緩沖區的問題。
2). UDP_STREAM
UDP_STREAM用來測試進行UDP批量傳輸時的網絡性能。需要特別注意的是,此時測試分組的大小不得大於socket的發送與接收緩沖大小,否則netperf會報出錯提示:
#./netperf -t UDP_STREAM -H 192.168.0.28 -l 60
UDP UNIDIRECTIONAL SEND TEST to 192.168.0.28
udp_send: data send error: Message too long
為了避免這樣的情況,可以通過命令行參數限定測試分組的大小,或者增加socket的發送/接收緩沖大小。UDP_STREAM方式使用與TCP_STREAM方式相同的局部命令行參數,因此,這里可以使用-m來修改測試中使用分組的大小:
#./netperf -t UDP_STREAM -H 192.168.0.28 -- -m 1024
UDP UNIDIRECTIONAL SEND TEST to 192.168.0.28
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
65535 1024 9.99 114127 0 93.55
65535 9.99 114122 93.54
UDP_STREAM方式的結果中有兩行測試數據
第一行顯示的是本地系統的發送統計,這里的吞吐量表示netperf向本地socket發送分組的能力。但是,我們知道,UDP是不可靠的傳輸協議,發送出去的分組數量不一定等於接收到的分組數量。
第二行顯示的就是遠端系統接收的情況,由於client與server直接連接在一起,而且網絡中沒有其它的流量,所以本地系統發送過去的分組幾乎都被遠端系統正確的接收了,遠端系統的吞吐量也幾乎等於本地系統的發送吞吐量。但是,在實際環境中,一般遠端系統的socket緩沖大小不同於本地系統的socket緩沖區大小,而且由於UDP協議的不可靠性,遠端系統的接收吞吐量要遠遠小於發送出去的吞吐量。
2、請求/應答(request/response)網絡流量的性能
另一類常見的網絡流量類型是應用在client/server結構中的request/response模式。在每次交易(transaction)中,client向server發出小的查詢分組,server接收到請求,經處理后返回大的結果數據。
1) TCP_RR
TCP_RR方式的測試對象是多次TCP request和response的交易過程,但是它們發生在同一個TCP連接中,這種模式常常出現在數據庫應用中。數據庫的client程序與server程序建立一個TCP連接以后,就在這個連接中傳送數據庫的多次交易過程。 用戶可以通過-r參數來改變request和response分組的大小,進行更有實際意義的測試:
#./netperf -t TCP_RR -H 192.168.0.28 -- -r 32,1024
TCP REQUEST/RESPONSE TEST to 192.168.0.28
Local /Remote
Socket Size Request Resp. Elapsed Trans.
Send Recv Size Size Time Rate
bytes Bytes bytes bytes secs. per sec
16384 87380 32 1024 10.00 4945.97
16384 87380
從結果中可以看出,增加request/reponse分組的大小,會導致交易率明顯的下降。
注:相對於實際的系統,這里交易率的計算沒有充分考慮到交易過程中的應用程序處理時延,因此結果往往會高於實際情況
2) TCP_CRR
與TCP_RR不同,TCP_CRR為每次交易建立一個新的TCP連接。最典型的應用就是HTTP,每次HTTP交易是在一條單獨的TCP連接中進行的。因此,由於需要不停地建立新的TCP連接,並且在交易結束后拆除TCP連接,交易率一定會受到很大的影響。
#./netperf -t TCP_CRR -H 192.168.0.28
TCP Connect/Request/Response TEST to 192.168.0.28
Local /Remote
Socket Size Request Resp. Elapsed Trans.
Send Recv Size Size Time Rate
bytes Bytes bytes bytes secs. per sec
131070 131070 1 1 9.99 2662.20
16384 87380
即使是使用一個字節的request/response分組,交易率也明顯的降低了,只有2662.20次/秒。
3) UDP_RR
UDP_RR方式使用UDP分組進行request/response的交易過程。由於沒有TCP連接所帶來的負擔,所以我們推測交易率一定會有相應的提升。
#./netperf -t UDP_RR -H 192.168.0.28
UDP REQUEST/RESPONSE TEST to 192.168.0.28
Local /Remote
Socket Size Request Resp. Elapsed Trans.
Send Recv Size Size Time Rate
bytes Bytes bytes bytes secs. per sec
65535 65535 1 1 9.99 10141.16
65535 65535
結果證實了我們的推測,交易率為10141.16次/秒,高過TCP_RR的數值。不過,如果出現了相反的結果,即交易率反而降低了,也不需要擔心,因為這說明了在網絡中,路由器或其它的網絡設備對UDP采用了與TCP不同的緩沖區空間和處理技術。
MZ
Mausezahn是什么?
它是一個用C語言開發的快速產生流量的工具,用戶可以用它來發送幾乎所有可能和不可能產生的包。它可以用來做如下工作:
- 流量產生器(比如高壓的多點傳送網絡)
- 防火牆和IDS的穿透測試
- 網絡中的DoS攻擊
- 在網絡軟件或工具中發現bug
- 用大量的ping和端口掃描搜索攻擊
- 測試網絡行為在奇怪的環境下(如壓力測試,畸形包)
- 實驗室里教學工具
MZ是一個有着簡單語法和在線幫助的命令行的萬能發包工具,它還能用在腳本里做各種測試。目前mz只有Linux平台的版本或者類似Unix平台的版本,沒有windows版本的。
參數 | 說明 |
---|---|
-t | 指定包類型(IP,UDP,TCP,ARP,BPDU,CDP,部分的ICMP,RTP,DNS和SYSLOG |
-a | 指定源mac |
-b | 指定目的mac |
-A | 指定源ip |
-B | 指定目的ip |
-p | 指定未加工的幀指定長度(隨機字節數); |
-P | 指定ASCII字符有效載荷 |
-r | 指定delay的時間為隨機值 |
-f | 從文件中讀取ASCII的有效載荷 |
-F | 從文件中讀取16進制數字的有效載荷 |
-S | 模擬方式:電線里不放任何數據,它通常與詳細的模式(-v或者V) |
自動產生包
當前有如下類型包的產生器(ARP,BPDU,CDP,IP,部分的ICMP,UDP,TCP,RTP,DNS和SYSLOG),對於每個包你都可以指定可選的有效載荷,這既可以用參數payload(或小寫的p)來表示十六進制符號或直接用“-P”選項來表示ASCII文本:
# 字節被定義為2個16進制數。多字節必須用空格,冒號,橫線或者任何你喜歡的分隔
mz eth0 -t ip p=68:65:6c:6c:6f:20:77:6f:72:6c:64
# ASCII文本
mz eth0 -t ip -P "Hello World"
二層:
默認情況是每次只有一個包發送,如果你想發送多個包可以用選項 -c ,當count=0時mz會永遠發送。
每間隔50毫秒發送100,000個幀:
# mz -c 100000 -d 50msec "aa bb cc dd ...."
間隔2秒發送一個無窮大的BPDU幀
# mz -c 0 -d 2s -t bpdu conf
用最大速度發送幀,用隨機的MAC地址和廣播的目的地址,另外把幀設置為1000字節:
# mz eth0 -c 0 -a rand -b bcast -p 1000 "08 00 aa bb cc dd"
在VLAN500發送一個CoS=7的TCP的包
# mz eth0 -t tcp -Q 7:500 "dp=80, flags=rst, p=aa:aa:aa"
發送一個VLAN標志為100(外部)和651(內部)的UDP包
# mz eth0 -t udp "dp=8888, sp=13442" -P "Mausezahn is great" -Q 100,651
三-七層:
UDP
Mz支持UDP數據包的產生。簡單地指定目的地址(-B選項)並且可選的選擇任意的源地址(-A選項)作為參數,你還可以通過dp(目的端口)和sp(源端口)指定端口號以及有效載荷。甚至你可以指定整個端口范圍,如此一來就可以發送多個包。
發送測試包到RTP端口的范圍:
mz eth0 -B 192.168.1.1 -t udp "dp=16384-32767, \ p=A1:00:CC:00:00:AB:CD:EE:EE:DD:DD:00"
TCP
Mz運行你很輕松的建TCP包。類似UDP你可以用sp和dp來指定源和目標端口參數。接着你可以通過“|”作為分隔符直接指定想要的標志如果你想指定多個標志的話。例如,對於1.1.1.1的SYN-Flood攻擊就使用隨機的源地址定時的使用所有的1023個端口: