しがないITマンのブログ

ITに関することをパラパラと書きます。

pingでインターネット速度を計測する

ご挨拶

Markdownでブログが書きたいなあということではてなブログ始めました。
都内で働くしがないシステムエンジニアです。
自己紹介記事を書いたほうがいいのかもしれませんが、それはまた改めて。

ネットワーク速度を測りたい

突然ですが、最近引っ越しました。
引っ越し先はインターネット回線が備え付いてあり、自分で回線工事やプロバイダ契約などする必要はないとのことでした。備え付けのものを利用するなら使用料金もかからないらしいので、ありがたく使わせてもらっています。
ただ気になるのは通信速度です。備え付きの回線業者名を聞いたところ、はじめて聞くような名前でした。YouTubeNETFLIXが止まる&画質が悪いと困ります。
そこで回線速度を観測することにしました。

pingで測る

さてまずはデータをどうやって取るか。
2秒くらい悩んで、pingコマンドで取ればいいなと考えました。他にもFTPやらで測る方法もあるでしょうし、そもそも速度を測定するための便利なライブラリがネットに転がっているでしょうが、せっかくだし自分でやってみます。
例えばyahoo.co.jpにpingを打ってみるとこうなります。

$ ping -s 1024 -c 5 yahoo.co.jp
PING yahoo.co.jp (182.22.59.229) 1024(1052) bytes of data.
1032 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=1 ttl=51 time=100 ms
1032 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=2 ttl=51 time=33.7 ms
1032 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=3 ttl=51 time=33.7 ms
1032 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=4 ttl=51 time=38.3 ms
1032 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=5 ttl=51 time=31.6 ms

--- yahoo.co.jp ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 31.604/47.578/100.347/26.477 ms

1キロバイトのデータを5回送り、最後にまとめが表示されます。rtt(ラウンドトリップタイム)というのはデータを送ってから返ってくるまでの時間のことであり、ここのavgつまり平均値を参考とするのが良さそうです。

pingの注意点その1

1回ずつの結果を見てみると、1032バイトのデータが送信先から返ってきているようです。ここを気をつけなくてはならなくて、試しに送信先google.co.jpに替えてみます。

$ ping -s 1024 -c 5 google.co.jp
PING google.co.jp (172.217.26.3) 1024(1052) bytes of data.
72 bytes from nrt20s02-in-f3.1e100.net (172.217.26.3): icmp_seq=1 ttl=53 (truncated)
72 bytes from nrt20s02-in-f3.1e100.net (172.217.26.3): icmp_seq=2 ttl=53 (truncated)
72 bytes from nrt20s02-in-f3.1e100.net (172.217.26.3): icmp_seq=3 ttl=53 (truncated)
72 bytes from nrt20s02-in-f3.1e100.net (172.217.26.3): icmp_seq=4 ttl=53 (truncated)
72 bytes from nrt20s02-in-f3.1e100.net (172.217.26.3): icmp_seq=5 ttl=53 (truncated)

--- google.co.jp ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 14.866/17.136/23.417/3.170 ms

送信するデータのサイズは1024と変えていません。ところが、返ってくるデータは72バイトになっています。調べていませんが、ICMPのサーバ側の設定によっては送ったのと同じだけのデータ量を返すとは限らないようです。測定した時間から通信速度を計算するときには要注意です。

pingの注意点その2

pingで送信できるデータサイズの最大値ってどれくらいでしょう。私の手元では60kb程度でした。
ところが送ったpingが返ってくるかは、これもサーバ側の設定次第のようです。試しに先ほどと同じ送信先google.co.jpに大きなpingを打ってみましょう。

$ ping -s 2048 -c 5 google.co.jp
PING google.co.jp (172.217.26.3) 2048(2076) bytes of data.

--- google.co.jp ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4088ms

はい。サーバ側の制限値を超えると返してくれなくなるようです。十分なデータサイズで計測したい場合には、寛大なサーバを探す自分でサーバを建てるべきです。

Mbpsを計算する

さてサーバ側の設定に気を付けつつrttを測れば、そこから通信速度を表す一般的な指標であるMbpsを計算するのは難しくありません。「(送信サイズ+受信サイズ) / rtt」でいいですね。あとは単位に気をつけて(自戒)。
ところで、送信するデータのサイズはどれくらいが適当なのか。サイズを変えたときにMbpsがどのように変わるのか、実験してみました。
データサイズとMbpsの関係
そうですね。パケットにはヘッダが付きますので、オーバーヘッドが存在するようです。
ではどの程度のデータサイズで測るべきかと言われると、正直よくわかりません。普段の通信を模したデータサイズであるべきでしょうが、普段どれくらいのデータサイズで通信しているのでしょう。ブログを漁ることもありますし動画を観ることもあります。
よくわからんですが、Mbpsの変動が相対的に落ち着きはじめる50kbくらいの結果を参考にしておきましょう。

次回

これでネットワーク速度を測ることはできるようになりました。しかし、「なんだかネットが重い」と感じたときにリアルタイムの計測値を確認したいですし、過去の計測値も後から見てみたいです。つまり24時間観測したい。
次回は計測値を記録していく仕組みを作ります。おいしそうな名前のあのコンピュータを使いましょう。まさか普段遣いのノートPCを24時間つけっぱなしにしておくわけにはいかないですし。

ここまで読んでくださりありがとうございました。次回も見てくださると幸いです。