ネットワーク測定ツールiperfの使い方

# ストリームでベンチマークしよう！
ネットワークの帯域を計測する場合、非常に便利なツールです。
UNIX系ではnetperfが有名かと思いますが、UDPの計測に関してはIperfの方が使いやすいと思います。
AWSなどでストリーミングサーバーを立ち上げた場合のトラフィックチェックなどにも使うことができます。
WindowsやLinuxなど各種OSで使用できます。

# ダウンロード
[NLANR/DAST : Iperf - The TCP/UDP Bandwidth Measurement Tool](http://sourceforge.net/projects/iperf)

## MacOS
```
brew install iperf
```

# CentOS
```
sudo yum install iperf
```

# debian/ubuntu
```
apt-get install iperf
```

# 使い方
下記に、コマンドの使い方を記しておきます。

## ユニキャストモード
### TCPの場合
#### サーバー
```
$ iperf -s
```

#### クライアント
```
$ iperf -c <受信側ホスト名> または <受信側IPアドレス>
```

#### 例1)TCP通信での最大レートを測定する。Netperfでの測定とほぼ同様。
```
 $ iperf -c 192.168.1.100
```

#### 例2)100MbyteのデータをTCPで送信する場合
```
$ iperf -c <dest addr> -l 100M
```

### UDPの場合
####サーバ
```
$ iperf -s -u
```

####クライアント
```
$ iperf -c 192.168.1.100 -u -b <送信帯域> -t <計測時間[sec]> -i <インターバル>
```

#### 例1)192.168.1.100へ向けUDPで10Mのストリームを60秒間送信する。レポートの間隔は2秒おき。
```
$ iperf -c 192.168.1.100 -u -b 10M -t 60 -i 2 
```

#### 例2)192.168.1.100との間でUDPで10Mのストリームを双方向で60秒間送信する。
```
$ iperf -c 192.168.1.100 -u -b 10M -t 60 -i 2 -d
```

#### 例3)双方向モードでの測定。192.168.1.100へ向け3本の10MのUDPストリームを60秒間送信する。
```
$ iperf -c 192.168.1.100 -u -b 10M -t 60 -i 2 -P 3
```

### マルチキャストモード

#### サーバ
```
    $ iperf -s -u -B <マルチキャストアドレス> -i <結果表示インターバル> 
```
```
ex.) $ iperf -s -u -B 224.0.55.55 -i 1
```

####クライアント
```
    $ iperf -c <マルチキャストアドレス> -u -T <TTL> -t <計測時間[sec]> -i <インターバル> -b <送信帯域> 
```
```
ex.) $ iperf -c 224.0.55.55 -u -T 32 -t 10 -i 1 -b 1M
```


### IPv6モード

#### サーバ
```
    $ iperf -s -V 
```

#### クライアント
```
    $ iperf -c <Server IPv6 Address> -V 
```

## 結果の見方
### サーバー側
```
node2> iperf -s -u -i 1 
------------------------------------------------------------ 
Server listening on UDP port 5001 Receiving 1470 byte datagrams 
UDP buffer size: 60.0 KByte (default) 
------------------------------------------------------------ 
[ 4] local <IP Addr node2> port 5001 connected with <IP Addr node1> port 9726 
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams 
[ 4] 0.0- 1.0 sec 1.3 MBytes 10.0 Mbits/sec 0.209 ms 1/ 894 (0.11%) 
[ 4] 1.0- 2.0 sec 1.3 MBytes 10.0 Mbits/sec 0.221 ms 0/ 892 (0%) ←中間レポート
[ 4] 2.0- 3.0 sec 1.3 MBytes 10.0 Mbits/sec 0.277 ms 0/ 892 (0%) 
[ 4] 3.0- 4.0 sec 1.3 MBytes 10.0 Mbits/sec 0.359 ms 0/ 893 (0%) 
[ 4] 4.0- 5.0 sec 1.3 MBytes 10.0 Mbits/sec 0.251 ms 0/ 892 (0%) 
[ 4] 5.0- 6.0 sec 1.3 MBytes 10.0 Mbits/sec 0.215 ms 0/ 892 (0%) 
[ 4] 6.0- 7.0 sec 1.3 MBytes 10.0 Mbits/sec 0.325 ms 0/ 892 (0%) 
[ 4] 7.0- 8.0 sec 1.3 MBytes 10.0 Mbits/sec 0.254 ms 0/ 892 (0%) 
[ 4] 8.0- 9.0 sec 1.3 MBytes 10.0 Mbits/sec 0.282 ms 0/ 892 (0%) 
[ 4] 0.0-10.0 sec 12.5 MBytes 10.0 Mbits/sec 0.243 ms 1/ 8922 (0.011%) ←最終レポート
左から、測定時間,l受信データ量,bps,片方向遅延,パケット損失数/パケット受信数（パケット損失率）
```

### クライアント側
```
node1> iperf -c node2 -u -b 10m 

------------------------------------------------------------ 

Client connecting to node2, UDP port 5001 Sending 1470 byte datagrams 
UDP buffer size: 60.0 KByte (default) 

------------------------------------------------------------ 

[ 3] local <IP Addr node1> port 9726 connected with <IP Addr node2> port 5001 
[ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 12.5 MBytes 10.0 Mbits/sec 
[ 3] Sent 8922 datagrams 
```

##オプション
|オプション|意味|
|:-----------|------------:|
|-s|サーバモードでの起動|
|-c <server addr>	|クライアントモードでの起動|
|-B <bind addr>	|指定したマルチキャストグループにJOINする，マルチキャストの場合にのみ使用する|
|-u|	UDP送信(-bオプションの場合は省略可)|
|-b <num>[KM]|	帯域指定(default 1Mbps)UDPのみ|
|-T <num>|	TTL|
|-t <sec>|	測定時間|
|-i <sec>|	レポート表示間隔|
|-l <byte>| パケットサイズ|
|-d|送受信モード|

## GUI
Iperfのフロントエンドでjperfというものもあります。
http://dast.nlanr.net/projects/jperf/
慣れないうちはこれを使うと設定などやりやすいかもしれません。
Windowsで使う場合は、jperfのオーバーヘッドにより高レートではパケットロスが発生しました。
正確な測定が要される場合は、要注意です。（Linuxで使用した場合はこの問題はおきませんでした）