3 Minutes NetWorking
No.34

3Minutes NetWorking

第34回レイヤ3 ICMP

■ エラーメッセージ

インター博士

さて、ネット君。
ルータの動作はわかってくれたと思う。

ネット助手

えぇ、まぁ。たぶん。

インター博士

ふむ。相変わらず自信なさ気だな。
まぁ、正直でよろしい。

ネット助手

それは褒めていただいてるんですか?

インター博士

そうだな。
他に取り柄もないしな

ネット助手

ぐぅ。

インター博士

ともかく。
ルータの動作、つまりネットワーキングでのデータ転送の仕組みがわかったところで、質問だが。データ転送って、これだけじゃないよな?

ネット助手

はい?
どういう意味です?

インター博士

宛先を決めて、データを送る。
これはこれでいいが、ホスト間で行われるデータ転送というものはそれだけなのか?
他にはないのか?

ネット助手

え、えっと。
ないんじゃないんですか。

インター博士

まぁ、普通はそう考える。
だがしかし、エラーメッセージというものを忘れてはいかんな。

ネット助手

えらーめっせーじ?
例えば、こんなのですか?

エラーメッセージ

[Figure34-01:エラーメッセージ]

インター博士

あぁ、確かにこれもエラーメッセージだといえば、そうだが。
このブラウザが表示するエラーメッセージは、エラーが発生したことを教えてくれるが、実際どのようなエラーかわからない。

ネット助手

どのようなエラー?

インター博士

うむ。このブラウザのエラー表示の原因としてはいくつか考えられる。
アドレスを間違えて打った、DNSが上手く動いてない、そのページが存在しない、ホスト側の設定ミス、メディアが接続されていない…。

ネット助手

ははぁ。同じ表示でも原因はいくつかあるんですねぇ。

インター博士

そうだ。
だが、「なんだかわかんないけど繋がりませんでした」では通用しない。そのため、エラーを通知するプロトコルを知っておく必要がある。

ネット助手

エラーを通知するプロトコル…。

インター博士

そのプロトコルは、ICMPというプロトコルだ。 ▼ link

ネット助手

あいしーえむぴー?

■ ICMP

インター博士

Internet Control Message Protocol。
直訳すれば、インターネット制御メッセージプロトコル。役割的に翻訳すると、エラー報告プロトコルってところだな。

ネット助手

制御メッセージ。
エラー報告。

インター博士

いくつか機能があるのだが、例えばこんな風に使われる。

[Figure34-02:ICMP]

ネット助手

「送信不能メッセージ」を受け取ったホストはどうするんです?

インター博士

それは個々のアプリケーションによって対応が異なる。

ネット助手

ははぁ。

インター博士

このように、ネットワークの制御・管理に使用される、ということがわかってもらえたと思う。
さて、どのようなデータをやりとりするかというと、ちょっと特殊で普通のIPパケットと違う。

ネット助手

普通と違う?
そういえば、ARPのパケットも普通と違いましたよね。

ARPパケット

[Figure26-03:ARPパケット]

インター博士

うむ。確かにARPパケットも普通と違う。
だが、ICMPはもうちょっとIPパケットに近い。というよりも、ICMPはIPに含まれているのだ。

ネット助手

含まれている?

インター博士

そうだ、以下のような形になる。

ICMPパケット

[Figure34-03:ICMPパケット]

ネット助手

え〜。
レイヤ4のセグメントの代わりに、ICMPのメッセージが入るってことですか?

インター博士

まあ、そう考えるのが楽だな。
実際は、IPヘッダ+ICMPメッセージの形になる、ということだ。

ネット助手

ふむふむ。

インター博士

ICMPメッセージの構造はこうなっている。

1バイト1バイト2バイト4バイト64バイト
タイプコードチェックサムオプションデータ

[Table34-01:ICMPパケット]

インター博士

このような形だ。
覚えておくべく所は、タイプのところだ。

ネット助手

たいぷ?

■ ICMPの種類

インター博士

うむ。ICMPには大きく分けて、2種類のメッセージがある。
QueryメッセージErrorメッセージだ。

ネット助手

くえり、と、えらー。

インター博士

Queryは状態を調査するために使用されるメッセージ。
Errorはそのままエラーを通知するためのメッセージだ。

ネット助手

ははぁ、ICMPは状態の調査にも使用するんですね。
さすがInternet Controlのプロトコルですね。

インター博士

うむ。
この2種類に、それぞれ複数のタイプが存在する。
先ほどのメッセージの中の「タイプ」に数字で表されている。

タイプ説明意味種類
0Echo ReplyEcho応答Q
3Destination Unreachable宛先到達不能E
4Source Quench転送抑制指示E
5Redirect最適経路通知E
8Echo RequestEcho要求Q
11Time Exceeded時間超過によるパケット破棄E
12Parameter Problem誤ったパラメータによるエラーE
13Timestamp Requestタイムスタンプ要求Q
14Timestamp Replyタイムスタンプ応答Q
15Information Request(未使用)Q
16Information Reply(未使用)Q

[Table34-02:ICMPのタイプ]

インター博士

種類の[Q]はQueryメッセージ。[E]はErrorメッセージを指す。
このように11種類存在する。 ▼ link

ネット助手

1番とか2番とか、7番が抜けているのは何か意味があるんですか?

インター博士

ふむ。
それらはもともとのRFC792でも定義されていない番号だ。私が省略したわけではない。

ネット助手

なんだ、そうなんですか。

インター博士

0、3、5、8、11を赤くしたのは私の仕業だ。
この5種類のICMPメッセージタイプは、非常に重要だ。

ネット助手

重要って、どんな風に重要なんですか?

インター博士

頻繁に利用される、という点でだ。
この5種類については、細かく説明していく。

ネット助手

はい。

■ Destination Unreachable

インター博士

まずは、タイプ3、Destination Unreachableだ。
宛先到達不能と訳されることが多い。

ネット助手

宛先到達不能。
宛先に届かなかったんですね。

インター博士

そのままだな
確かにその通りだ。
ただ、何が原因で届かなかったかがこのメッセージではわかる。

ネット助手

へぇ、どうやってですか?

インター博士

宛先にIPパケットを送り、それが何らかの原因で届かないわけだ。
そうすると、タイプ3の宛先到達不能メッセージが帰ってくる。そのICMPメッセージのコードの部分に原因が書いてある

ネット助手

こーど?
あぁ、タイプの後ろにある1バイトの部分ですね。

インター博士

うむ、そこに0〜12までの原因コードが入って戻ってくるわけだ。
原因は以下のように分類されている。

code説明意味
0Net Unreachableネットワークへ到達不能
1Host Unreachableホストへ到達不能
2Protocol Unreachableそのプロトコルは使用できない
3Port Unreachable対象ポートが閉じている
4Fragmentation Needed and DF was Setパケットサイズが大きいため分割したいが、分割が不可になっている
5Source Route Failedソースルートが不明。
6Destination Network Unknown宛先ネットワークが不明
7Destination Host Unknown宛先ホストが不明
8Source Host Isolated宛先ホストがネットークから分離されている
9Communication with Destination Network is Administratively Prohibited宛先ネットワークとの送信が禁止中
10Communication with Destination Host is Administratively Prohibited宛先ホストとの送信が禁止中
11Destination Network Unreachable for Type of Service指定したサービスタイプでは宛先ネットワークへ到達不能
12Destination Host Unreachable for Type of Service指定したサービスタイプでは宛先ホストへ到達不能

[Table34-03:ICMP Type3 Code]

ネット助手

わわわ。
なんかいっぱいあって、大変ッス。

インター博士

まあ、細かくみると確かに13種類は多い。
だが、よくよく見るとだいたい同じだ。

ネット助手

そうですかぁ?

インター博士

コード2、3、4を除けば。大体が宛先ネットワークや宛先ホストとの通信が不可能です、と言っている。
ちなみにICMPを規定したRFC792では、コード1〜5までしか載ってないがな。

ネット助手

なんですか、そりゃ?

インター博士

まあ、そんなものだ
コード0、1、4、5はIPパケットを受け取ったルータが判断してタイプ3を返す。
コード2、3は受け取ったホストが返す形になる。

[Figure34-04:Destination Unreachable]

ネット助手

ははぁ。
これで何故データが届かなかったのかがわかるわけですね。

■ Redirect

インター博士

次は、タイプ5、Redirectの説明だ。

ネット助手

何故タイプの番号順に説明しないんですか?

インター博士

それはねモゲタン。
大人の都合という奴なのよ。

ネット助手

いつの間に僕がモゲタンに?

インター博士

冗談はともかく。
番号順にやらないのは講座の構成上の問題という奴だ。気にするな。

ネット助手

はぁ。

インター博士

タイプ5はRedirect。直訳すれは方向転換だな。
さて、ネット君。ルーティングプロトコルを使用すればルータは最適な経路を選択できるな。

ネット助手

そうですね。それがルーティングプロトコルの役割ですから。

インター博士

では、以下のような状態を考えてみてくれ。

ネットワーク構成図

[Figure34-05:ネットワーク構成図]

インター博士

新しくルータを追加したら、172.16.0.0ネットワークへはルータBの方が最適なルートを持った。
よって、ルータAはルータB経由で172.16.0.0へパケットを送る。

ネット助手

はい、そうなりますね。

インター博士

それはいいのだが、ネット君。
ホストXが172.16.0.0へパケットを送りたい場合、どうなる?

ネット助手

どうなる、って。
デフォルトゲートウェイが192.168.1.1に設定されているから、ルータAに送りますよね。

インター博士

うむ、そうだ。
そうなると、ルータAは最適ルートに従って、ルータBへデータを送る。なんかおかしくないか?

ネット助手

おかしいっていえば、そうですけど。
ホストXが直接ルータBに送った方が早いですよね。

インター博士

いいぞ、ネット君。
何故このような事が起きるかというと、ホストにはルートの変更情報は伝わらないからだ。

ネット助手

そうですね。
ルーティングプロトコルはルータ間で行われるから、ホストにはそういう情報が伝わりませんよね。

インター博士

うむ、よって最適ルートの情報をホストへ伝える
これがタイプ5のRedirectだ。

ネット助手

ははぁ。

インター博士

Redirectは4つのコードがあり、さらにオプションに新しい最適ルータのIPアドレスを入れてホストへ送り返す

code説明意味
0Redirect datagrams for the Network対象ネットワークへのルート変更
1Redirect datagrams for the Host対象ホストのみへのルート変更
2Redirect datagrams for the Type of Service and Networkネットワークへのルート変更(特定のサービスタイプのみ)
3Redirect datagrams for the Type of Service and Hostホストへのルート変更(特定のサービスタイプのみ)

[Table34-03:ICMP Type5 Code]

[Figure34-06:Redirect]

ネット助手

ホストXのルーティングテーブルのゲートウェイを変更?
…。そういえば、各パソコンもルーティングテーブルを持っていましたっけ。

インター博士

その通り。
通常、パソコンのルーティングテーブルでは異なるネットワークへのパケットは、すべてデフォルトルートに従って、デフォルトゲートウェイにパケットを送るようになっている。

ネット助手

コマンドプロンプトで、「>route print」を使うと見えるテーブルですよね。
それの、「0.0.0.0ネットワーク宛」がデフォルトルートでしたっけ。

インター博士

うむ、それだ。
そのルーティングテーブルに、この例でいえば172.16.0.0ネットワークだけは192.168.1.2をゲートウェイにするよう追加するのだ。

ネット助手

へぇ。

インター博士

というわけで、説明すると言った0、3、5、8、11の5つのタイプのうち2つが終わったわけだ。
残り3つはまた次回。

ネット助手

いぇっさー。
3分間ネットワーキングでした〜♪

ICMP
[Internet Control Message Protocol]
RFC792で規定。
Query
[Query]
読みは「クエリー」。
本来の意味は、質問・疑問。
11種類
実際は、タイプは1バイト=8ビットですから256種類あります。
RFC950やRFC1256で他の種類のタイプも定義されています。
すべてを見たい場合は、IANAにあります。参考リンクを参照のこと。
ソースルート
[source route]
通常は、送信元ホストはどのようなルートで宛先に届くかは知らなくてもよい。
だが、送信元ホストが指定することもでき、そのルートの事をソースルートという。
コード1〜5まで
ルータによって、対応できるコードが違うこともあるみたいです。
コード1〜5はどのルータでも対応しているが、6以降は実装されていないものも。
UnreachableとUnknownの明確な違いと言われても…。
モゲタン
ネタ元はSGGG、「モゲタンとお姉さんのゲームなぜなに講座」。
かなり駄目すぎて大好き。
ネット助手ネット君の今日のポイント
  • エラーメッセージなどを転送するプロトコルがICMPである。
  • ICMPはIPヘッダ+ICMPメッセージの形でカプセル化される。
  • ICMPには大きく分けてQueryとErrorの2種類のメッセージがある。
  • タイプ3はDestination Unreachable(宛先到達不能)。
    • 宛先のネットワーク・ホストへパケットが届かなかった事を通知する。
    • コードによってその原因がわかる。
  • タイプ5はRedirect(最適経路通知)。
    • より最適なルートがあった場合、ホストにそれを通知する。

3 Minutes NetWorking No.34

管理人:aji-ssz(at)selene.is.dream.jp