Lesson2では,ICMPでやりとりするメッセージを取り上げる。まず,ICMPメッセージを運ぶIPパケットの中身をのぞき,続いてICMPのメッセージを運ぶパケットの構造とメッセージの種類を紹介する。

IPパケットのデータ部分に入る

 最初は,ICMPメッセージのフォーマットを押さえよう。

 ICMPでは,エラーの内容や通信状態を知らせる情報をメッセージに書き込み,そのメッセージをIPパケットで運ぶ。つまり,IPパケットのデータ部分にICMPメッセージが書き込まれる。IPパケットという小包の中にICMPのメッセージが入っているイメージだ。

 IPパケットをもっと詳しく見てみよう(図2-1の上)。IPパケットのあて先や送信元,パケットの情報が書き込まれているヘッダー部分は,通常のIPパケットと同じである。ICMPメッセージを送る場合,IPヘッダーのプロトコル番号という部分は「1」になる。このほかに,ICMPのやりとりで重要になる要素としてTTLがある。TTLは,そのパケットがいくつのルーターを通過できるかを示すパラメータだ。ICMPを実装したtracerouteコマンドは,このTTLを活用したものなので覚えておこう(詳しくはLesson3を参照)。

図2-1●ICMPパケットの構造とメッセージの内容
図2-1●ICMPパケットの構造とメッセージの内容
ICMPメッセージはIPパケットのデータ部分に入れられてやりとりされる。メッセージはタイプ,コード,チェックサム,データで構成されており,タイプとコードを組み合わせてメッセージの内容を伝える。
[画像のクリックで拡大表示]

 次に,ICMPメッセージが書かれているIPパケットのデータ部分に目を向けよう。ICMPメッセージは,(1)タイプ,(2)コード,(3)チェックサム,(4)データ──の四つで構成されている。この中で重要なのは,タイプとコードだ。ICMPではタイプとコードの値を組み合わせて,メッセージの内容を通知している。

メッセージの種類を決めるタイプ

 それでは,タイプとコードの組み合わせを見てみよう(図2-1の下)。タイプとコードはネットワークを流れているパケットをキャプチャすることで,実際に確かめられる。

 ICMPメッセージの種類はタイプによって決まっている。例えば,タイプ0は「エコー応答」,3は「あて先到達不能」,5は「経路変更」,8は「エコー要求」,11は「時間超過」を示す。

 このうち,0のエコー応答と8のエコー要求はLesson1でも説明したpingコマンドなどの問い合わせで使われる。あて先到達不能や経路変更,時間超過はエラー通知のメッセージである。

 あて先到達不能はIPパケットがあて先に届かなかったときに使われる。経路変更は,ネットワーク内に複数のルーターがある場合に,最適経路となるルーターを通知するメッセージだ。時間超過は,TTLの値が0になるなどしてパケットが廃棄された場合に使われる。

コードで細かい内容がわかる

 コードは,タイプごとに決められているパラメータである。タイプで示した内容のさらに細かい情報を伝えられるように規定されている。

 例として,タイプ3の「あて先到達不能」を示す場合のコードを見てみよう。コード0は「あて先ネットワークに到達できない」,コード1は「あて先ホストに到達できない」ことを表す。

 このほか,到達できない理由を示すコードもある。コード4は,パケットの分割が必要だが,分割を禁止する設定(分割禁止フラグが立っている)のためにパケットを分割できず,転送できなかったことを表す。これらはほんの一例だ。タイプ3では0~15のコードが決められている。

 ICMPではこのように,タイプとコードを組み合わせることで,エラーや問い合わせのメッセージが細かくわかるようになっている。