【初学者向け】「Ping」でパケットの「サイズ」をこっそり測ってみよう!~Path MTU Discoveryの裏側~
皆さん、こんにちは!データセンターの現場で日々奮闘している、NOCシニアエンジニアの〇〇です。このブログでは、普段皆さんが触れているネットワークの裏側で、一体何が起きているのか、現場のリアルな体験談も交えながら、分かりやすく紐解いていきます。
さて、今回はネットワークの基本中の基本、pingコマンドのお話です。でも、ただ「相手に届くか」を試すだけじゃないんです。「パケットのサイズ」を測る、ちょっと応用的な使い方に焦点を当ててみましょう。特に、ネットワーク初心者の方には「なんだか難しそう…」と感じるかもしれませんが、大丈夫!郵便配達の例え話を使いながら、一歩ずつ理解を深めていきましょうね。
そもそも「パケット」って何?
まず、ネットワークでやり取りされるデータは「パケット」という小さな塊に分けられて送られます。これは、まるで大きな荷物を、いくつかに小分けにして送るようなイメージです。
例えば、あなたが友達に大きな段ボール箱でプレゼントを送るとします。でも、もしその段ボール箱が郵便局の規定サイズを超えていたら、そのままでは送れませんよね?その場合、プレゼントをいくつか小さな箱に分けて、それぞれに宛名と住所を書いて送る必要があります。ネットワークのパケットも、これと似たようなことをしているんです。
「MTU」って、郵便局の「箱のサイズ」みたいなもの?
ここで出てくるのが「MTU(Maximum Transmission Unit)」という言葉です。これは、ネットワークの各区間(例えば、あなたのパソコンとルーターの間、ルーターとルーターの間など)で、一度に送れるパケットの「最大サイズ」のこと。まさに、郵便局の「箱のサイズ」制限みたいなものですね。
もし、送りたいパケットが、ある区間のMTUサイズを超えてしまうと、そのパケットは「断片化」といって、いくつかに分割されて送られるか、あるいは途中で「送れません!」とエラーになってしまいます。
「Don’t Fragment」ビットって、配達員さんへの「これ、絶対割らないでね!」っていうお願い?
ここで、今日の主役であるpingコマンドのちょっとした秘密兵器が登場します。それは、pingコマンドでパケットを送る際に、「DFフラグ」または「Don’t Fragment」ビットというものを立てることができるんです。
これは、例えるなら、郵便配達員さんに「この荷物は、絶対に割ったり、途中で開けたりしないで、そのまま届けてくださいね!」とお願いするようなもの。このDFフラグが立っていると、パケットは途中で断片化されずに、そのままのサイズで目的地まで送られることになります。
もし、DFフラグが立ったパケットが、ある区間のMTUサイズを超えてしまったらどうなるでしょうか?そう、その区間では「このサイズの荷物は通せないよ!」というメッセージ(ICMPのエラーメッセージ)が返ってきて、パケットはそこでストップしてしまうんです。
pingで「実効MTU」を測ってみよう!
この「DFフラグが立ったパケットが、どこで断片化されずに通れるか」を調べることで、ネットワーク上の「実効MTU」つまり、実際にパケットが通れる最大サイズを知ることができるんです。これが、今回ご紹介する「Path MTU Discovery(パスMTUディスカバリー)」という技術の基本的な考え方になります。
なぜ、こんなことを知る必要があるかというと、例えば、VPN接続をしている時や、特定のクラウドサービスにアクセスする時など、ネットワークの経路が普段と違う場合に、パケットがうまく送れなくなることがあります。これは、経路上のどこかでMTUサイズが小さくなっているのに、送りたいパケットが大きすぎるために起こるんですね。
これを調べるのに、pingコマンドはとっても便利なんです!
具体的なコマンドを見てみよう!
LinuxやmacOSの場合、pingコマンドにオプションを付けて、パケットサイズとDFフラグを指定します。Windowsの場合は、pingコマンドのオプションが少し異なります。
Linux/macOSでの例:
まず、デフォルトのpingで相手に届くか確認します。
ping example.com
次に、DFフラグを立てて、パケットサイズを徐々に大きくしながら試してみましょう。
【重要】pingコマンドのオプション:
-c <回数>: 送信するパケットの回数を指定します。ここでは1回だけ送ってみます。-s <サイズ>: 送信するパケットのデータ部分のサイズを指定します。注意点として、このサイズにIPヘッダ(20バイト)とICMPヘッダ(8バイト)のサイズが加算されたものが、実際にネットワークを流れるパケットのサイズになります。-M do: DFフラグ(Don’t Fragment)を立てるオプションです。 これが今回のポイント!
それでは、実際にパケットサイズを小さく設定して、DFフラグを立ててpingを打ってみましょう。
# まずは小さめのパケットサイズ(例: 1400バイト)で試す
# 実際のパケットサイズは 1400(データ) + 20(IPヘッダ) + 8(ICMPヘッダ) = 1428バイト
ping -c 1 -s 1400 -M do example.com
もし、このpingが成功するなら、そのサイズ(この例では1428バイト)のパケットは、その経路を通れるということです。
次に、さらに大きなパケットサイズで試してみます。
# 次は大きめのパケットサイズ(例: 1500バイト)で試す
# 実際のパケットサイズは 1500(データ) + 20(IPヘッダ) + 8(ICMPヘッダ) = 1528バイト
ping -c 1 -s 1500 -M do example.com
もし、このpingが「Packet too big」というメッセージとともに失敗したとします。これは、1500バイトのデータ部分では大きすぎて、途中のどこかのMTUサイズを超えてしまったことを意味します。
この場合、成功したパケットサイズ(1400バイト)と失敗したパケットサイズ(1500バイト)の間で、さらに細かくサイズを調整して、成功するギリギリのサイズを探していきます。
例えば、1450バイトで試してみて、成功したら1470バイト、失敗したら1460バイト…というように、二分探索のようなイメージで、成功する最大サイズを見つけ出します。
最終的に、成功する最大パケットサイズ(データ部分)が分かったら、それにIPヘッダ(20バイト)とICMPヘッダ(8バイト)を加えたものが、その経路の「実効MTU」となります。
Windowsでの例:
Windowsでは、pingコマンドのオプションが異なります。
-f: DFフラグ(Don’t Fragment)を立てるオプションです。-l <サイズ>: 送信するパケットのデータ部分のサイズを指定します。
# まずは小さめのパケットサイズ(例: 1400バイト)で試す
# 実際のパケットサイズは 1400(データ) + 20(IPヘッダ) + 8(ICMPヘッダ) = 1428バイト
ping -f -l 1400 example.com
もし、これが成功したら、さらに大きなサイズで試します。
# 次は大きめのパケットサイズ(例: 1472バイト)で試す
# 実際のパケットサイズは 1472(データ) + 20(IPヘッダ) + 8(ICMPヘッダ) = 1500バイト
ping -f -l 1472 example.com
もし、これが「Packet needs to be fragmented but DF set.」のようなメッセージで失敗した場合は、サイズを小さくして再度試します。
【重要】実際のパケットサイズについて
ここで、pingコマンドの-s(Linux/macOS)や-l(Windows)で指定するサイズは、あくまでパケットの「データ部分」のサイズです。実際にネットワーク上を流れるパケットのサイズは、これにIPヘッダ(通常20バイト)とICMPヘッダ(8バイト)が加算されたものになります。
例えば、Linux/macOSで-s 1400と指定した場合、実際のパケットサイズは 1400 + 20 + 8 = 1428 バイトとなります。
Windowsで-l 1400と指定した場合も、同様に 1400 + 20 + 8 = 1428 バイトです。
一般的に、イーサネットのMTUサイズは1500バイトと言われています。これは、IPヘッダとICMPヘッダを含めた最大サイズが1500バイトまで、という意味です。そのため、データ部分の最大サイズは 1500 - 20 - 8 = 1472 バイトとなります。
エッジケースと注意点:現場の「あるある」
さて、ここまで「DFフラグを立てたping」でMTUを探る方法を見てきましたが、現場ではそう簡単にはいかないこともあります。いくつか「あるある」とその理由を共有しましょう。
- ICMPパケット自体がブロックされている場合:
そもそも、ネットワークによっては、セキュリティ上の理由からICMPパケット(pingの通信に使われるもの)自体がファイアウォールでブロックされていることがあります。その場合、どんなに正しいパケットサイズでpingを打っても、「タイムアウト」になったり、「Destination Unreachable」といったエラーになったりします。この場合は、ping以外の手段(例えばtracerouteで経由するルーターを確認したり、TCPベースのツールを使ったり)を検討する必要があります。
- 「Packet too big」以外のエラー:
「Packet too big」以外にも、「Destination Unreachable」のようなエラーが返ってくることがあります。これは、パケットが途中のルーターで破棄されたことを示唆していますが、必ずしもMTUサイズが原因とは限りません。ルーターの設定や、他のネットワーク障害の可能性も考えられます。
- ルーターによってはDFフラグを無視する場合も:
稀ですが、一部の古いルーターや特殊な設定がされているルーターでは、DFフラグを正しく扱ってくれず、意図せずパケットを断片化してしまうことがあります。この場合、pingの結果が正確でない可能性も考慮が必要です。
- MTU値は経路によって異なる:
ネットワークの経路は一つではありません。インターネット上では、常に最適な経路が選択されます。そのため、ある時に調べたMTU値が、別の時に同じ宛先へpingを打った時に、異なる結果になることも珍しくありません。
まとめ:Pingは「サイズ」も測れる万能選手!
いかがでしたでしょうか?普段何気なく使っているpingコマンドですが、DFフラグをうまく使うことで、ネットワークの「実効MTU」という、パケットが通れる「箱のサイズ」を推測することができるんです。
これは、ネットワークのトラブルシューティングにおいて、特にVPN接続や特定アプリケーションの通信障害が起きた時に、原因究明の大きな手がかりになります。
最初は少し戸惑うかもしれませんが、「郵便配達員さんに、割れないように、そのまま届けてほしい!」というお願いをパケットに込めるイメージで、ぜひ一度試してみてください。現場で役立つ知識は、こういった基本的なコマンドの応用から生まれることが多いんですよ!
次回も、現場で役立つネットワークの「あるある」や、トラブルシューティングのコツを、分かりやすくお伝えしていきますので、お楽しみに!
コメント