ICMP(Internet Control Message Protocol)その3
目次
ICMP到達不能メッセージ
ICMPタイプ3の到達不能メッセージはまさしくエラーレポートという感じがするメッセージです。
何らかの理由で送信先にデータを送ることができないというときに、送信元に対して「なぜ送ることができなかったのか?」ということをレポートします。この到達不能メッセージを解析することによって、ある程度トラブルの切り分けを行うこともできるようになります。
タイプ3メッセージは、エラーの種類によって0~12のコードを定義しています。コードとエラーの種類、意味は次のようになっています。
コード | 種類 | 意味 |
0 | Network Unreachable | ネットワークに到達できない |
1 | Host Unreachable | 特定のホストに到達できない |
2 | Protocol Unreachable | プロトコルを見つけることができない |
3 | Port Unreachable | ポートを使うことができない |
4 | Fragmentation Blocked | フラグメントを行うことができない |
5 | Source Route Failed | ソースルート通りにルーティングできない |
6 | Target Network Unknown | ネットワークを知らない |
7 | Target Host Unknown | ホストを知らない |
8 | Source Host Isolate | 送信元がインターネットと交信できない |
9 | Target Network Prohibited | 送信先ネットワークが拒否している |
10 | Target Host Prohibited | 送信先ホストが拒否している |
11 | Network TOS Problem | 要求したTOSで中継できない |
12 | Host TOS Problem | 要求したTOSで中継できない |
このようにたくさんあります。が、定義されているだけで実際には使われていないものもあります(というか、見たことがない・・・)。また、ネットワーク機器のベンダによって同じ状況でも違うコードを出していることがあります。あまり厳密に考えずにあて先に送ることができなかったことを知らせるために使われているんだなと思っててください。
実際にメッセージが出される様子
じゃ、実際に具体的なネットワークを考えてタイプ3のメッセージが出てくる様子を見てみましょう。
一番、たくさん出る(と思われる)「Host Unreachable」のメッセージを例に取ります。次のネットワークを考えましょう。
コンピュータA(10.0.0.1/8)がルータR1、R2をはさんでコンピュータB(30.0.0.1/8)にPINGを打ったとします。
ping 30.0.0.1
でも、ルータR1とR2にはまだ何にもルーティングの設定をしていません。その場合は、ルータは直接接続されているネットワークだけしかわかりません。AからBにパケットを送るためには、ネットワークが違うのでルータR1に送られていきます。R1はAからのパケットを受け取ると、あて先のIPアドレスを見てルーティングテーブルから次にどこに送ればいいのかを決めていきます。ところが、R1は30.0.0.0/8のネットワークへの経路を知りません。すると、そのパケットは破棄されてしまいます。
R1はパケットを破棄してしまったことを、送信元であるコンピュータAにICMPタイプ3を送って通知します。
※このときのコードは、6の「Target Network Unknown」になるような気がするのですが、なぜかシスコのルータでは、1の「Host Unreachable」になってしまいます。ま、あんまり気にしないでおきましょう。
すると、ICMPタイプ3を受け取ったコンピュータAは次のように表示します。
Reply from 10.0.0.100: Destination Host Unreachable Reply from 10.0.0.100: Destination Host Unreachable Reply from 10.0.0.100: Destination Host Unreachable Reply from 10.0.0.100: Destination Host Unreachable
一瞬、Reply fromとなっているので、成功したのか!?と思うのですがそのあとが「Destination Host Unreachable」となっているのでICMPタイプ3が送られてきたことがわかります。よく見ると、Reply fromのあともルータのIPアドレスになっていて、PINGが失敗していることがわかります。そしてその原因は、おそらくルータの設定漏れだなぁということを推測することができるようになるわけですね。