ICMP
トラブル発生時に重要な情報を与えてくれるICMPについて説明します。
ICMPの概要
ICMPは通常の通信でも知らず知らずの内に利用していますが、トラブル対応を行う上では非常に重要なプロトコルになります。
ICMPは、通常の通信で何故通信出来ないか情報を返したり、通信相手との疎通確認を行うために利用されます。
ICMPはパケットのデータ部分に組み込まれ、以下のヘッダー構造になっています。
タイプ
ICMPのヘッダーにあるタイプはICMPの種類を示しています。よく見かけるタイプは以下の通りです。
タイプ | 意味 | 説明 |
---|---|---|
0 | echo reply | pingに対する応答 |
3 | destination unreachable | 宛先のアドレスが不明で届かない |
5 | redirect | よりよい通信経路に変更依頼 |
8 | echo request | pingへの応答依頼 |
11 | time exceeded | 許容可能なルーターの数を越えたため破棄した |
タイプ0のecho reply、タイプ8のecho requestの詳細は「ping」をご参照下さい。
タイプ11のtime exceededの詳細は「tracert・traceroute」をご参照下さい。
コード
ICMPのヘッダーにあるコードはタイプの内容によって変わります。よく見かけるコードはタイプが3のdestination unreachableの時で以下の通りです。
コード | 意味 | 説明 |
---|---|---|
0 | network unreachable | 相手ルーターがダウンしてarp解決出来ない等 |
1 | host unreachable | サーバーがダウンしてarp解決出来ない等 |
3 | port unreachable | サーバーまでたどり着いたが、ポートが解放されていない |
4 | fragmentation needed and DF set | フラグメントが必要だがフラグメント不可ビットが有効 |
6 | destination network unknown | 宛先ネットワークがルーティングテーブルに載っていない |
13 | communication administratively prohibited by filtering | 管理上遮断されている |
コード4のfragmentation needed and DF setの詳細は応用編の「フラグメント」をご参照下さい。
destination unreachableはトラブルでパケットを採取するとよく見るICMPです。
コード0のnetwork unreachableは途中のルーターまでは届いておりルーティングテーブルにも載っていますが、例として宛先まで届ける事が出来ない時に使われます。この場合、送信元のIPアドレスを確認する事で被疑箇所が特定可能です。
コード1のhost unreachableは最後のルーターまでは届いているが、例としてサーバーがダウンしてARP解決出来ない時等に使われます。この場合、途中の経路は正常である事が分かります。
コード3のport unreachableはサーバーまで通信が出来ていますが、サーバーのポートが解放されていない時に使われます。この場合、サーバーまでパケットは届いている事が分かります。
コード6のdestination network unknownはルーターのルーティングテーブルに載っていない時に使われます。この場合、途中の経路がおかしいか、そもそも存在しないネットワークに対して通信しようとしている事が分かります。
コード13のcommunication administratively prohibited by filteringは通信が遮断されている時に使われます。この場合、必要な通信であれば透過すればよい事が分かります。
タイプ5のredirectはルーターに送られてきたパケットの宛先が、同一サブネット内の異なるルーターに送った方がメトリックが小さい時に、直接送信した方が早い事を通知しています。
このため、データ部分にはそのルーターのIPアドレスが入っています。
留意点
ICMPのエラーが来ていたらトラブル原因の特定に役立ちますが、ICMPは正確に返さないルーターもいますし、途中で遮断されている事も多いです。
このため、ICMPのエラーが来ていないだけで相手まで届いているといった判断は出来ません。
- トラブル対応「ping」
- トラブル対応「tracert・traceroute」
- トラブル対応「ExPing」