pingでネットワークの速度を調査する:Tech TIPS
ネットワークの速度を大ざっぱに測定するには、pingコマンドを利用するとよい。pingはTCP/IPの基本ツールであり、どこでも利用できる可能性が高い。ただし誤差を少なくするためには、データサイズを大きくして測定するなどの注意が必要である。
対象OS:Windows XP/Windows 7/Windows 8/Windows 8.1/Windows Server 2003/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2
解説
ネットワークの速度(ここでは単に、単位時間当たりの最大転送量の意味とする)を測定するにはさまざまな方法があり、本TIPSでも右上の関連記事のような方法を紹介してきた。これ以外にも、ファイルをコピーしてその所要時間から速度を割り出したり、ルーターなどのネットワーク機器が備えるパフォーマンスカウンター値をモニターしたりするなどの方法もある。
だがこれらの方法は、あらかじめ相手側のサーバー上で何らかのサービスを動かしておいたり、ツールを準備しておくなどの必要があり、いつでもどこでも利用できるという方法ではない。厳密なパフォーマンスを測定するのならば、そのような方法でもよいだろうが、単にネットワーク回線がつながっているかどうかを調べたい場合や、その回線が混雑しているかどうかを大まかに知りたいだけならば、もっと簡単な方法がある。pingコマンドを利用する方法である。
pingコマンドは、ICMPのEchoプロトコルを使った、IPパケットの到達可能性を調査するコマンドであり、TCP/IPにおける最も基本的なツールの1つである(pingの基本的な使い方については関連記事参照)。これを使うことにより、大ざっぱではあるが、ネットワークの速度(帯域)を調べることも可能である。本TIPSでは、その方法について解説する。
操作方法
●どうしてネットワークの速度をpingで測定できるのか?
pingコマンドを実行すると、ICMPのEcho要求パケットが指定されたIPアドレスに送信され、通常はそのICMPパケットがそのまま相手から返送されてくる。それと同時に、パケットを送信してから返ってくるまでの所要時間が表示される。ICMPやEchoパケットの詳細については、右上の関連記事を参照していただきたい。
Windows OSのデフォルトでは、pingで送信される「データサイズ」は32bytesである。ただしこれは、ICMP Echoのデータ部として渡される部分だけであり、実際に送信されるパケットでは、それに加えて、ICMP Echoヘッダーが8bytes、IPヘッダーが20bytes追加される。さらに下位のデータリンク層/物理層のヘッダーなども加算されるので(例:イーサネットならヘッダーが14bytes、PPPoEなら数十bytes)、もっと長くなる。
つまりpingを1回実行すると、これだけのサイズのパケットが往復することになるので、それと所要時間からおおよそのネットワークの速度を計算できる。ヘッダーやIPフラグメント化(元は1つだったIPパケットが複数に分断されること。右上の関連記事参照)のオーバーヘッドなどを全て無視すると、次のようになる。
帯域≒(データ・サイズ×2)÷所要時間 [bytes/s]
ただし実際には、途中のルーターでのオーバーヘッドがあるし(受信したパケットを待ち時間0ですぐに次へフォワードしているわけではない)、pingに応答するコンピューターもすぐにパケットを送り返してくるわけではないので(待ち時間0で応答するわけではない)、この値には誤差が含まれる。またパケットサイズが小さいと、他の通信トラフィックなどの影響を大きく受けるので、正確な値にはならない。
だがそのことを理解して利用すれば、十分意味のあるデータを収集できる(ただし当該ホストがpingに応答するように設定されていなければならない)。場合によっては(他の方法と比べると)1〜2割程度の誤差でネットワーク帯域を調査できる。
●測定誤差をなるべく小さくする方法
pingは最も基本的なツールであり、いつでもどこでも利用しやすいため、他の方法を試す前に、まずこの方法で概要を調査するとよいだろう。ただし誤差の入り込む余地が多いため、精度を上げるにはなるべくテストで使用するデータサイズ(pingの-lオプションで指定する値)を大きくするといった注意が必要である。
Windows OSのpingコマンドでは、応答時間は1ms単位でしか表示されないし、1ms以下だと「時間 <1ms」(もしくは「time<1ms」)としか表示されない。これでは正確な値は計算できない。経験的には、最低でも10ms、可能ならば数十ms以上になるように、データサイズを大きくするのが望ましい。
また、デフォルトのデータサイズでは、データ部分のサイズに対してヘッダー部分のサイズが大きく、誤差が入りやすい(ヘッダー部分はネットワークの媒体に依存して変わるため)。ヘッダー部分の相対的なサイズを下げるため、例えば5Kbytesとか10Kbytes、可能ならば(pingコマンドで指定できる最大サイズに近い)60Kbytesなどに設定するとよいだろう。
ただし場合によっては(セキュリティなどのために)フラグメント化したIPパケットの通信が禁止されている場合があるので、その場合はフラグメントを起こさない最大サイズに近い1400bytes程度にするのがよい。
●pingの応答がない場合の対処方法
最近ではpingを用いた攻撃に対する防御のため、pingに応答しないサーバーやネットワーク機器もよく見かける。しかし、自分で管理している機器なら対処方法はある。
例えばWindows PCの場合、何も設定していない状態でpingを送信しても、応答がなくタイムアウトのエラーが発生することがある。多くの場合、これはWindowsファイアウォールでpingの応答が禁止されているせいである。これを許可するには、Windowsファイアウォールの「ファイルとプリンターの共有 (エコー要求 - ICMPv? 受信)」という受信規則を有効化する必要がある。詳細は次のTIPSを参照していただきたい。
Windows 7以降のWindows OSでも、おおよそ同じ手順でpingの応答を許可できる。
●pingで実際に速度を調べてみる
以下は、インターネット上のあるサイトに向けてpingを実行した場合の例である。
C:\>ping -l 60000 www.example.co.jp
www.example.co.jp [aaa.bbb.ccc.ddd]に ping を送信しています 60000 バイトのデータ:
aaa.bbb.ccc.ddd からの応答: バイト数 =60000 時間 =56ms TTL=46
aaa.bbb.ccc.ddd からの応答: バイト数 =60000 時間 =54ms TTL=46
aaa.bbb.ccc.ddd からの応答: バイト数 =60000 時間 =51ms TTL=46
aaa.bbb.ccc.ddd からの応答: バイト数 =60000 時間 =53ms TTL=46
aaa.bbb.ccc.ddd の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 51ms、最大 = 56ms、平均 = 53ms
サイズ60000bytesのパケットを送信し、平均応答時間は53msであった。これから計算されるネットワークの帯域はだいたい次のようになる(ヘッダー部分などは無視している)。
帯域≒(60000×2)÷0.053≒2.2[Mbytes/s]
(注:このテストで使用した回線上でより正確なテストをしたところ、約3Mbytes/s程度の速度が出ていた。ルーターなどでのオーバーヘッドの他に、高度なフロー制御を持つTCPと、何も制御されていないIPやICMPプロトコルの差なども影響していると考えられる)
同様のテストを、ローカルのLAN上のコンピューターに対しても行ってみると、次のようになった。
C:\>ping -l 60000 192.168.2.51
192.168.2.51 に ping を送信しています 60000 バイトのデータ:
192.168.2.51 からの応答: バイト数 =60000 時間 =11ms TTL=128
192.168.2.51 からの応答: バイト数 =60000 時間 =11ms TTL=128
192.168.2.51 からの応答: バイト数 =60000 時間 =11ms TTL=128
192.168.2.51 からの応答: バイト数 =60000 時間 =11ms TTL=128
192.168.2.51 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 11ms、最大 = 11ms、平均 = 11ms
この場合は次のようになる。
帯域≒(60000×2)÷0.011≒10.4[Mbytes/s]
(注:FTPで測定した結果は11.2Mbytes/s程度だった)
このような値を日常的に収集しておき、ネットワークにトラブルが発生した場合や、混雑していると思われるときに収集したデータと比較することにより、トラブルシューティングの助けとすることができる。
ただし、回線が(あまりにも)高速だと、別の要因(テストに使用する機器のパフォーマンス不足や、TCPのような高度なフロー制御機能の不足など)により、大きく値がずれることがあるので、注意していただきたい。どちらかというと、イーサネットなどの有線LAN回線ではなく、無線LANやWAN、インターネット接続回線における速度測定に向く方法だといえる。
■関連記事(Windows Server Insider)
- ftpでネットワークの速度を測定する(TIPS)
- ttcpでネットワーク・パフォーマンスを測定する(TIPS)
- TCP/IPプロトコルを支えるICMPメッセージ(TCP/IP連載)
■更新履歴
【2014/10/03】Windows 7以降のWindows OSの情報を反映しました。
【2005/11/26】初版公開(対象はWindows 2000/Windows XP/Windows Server 2003)。
■この記事と関連性の高い別の記事
- Windowsのpingコマンドでネットワークトラブルの原因を調査する(TIPS)
- pingを繰り返し実行させる(TIPS)
- pingのタイムスタンプ・オプションで進行状況を確認する(TIPS)
- Windows XPのファイアウォール機能を活用する(1)(TIPS)
- pingでMTUサイズを調査する(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.