pingでネットワークの速度を調査するTech TIPS

ネットワークの速度を大ざっぱに測定するには、pingコマンドを利用するとよい。pingはTCP/IPの基本ツールであり、どこでも利用できる可能性が高い。ただし誤差を少なくするためには、データサイズを大きくして測定するなどの注意が必要である。

» 2014年10月03日 05時00分 公開
[打越浩幸, 島田広道デジタルアドバンテージ]
Tech TIPS
Windows Server Insider


「Tech TIPS」のインデックス

連載目次

対象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で測定できるのか?

Windows Server Insiderの関連記事 TCP/IP連載「ICMPメッセージ

 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、インターネット接続回線における速度測定に向く方法だといえる。

■更新履歴

【2014/10/03】Windows 7以降のWindows OSの情報を反映しました。

【2005/11/26】初版公開(対象はWindows 2000/Windows XP/Windows Server 2003)。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。