10,981 瀏覽數

iperf – TCP window size

在 iperf 中有兩個參數
-w, –window #[KM] 用來指定 TCP window size
-l, –len #[KM] 網路的 read 與 write 的 buffers (TCP 預設值為 8 KB)

我們來看什麼是 TCP window size,說起來有點複雜,首先要來了解什麼是 TCP 三方交握 (TCP 3-way handshake) 以及 TCP Sliding Window 的關係
關於 iperf 的基礎設定請先參考 http://benjr.tw/462

所謂的 TCP 三方交握(TCP 3-way handshake) 就是 Server 與 Client 間透過 3 次的溝通,才會進行資料的傳輸
這步驟如下

  1. Client 用戶端向 Server 伺服器發送一個 "SYN" 訊息,跟 Server 伺服器請求連線.
  2. 如果 Server 伺服器準備好與 Client 用戶端連線,就會回傳一個 "SYN-ACK" 的訊息.
  3. 如果 Client 用戶端接受到剛剛的 "SYN-ACL" 而且也準備好,就會向 Server 伺服器發送一個 "ACK"訊號,讓 Server 伺服器知道現在要開始傳送資料了.

接下來即開始資料的傳送,Client 用戶端每送一筆資料 Server 伺服器收到資料都會回傳給 Client 用戶端一個 ACK 訊號.但這樣未免太沒效率,所以通常會一次傳送多筆資料過去,這就是 TCP Sliding Window
TCP Sliding Window 可以區分為 Send / Receive Window 兩種.

  1. TCP 傳送端(Client 用戶端)的 Sliding Window 被稱為 Send Window,有收到接收端的 ACK 訊號才會傳送下一筆資料.並移動 Send Window.
  2. TCP 接收端(Server 伺服器)的 Sliding Window 被稱為 Receive Window,只有最前端的資料收到才會送出 ACK 訊號,並移動 Receive Window.

Send / Receive window size 的值通常非固定但雙方會協議出一個數值,詳細資料請參考 google 或是下面的網頁說明.
http://stishsun.blogspot.tw/2009/06/tcp-sliding-window.html

在 Linux 下預設的 TCP window size 大小為何??

我們可以到 /proc/sys/net/目錄來查詢 TCP 的參數設定

[root@benjr ~]#cat /proc/sys/net/core/rmem_max
124928
[root@benjr ~]# cat /proc/sys/net/core/rmem_defaul
124928
[root@benjr ~]# cat /proc/sys/net/core/wmem_max
124928
[root@benjr ~]# cat /proc/sys/net/core/wmem_defaul
124928
[root@benjr ~]# cat /proc/sys/net/ipv4/tcp_window_scaling
1
  • /proc/sys/net/core/rmem_max
    最大 TCP Receive window size 接受窗口
  • /proc/sys/net/core/rmem_defaul
    預設 TCP Receive window size 接受窗口
  • /proc/sys/net/core/wmem_max
    最大 TCP Transmit window size 接受窗口
  • /proc/sys/net/core/rmem_defaul
    預設 TCP Transmit window size 接受窗口
  • /proc/sys/net/ipv4/tcp_window_scaling
    剛剛有談到預設的 windows szie 只有16bit 最大支援到 2^16 = 65535(64K), 如果要支援超過上限必須將此數值設定為 1,通常預設值為 1

測試環境如下:
iperf01
基本上只要兩台 Linux 機台就可以做網路效能測試,當然兩張網卡速度要一致,並同時將這個程式安裝在 Server 和 Client 上面.

Server

[root@Server ~]# iperf -s -w 256k -l 64k
-——————————
bind failed: Address already in use
————————————————————
Server listening on TCP port 5001
TCP window size: 256 KByte
————————————————————

Server 和 Client 需要用相同的參數才可以跑!
-w n[KM]  指定 TCP window size (2~256KB)
-l n[KM] 指定 read/write buffer 大小(預設為 8k)
-Pn (大寫的P) client 端指定同時 (parallel) 跑幾個的 threads
因為用了  -P4 參數,所以系統一次會建立 4 個連線,所以你在結果會看到 [4] [5] [6] [7] 個別連線跑出來的結果,以及 [SUM] 4 個連線加總得到的結果. 

Client

[root@benjr ~]# iperf -c 192.12.1.2 -t 10 -w 256k -i 5 -l 64k -P4
————————————————————
Client connecting to 192.12.1.2, TCP port 5001
TCP window size: 256 KByte
————————————————————
[ 5] local 192.168.10.10 port 58809 connected with 192.12.1.2 port 5001
[ 3] local 192.168.10.10 port 58808 connected with 192.12.1.2 port 5001
[ 4] local 192.168.10.10 port 58807 connected with 192.12.1.2 port 5001
[ 6] local 192.168.10.10 port 58810 connected with 192.12.1.2 port 5001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 5.0 sec 1.17 GBytes 2.02 Gbits/sec
[ 3] 0.0- 5.0 sec 945 MBytes 1.59 Gbits/sec
[ 4] 0.0- 5.0 sec 1.00 GBytes 1.72 Gbits/sec
[ 6] 0.0- 5.0 sec 982 MBytes 1.65 Gbits/sec
[SUM] 0.0- 5.0 sec 4.06 GBytes 6.97 Gbits/sec
[ 5] 5.0-10.0 sec 1.24 GBytes 2.12 Gbits/sec
[ 5] 0.0-10.0 sec 2.41 GBytes 2.07 Gbits/sec
[ 3] 5.0-10.0 sec 1004 MBytes 1.69 Gbits/sec
[ 3] 0.0-10.0 sec 1.90 GBytes 1.64 Gbits/sec
[ 6] 5.0-10.0 sec 1.00 GBytes 1.72 Gbits/sec
[ 6] 0.0-10.0 sec 1.96 GBytes 1.68 Gbits/sec
[ 4] 5.0-10.0 sec 1015 MBytes 1.70 Gbits/sec
[SUM] 5.0-10.0 sec 4.21 GBytes 7.24 Gbits/sec
[ 4] 0.0-10.0 sec 1.99 GBytes 1.71 Gbits/sec
[SUM] 0.0-10.0 sec 8.27 GBytes 7.10 Gbits/sec

另外在客戶端上可以通過-n 指定傳輸的位元組數,-r , -d 進行雙向傳輸測試

發表迴響