インターネットの通信速度は、他に接続している人の有無や、
無線の電波状況などで絶えず変化します。
具体的にどのように変化するのかを知りたいと思った時、
通信速度(スループット)の計測を行うのが自然でしょう。
スループット計測の簡単な方法は iperf を使うことです。
この記事では iperf を使ってスループットの時系列計測を行います。
iperf の仕組み
iperf では、2台の端末、サーバーとクライアント間で、
計測用のパケットを送信し、送信できたパケット量を計測することで、
スループットの測定を行います。
クライアントは、パケットをサーバーに向けて送信し、
サーバーをそのパケットを受け取ります。
このように、クライアントとサーバーはそれぞれ別々の働きをするので、
iperfにはサーバーモードとクライアントモードの二つのモードがあり、
起動時にどちらかを選択して起動します。
準備
インストール
linux であれば、
apt-get install iperf
で、iperfをインストールできます。
IPアドレスの確認
iperf ではサーバーのIPアドレスを指定してパケットの送信を行います。
そのため、サーバーとして動かす予定の端末の
IPアドレスを事前に確認しておきましょう。
linux であれば「ifconfig」などを利用して、アドレスを確認できます。
計測実行
サーバーの起動
サーバー側の端末上で、
iperfをサーバーモードとして立ち上げます。
サーバー上の端末で、
iperf -s
を実行すると、サーバーモードでiperfが立ち上がり、
クライアントからの接続を待ち受ける状態になります。
デフォルトではTCPでの接続を待ち受けますが、
UDPで待ち受ける場合は,
iperf -s -u
と"-u"オプションを指定します。
クライアントの起動
サーバーの準備ができたら、クライアントを起動して、
計測を開始します。
クライアント上の端末で、
iperf -c [IPアドレス]
で、[IPアドレス]に指定した端末に向けて通信、測定を開始します。
計測が終了すると結果が出力されます。
デフォルトではTCPでの通信を開始しますが、
UDPで通信する場合は、
iperf -u -c [IPアドレス]
とします。
時系列の測定
iperfのデフォルトでは、一定時間の計測を行った後、
その期間での平均のスループットを計算します。
時間的な変化を追いたい場合には、
この計測を繰り返し行う必要がありますが、
これは、iperf のクライアント側のオプションを指定することで実行できます。
計測間隔と全体の計測時間
iperfの計測時間を変更するオプションには、
以下の二つがあります。
- -i
- -t
上の「-i」は計測の間隔を指定するのもで、
指定された時間毎の平均値を計算して出力します。
もう一つの「-t」の方は、全体での計測時間を指定するもので、
ここで指定された時間が経つと計測が終了されます。
例えば、
iperf -t 100 -i 2 -c [IPアドレス]
とすると、2秒間隔で計算したスループットが出力され、
100秒経った時点で計測が終了します。
そのため、結果としては50回のスループット測定結果が得られることになります。
結果のファイル出力
測定結果は端末上に表示されますが、
グラフを書くなどしたい場合は、
ファイルに出力した方が便利でしょう。
「-yc」オプションを付けることで、
CSV形式で結果を出力してくれるので、
Excelなどの表計算ソフトで扱いやすくなります。
ローカルでの計測
それでは実際に計測してみましょう。
パソコンを2台用意して、LAN内で接続します。
今回は、デスクトップを有線でルーターに接続し、
ノートパソコンを無線で接続して、
デスクトップをサーバー、ノートパソコンをクライアントとしました。
CSVに出力して、Excelで開けばすぐにグラフを書くことができます。
下のグラフは、1秒間隔で100秒間スループットを計測した時の、
時系列を表しています。
青色はTCPのスループットで、
オレンジ色はUDPのスループットを表しています。
無線を挟んでいるからなのか、
スループットが上下している様子が見られます。
また、TCPの方がスループットの揺れが大きいようにも見えます。
パブリックサーバを利用した計測
パソコン二台もないんだけどという人もご安心下さい、
iperf をサーバーモードで待ち受けてくれているものがあるので、
クライアントさえあれば、iperfを試してみることができます。
下のサイトに乗っているリストには、
iperfのサーバーが公開されています。
「サーバー名」を[IPアドレス]の代わりに指定すれば、
そのサーバーに向かって通信を行うことができます。
それでは、この公開されているサーバーの一つである、
アメリカのサーバへパケットを送った時の
スループットの時系列を見てみましょう。
下の図は、Wifi で接続している
ノートパソコンをクライアントにした時の計測結果です。
クライアント側の状況は、上のLAN内での通信同じ状況にしていますが、
スループットが180Mbps→18Mbpsと一桁落ちています。
広域のインターネットにでることで、
他の通信などとの兼ね合いからスループットが下がっているように見えます。
スループットが安定しているように見えるのも、
ボトルネックが無線ではなく、インターネット上のリンクに移ったためだと思われます。
上は、ノートパソコンからの接続でしたが、
有線接続したデスクトップから計測すると違うのでしょうか。
下のグラフは、デスクトップをクライアントにして計測した時の結果です。
まず、スループットの桁が大きく違うことが分かります。
またTCPが独特の変化をしています。
TCPは、通信に成功すれば流す量を増やし、
通信に失敗すれば流す量を減らすことで、
ネットワークの混雑を避けようとします。
そのため、ぎざぎざの波形が見えることになります。
さて、デスクトップとノートパソコンのTCPでここまで動作に違いが出るのはなぜでしょうか。
これは、どうやらOSの違いによるもののようです。
今回使ったデスクトップのOSはUbuntuでしたが、
ノートパソコンのOSはWindowsです。
それぞれのOSではCubic TCPとCompound TCPと呼ばれる
異なるタイプのTCPが搭載されていて、
OSが異なると、TCPの振る舞いが変わる可能性があります。