ネットワークの基礎講座
IP(インターネット・プロトコル)
ICMP(Internet
Control Message Protocol)
IPヘッダには相当の機能が含まれており、またオプション等の拡張性も残されている。しかしながら、IPデータグラムごとにIPヘッダにのせて制御等IP制御の補佐的動作を行うだけでは不十分である。たとえば受け側のホストが発信元のホストに誤り情報を返したい場合などがこれに相当する(乗せるIPデータグラムが存在しない)。その為のアプリケーションとしてメール(SMTP: Simple Mail Transfer Protocol)の利用なども考えられようが、その為のサーバが必要になったりして複雑になり、この機能はIPの一部としてコンパクトに含めたほうが良いとの判断によるものであろう。
ICMPの特性を列記する:
· ICMPはIPの上位層プロトコル(したがってIPヘッダのProtocol:1として登録されている)のごとく振舞う。従ってICMPのメッセージはIPデータグラムにカプセル化される。しかしながら、ICMPはIPの一部として組みこまれており、総てのホストのIPモジュールに実装されていなければならない。
· ICMPは何らかの誤りを報告するためのもので、IPの信頼度を上げるためのものではない。信頼性はIPを使っている上位層のプロトコルが行わなければならない。
· ICMPはICMPメッセージの誤りを除く総てのIPデータグラムで発生した誤りを報告する。ICMP自身の誤りを報告すると無限ループの発生の危険性があるからである。
· フラグメント化したIPデータグラムに対しては、ICMPはオフセットが0のフラグメントだけの誤りの報告をし、オフセット・フィールドがゼロ以外のIPデータグラムには決して対応しない。
· ICMPは決してブロードキャストやマルチキャストの宛先のデータグラムに応答して送信することはない。
· ICMPは送信元アドレスがないデータグラムには決して応答しない。すなわちループバック、ブロードキャスト、マルチキャストのアドレスには応答しない。
· ICMPはICMPのエラーメッセージの応答して送信してはならない。ただしICMPのクエリ(問い合わせ)メッセージには応答する。
· RFC 792はICMPはIPデータグラ処理中の誤りの報告を作成「して良い(may)」としており、「しなければならない(must)」とはしていない。実際のところルータは誤りに対しては殆どがICMPメッセージを作成するが、宛先ホスト宛てに送出する。
ICMPのメッセージの書式は下図のようになっている。このメッセージはIPデータグラムのデータ部にカプセル化されて配置される。
0 |
8 |
16 |
31 |
Type |
Code |
Checksum |
|
ICMP data (depending on the type of message) |
|||
............... |
Typeはメッセージのタイプを指定する。タイプには単にエラーとして送信されるものと相手からのICMP応答を必要とするものがある。
ICMPエラーメッセージ |
タイプ |
|
Destination unreachable |
宛先到達不可 |
3 |
Source quench |
発信制限 |
4 |
Redirect |
経路変更 |
5 |
Router advertisement |
ルータ名のり |
9 |
Router solicitation |
ルータ勧誘 |
10 |
Time exceeded |
時間超過 |
11 |
Parameter problem |
パラメタ異常 |
12 |
ICMP問合せメッセージ |
タイプ |
|
Echo / Echo reply |
エコーとエコー応答 |
8 / 0 |
Timestamp request / reply |
タイムスタンプ要求/応答 |
13 / 14 |
Information request / reply |
情報要求/応答 |
15 / 16 |
Address mask request / reply |
アドレス・マスク要求/応答 |
17 / 18 |
これらのメッセージを順番にかつ簡単に説明する。
Destination unreachable(宛先到達不可)
これは皆さんが経験することが多いメッセージであろう。このメッセージが介在するルータから送られてきたら、そのルータはその宛先のIPアドレスを到達不能とみなしたことを意味する。もし相手のホストからこのメッセージが送られてきたら、プロトコル番号部分フィールドで指定したプロトコルが動作していないことを示す。UDPの場合は指定されたポートが開いていない場合にもこれが生じる。
ICMPデータ部の書式はつぎのとおりである。つまりもとのIPデータグラムの頭の部分をつけて送り返してくるのである。事由はCodeフィールドに番号で知らせてくる。
0 |
8 |
16 |
31 |
unused (zero) |
|||
IP header + 64bits of original data of the datagram |
|||
|
0 |
network unreachable そのネットワークに転送できない |
1 |
host unreachable そのホストに転送できない |
2 |
protocol unreachable そのプロトコルに転送できない |
3 |
port unreachable そのポートに転送できない |
4 |
fragmentation needed but the Do Not Fragment bit was set フラグメンテーションが必要なのに禁止フラグがたっている |
5 |
source route failed そのソースルートでは実行できない |
6 |
destination network unknown 宛先ネットワークが不明 |
7 |
destination host unknown 宛先ホストが不明 |
8 |
source host isolated (obsolete) 発信元ホストが孤立 |
9 |
destination network administratively prohibited 宛先ネットワークが管理者によって転送禁止となっている |
10 |
destination host administratively prohibited 宛先ホストが管理者によって転送禁止となっている |
11 |
network unreachable for this type of service このサービスタイプではそのネットワークに転送できない |
12 |
host unreachable for this type of service このサービスタイプではそのホストに転送できない |
13 |
communication administratively prohibited by filtering フィルタリングのため管理者によって通信が禁止されている |
14 |
host precedence violation ホストの優先度違反 |
15 |
precedence cutoff in effect 優先度によるカットオフ中 |
Source quench(発信制限)
このメッセージの書式は同じで下記のようである。
0 |
8 |
16 |
31 |
unused (zero) |
|||
IP header + 64bits of original data of the datagram |
|||
|
このメッセージを介在するルータから受信した場合は、そのルータのバッファ空間が次のネットワークにデータグラムの待ち行列に必要なだけ存在しなくなったことを示す。また宛先のホストから受信したときはそのホストが処理しきれない速度でIPデータグラムが到達していることを示す。従って送信元はその宛先むけの送信を一時とめるか速度を下げ、しかるのち次第に速度を上げていく必要がある。
Redirect(経路変更)
このメッセージの書式は下図のとおりである。介在ルータが、そのネットワークむけのデータグラムなら別のルータのほうが良いと判断したときに送り返してくる。指定されたルータは、送信元ホストやこのICMPメッセージを作成したルータと同じサブネット上に存在するはずである。万一送信元のIPアドレスとこのICMPメッセージで指定したルータIPアドレスと一致したら、これはループを形成してしまうので、そのようなメッセージが送信されないよう注意が必要である。これを受信したホストやルータは、自分の持っているルート情報テーブルを書き換え、その後のそのネットワークむけのIPデータグラムを助言されたルータに送る。
0 |
8 |
16 |
31 |
Router IP Address |
|||
IP header + 64bits of original data of the datagram |
|||
|
ICMPヘッダのcodeフィールドの値は以下のようになっている。
0 |
Network redirect |
1 |
Host redirect |
2 |
Network redirect for this type of service |
3 |
Host redirect for this type of service |
Router advertisement(ルータ名のり)とRouter solicitation(ルータ勧誘)
Router advertisementのメッセージの書式は下図のようになっている。Router solicitationのメッセージは32ビットのオールゼロのワードひとつからなる。
0 |
8 |
16 |
31 |
number |
entry length |
TTL |
|
router address 1 |
|||
preference level 1 |
|||
......... |
|||
router address n |
|||
preference level n |
number: このメッセージに含まれるエントリの数
entry length: エントリあたりの長さを32ビット単位で示す。ここでは2である。
TTL: エントリが有効と考えられる時間を秒で示す
router address: 送信元のIPアドレス
preference level: あるサブネットでのデフォルト・ルータを選択する場合の優先度を示す。サブネット上の各ルータは自分の優先度を広告する責任がある。この数字が大きければ大きいほど高い優先度であることを示す。デフォルトは0(つまり中間の優先度)である。X`80000000`-2は、このルータを決してデフォルト・ルータに使ってはいけないことを示す。
この2種類のメッセージは問合せ/応答とはちがうものの組になって存在するものである。ホストやルータがルータ発見プロトコル(RDP: Router Discovery Protocol)対応となっているときに使われるものである。マルチキャストの使用が推奨されるが、マルチキャストが利用できない場合に限りブロードキャストの使用も許される。そうするように設定されているルータは、周期的にこのメッセージをそのIPアドレスをそのサブネットに放送する。広告は全システム・マルチキャスト・アドレス(224.0.0.1)あるいは限定ブロードキャスト・アドレス(255.255.255.255)を使う。デフォルトは10分ごとに1800(30分)のTTLで送信する。勧誘をうけたルータはそれに答えねばならない。勧誘に対する応答は直接そのホストに送っても良いし、しばらくランダムな時間を置いてマルチキャストで応答しても良い。勧誘メッセージの送信は全ルータ・マルチキャスト・アドレス(224.0.0.2)あるいは限定ブロードキャスト・アドレス(255.255.255.255)をつかう。
Time exceeded(時間超過)
このメッセージが介在ルータから届いたときは、IPデータグラムのTTLフィールドが0になってしまったことを意味する。メッセージフォーマットは以下のようである。
0 |
8 |
16 |
31 |
unused (zero) |
|||
IP header + 64bits of original data of the datagram |
|||
|
ICMPヘッダのcodeは次のどれかになる。
0: 転送中にTTLが過ぎてしまった
1: フラグメント化されたIPデータグラムの再組み立て中にTTLが過ぎてしまった。つまり一定時間経過しても到来しないフラグメントがあり、バッファを開放した。
Parameter problem(パラメタ異常)
IPヘッダのパラメタ処理中に問題が生じたことを示す。書式は下図のようである。ポインタフィールドは問題が発生した元のIPデータグラムのバイトの位置を示す。ICMPヘッダのcodeは次のどれかになる。
0 |
8 |
16 |
31 |
Pointer |
unused (zero) |
||
IP header + 64bits of original data of the datagram |
|||
|
0: そのパラメタは規定されていない
1: 必要なオプションがない
Echo / Echo reply(エコーとエコー応答)
エコーはそのネットワーク上のほかのホストを検出するのに使われる。主にネットワーク診断や相手のホストの診断に使う。相手のホストに到達可能かを調べるPingコマンドがこれを利用している(PingはPacket InterNet Grouperの略語である)。相手のホストはtypeをEcho replyに置き換え送信元に送り返す。
0 |
8 |
16 |
31 |
Identifier |
Sequence number |
||
data.... |
|||
|
Timestamp request / reply(タイムスタンプ要求/応答)
これらのメッセージはデバッグや性能評価用のものである。これらはクロック同期用には使われない。その為のプロトコルとしてはNTP(Network Time Protocol)が用意されている。
書式は下図のようである。
0 |
8 |
16 |
31 |
Identifier |
Sequence number |
||
originate timestamp |
|||
receive timestamp |
|||
transmit timestamp |
送信側は識別子(Identifier)とシーケンス番号(Sequence number)を初期化する。シーケンス番号は繰り返しこの要求を送る場合に使う。そして送信元のタイムスタンプをセットして相手に送信する。受信側はこれを受信したら受信と送信のタイムスタンプをつけ、ICMPのTypeフィールドをTimestamp replyに書き換えて送り返す。実際には受信と送信はひとつの動作で行われるので受信と送信のタイムスタンプは同じ値が入る。タイムスタンプはGMT(グリニッジ平均時刻)の午前0時正時からのミリ秒である。
Information request / reply(情報要求/応答)
これはディスクレスのシステムのように自分のIPアドレスを立ち上げ時にサーバに問い合わせるメカニズムとして用意されたが、RARPやBOOTPなどのプロトコルが現在使われているために、廃止となっているので、詳細は省略する。
Address mask request / reply(アドレス・マスク要求/応答)
ホストか自分の属するサブネットのマスクを知りたい(すなわち自分の属するサブネット番号をしりたい)時に使う。サブネット・マスクは通常ホストの設定時に設定されるが、ディスクレス・システムのようにサーバから取得するものも存在するのでこのメカニズムが用意されている。この場合ホストはまずRARPで自分のIPアドレスを取得する。サブネット・マスクの取得にはそのホストはアドレス・マスク要求をブロードキャストする。そのネットワーク上でこの要求に対応するよう設定されたホストがこれを受信すると、ICMPメッセージのサブネット・マスクのフィールドをセットし、TypeをAddress mask replyに置き換えて送信元に送り返す。codeフィールドはゼロである。
書式は下図のとおりである。
0 |
8 |
16 |
31 |
Identifier |
Sequence number |
||
Subnet address mask |
ICMPについて一通り説明した。ICMPを使っている典型的なアプリケーションはPingとTracerouteである。Pingは相手のホストに到達可能かどうかを調べるもので、エコー要求/応答を利用している。Tracerouteは相手のホストに到達するまでの経路を調べるものである。これにはICMPの時間超過メッセージを使っている。すなわちホストはまずTTL値を1にして相手のホストにIPデータグラムを送出する。最初に取ったルータまたはホストはTTL値を1減数するとゼロとなるので直ちにICMP時間超過メッセージを送り返してくる。TTL値をひとつずつ増やしながら最終的に目的のホストまでの経路を知ることができる。