皆さん,こんにちは。
このコラムでは,ネットワークエンジニアとして活躍されている方を対象として,資格試験だけでは得られない実践的な技術テーマについて取り上げていきたいと思いますので,よろしくお願いします。
突然ですが,私の知人が以下のような現象に遭遇しました。なぜ,このようなことが起きるのか,わかりますか?
- FTTHのインターネット接続サービスを使用しており,公衆FTPでスループット測定を行うと85Mbpsくらい出ている。
- しかし,無線LANを使用すると20~30Mbps程度の速度しか出ていなかった。
- そこで今回,新しく802.11n対応の無線LAN内蔵ルータを購入した
- まず,ルータにFTPサーバを直接接続し,無線LANを倍速設定にしてスループットを測定したところ,約100Mbpsくらいでており,「さすがイレブンエヌだぜ」と期待が高まる
- ところが,実際にインターネット(FTTH)に接続すると,60Mbps程度しかでない
このような現象は,TCPの最大ウィンドウサイズが回線の帯域幅に対して小さい場合に発生します。
私たちは,同じPCをさまざまな場所へ持ち歩き,さまざまなネットワークに接続することができますよね?
会社のLANには1Gbpsで接続し,自宅では100MbpsのFTTHを使い,コーヒーショップからは公衆無線LANに接続することもできます。また,同じFTTHを使っていても,時間帯によってネットワークが空いている場合と混雑している場合があります。このように,ネットワークで利用できる帯域幅は,環境や時刻によって激しく変化するのです。
しかし私たちは,PCをネットワークへ接続する際に,いちいち利用可能な帯域幅を調べてWindowsの設定を変えたりする必要はありません。なぜなら,そういったことは,PCの中で自動的に実行する仕組みが備えられているからです。そのメカニズムのひとつが,TCPのウィンドウ制御です。
TCPはOSI階層のレイヤ4に相当するプロトコルであり,ネットワークの混み具合を検知して,一度に送出できるデータの量(ウィンドウサイズ)を自動的に調節します。そして,TCPの標準仕様では,ウィンドウサイズの最大値が64KB(バイト)となっています。つまり,64KBのデータを送ったら,相手からの返事(ACK)が戻ってくるまで次のデータを送ることはできません。
ですから,データを送ってからACKが帰ってくるまでの時間(ラウンドトリップタイム/以下,RTTとする)が仮に1ミリ秒だとすると,1秒間に64KBの情報を1,000回まで送れるということになります。
これを計算すると,
64,000バイト×1,000回=64,000,000バイト
1バイトは8ビットなので,ビットに換算すると
64,000,000バイト×8=512,000,000ビット
1秒間に512,000,000ビットの情報を送れる,つまり512Mbpsが,RTTが1ミリ秒のときの理論上の最大スループットということになります。どんなに高性能なルータを使っても,ウィンドウサイズが64KBでRTTが1ミリ秒であれば,TCPでは512Mbps以上のスループットは絶対に出ないのです。
同じように,RTTの値を変化させたときの最大スループットを計算すると,以下のようになります。
RTT(msec) | 最大スループット(Mbps) |
5 | 102.4 |
6 | 85.3 |
7 | 73.1 |
8 | 64.0 |
9 | 56.9 |
10 | 51.2 |
15 | 34.1 |
20 | 25.6 |
ここでもう一度,冒頭のケースを思い出してください。
公衆FTPサーバとのRTTが6ミリ秒程度であると仮定すると,つじつまが合いそうですね。
つまり,有線LANで接続している場合はRTTが6ミリ秒でスループットが85Mbpsくらいでているが,無線LANを利用することによって2~3ミリ秒程度の遅延が増加したとすれば,最大スループットは60Mbps前後となり,事象と一致します。
また,無線ルータとFTPサーバを直結した場合であれば,(距離が短いから)RTTは非常に小さくなると思われるので,TCPのウィンドウサイズがボトルネックになることなく,802.11nの本来の性能が発揮されます。
このように,FTPやHTTPなど,TCP上で動作するプロトコルを使ってスループット計測を行う場合には,遅延(RTT)の大きさを考慮に入れないと,何を測っているのか分からなくなってしまうので注意が必要です。
次回も,この話の続きをしたいと思います。では。