こんにちは、酸素です。
先日、とあるネットワークでトラブルシューティングをする際、
MTUの値を調べるためにpingコマンドの送信データサイズを指定するオプションを利用しました。
chatGPT先生に教えてもらいましたが、その時は「ほえ~こんなのあるんだ~」程度の認識でしたが、時間が取れたので改めて調べて、まとめてみようと思います。
なお、本記事ではwindows環境でのpingコマンドについてまとめております。
macやlinuxでも同様のことはできるようですが、細かい実装の違いなどは調べておりませんので、ご了承ください。
送信データのサイズを指定する
本題のpingコマンドのオプションですが、下記のように指定します
ping -f -l (データサイズ) (宛先)
各オプションの概要は以下の通りです。
| オプション | 役割 |
| -f | DFフラグを立てる際に指定。 MTU値を調べる際などはパケットを分割させてくないので、このオプションを使用する MTU値を超えたサイズのパケットが送られた際は、そのパケットは破棄されます(=通信経路内の最小のMTU値を求められる) |
| -l | pingで送信するICMPパケットのデータ部分のサイズを指定する 単位はバイト |
なお、気を付ける点としては、
-lで指定するサイズはICMPパケットのデータ部分のみとなります。
ですので、 実際に送信するデータにはIPヘッダーやICMPヘッダーも別途加わります。
例えば1500バイトのパケットが通るか確かめるとき、
-lオプションで1500と指定しまうと、実際のパケットサイズは
1500 + IPヘッダー(20) + ICMPヘッダー(8) の合計となります。
つまり、ICMPのデータ部分以外で計28バイト加わるため、-lオプションで指定する場合は1472バイトと指定する必要があります。
パケットキャプチャで確かめる
実際にwiresharkを使って確かめてみます
キャプチャを開始した状態で、下記のコマンドを実行します
ping -f -l 32 8.8.8.8

パケットキャプチャをした結果は上記となります。
オプションで指定した通り、DFフラグが立ち、データ部分のサイズも32バイトとなっていることが確認できました。
まとめ
学生時代の授業や入社時の技術研修などでは、MTU周りのトラブルの話などをたくさん聞いてきましたが、実際に経験してみると今回のようなコマンドのオプションからプロトコルの仕様等得られるものがたくさんありました。
皆様もIPヘッダーやICMPヘッダーのサイズには気を付けて、活用してみてください!

