人生を自由に楽しむため、会社員をやめてフリーランスになった『ユウイチ』です。
今回は基礎技術の紹介で、ICMPについて書いてみようと思います。
ICMPと聞いてもピンとこられない方がいるかもしれませんが、pingコマンドなどで使用するプロトコルになります。pingコマンドが一番なじみ深いと思いますので、記事の後半で実際のデータの流れをpingコマンドを例に説明します。
それでは、今回はICMPをわかりやすく説明しようと思います。
ICMPとは
ICMP(Internet Control Message Protocol)はTCP/IPプロトコルスタックのインターネット層に位置するプロトコルで、通信診断やエラー通知を規定したプロトコルになり、メッセージの種類はQuery(通信診断)とError(エラー通知)の2種類になります。
位置づけとしてはIPを補助するプロトコルになり、pingやtracerouteコマンドなどが代表的なコマンドになります。

みたいな感じで疎通確認することは多いと思うのですが、このときにICMPのルールに従っています。
ICMPフォーマット
では、実際のICMPメッセージフォーマットですが、以下のようになり、IPヘッダの上位につく感じになります。
ですので厳密に言えばインターネットプロトコル(IP)の上位のプロトコルという位置づけになると思うのですが、「IPを補助する」という表現が一般的な気がします。
メッセージの意味は、タイプがICMPメッセージの機能、コードはエラー時の詳細を示す値、チェックサムがエラーチェック(ICMPメッセージ自体のエラーです)、データがタイプに依存する部分となります。以下に主なタイプと内容を記載します。
タイプ | 内容 | 種類 |
0:Echo Reply | エコー応答 | Query |
3:Destination Unreachable | 到達不能 | Error |
8:Echo Request | エコー要求 | Query |
11:Time Exceeded | 時間超過 | Error |
タイプの種類がQueryタイプの場合、ICMPヘッダのコードは0となりますが、タイプの種類がErrorタイプの場合はエラー詳細がコードにて定義されています。例えば、種類がErrorである「3:Destination Unreachable」に設定されているコードは以下になります。
コード番号 | 内容 |
0:Network Unreachable | ネットワーク到達不能 |
1:Host Unreachable | ホスト到達不能 |
2:Protocol Unreachable | プロトコル到達不能 |
4:TFragmentation Needed and Don't Fragment was Set | 分散禁止が設定されている(分散処理が必要時) |
5:Source Route Failed | ソースルートに失敗 |
6:Destination Network Unknown | 宛先ネットワーク不明 |
7:Destination Host Unknown | 宛先ホスト不明 |
8:Source Host Isolated | 送信元ホストが孤立 |
9:Communication with Destination Network is Administratively Prohibited | 宛先ネットワークとの通信が管理上禁止されている |
10:Communication with Destination Host is Administratively Prohibited | 宛先ホストとの通信が管理上禁止されている |
ですので、ICMPメッセージのタイプが「3:Destination Unreachable」、コードが「7:Destination Host Unknown」の場合は「宛先ホストが不明で到達できませんでした」ということになります。
では実際のデータの流れについてpingコマンドを例に説明します。
データの流れ(pingコマンド)
pingコマンドはICMPメッセージのEcho RequestとEcho Replyを使用して通信します。
例えば、IPアドレス:192.168.0.9のPC(A)からIPアドレス192.168.0.20のPC(B)へpingコマンド投げる例で説明しますと、以下のようになります。
シーケンス
- AのPCにて「ping 192.168.0.20」コマンドを実行
- AのPC→BのPCへEcho Request
- BのPC→AのPCへEcho Reply
結果は以下のようになります。
Windowsは上記②と③を4回繰り返しますので、結果が4回返ってきております。(Windowsで実施しました)
凄く簡単な流れなのですが、本当にICMPメッセージがEcho RequestとEcho Replyになっているのか確認してみます。以下、Wiresharkというパケットキャプチャソフトでpingのやり取りをキャプチャした結果です。
Protocolが「ICMP」になっており、request→replyの順で4回繰り返されていることがわかります。そして、requestは192.168.0.9→192.168.0.20へ、replyは192.168.0.20→192.168.0.9へ向いていることが確認できます。(Sourceが送信元、Destinationが送信先です)
では、さらにそれぞれの中をみてみます。まず、Echo Requestから。Wiresharkでパケットの中を確認すると以下の結果になっておりました。
見慣れないとわかりにくいのですが、青で選択されている部分がICMPメッセージになります。先に示したように先頭8bit(1byte)がタイプ、次の8bit(1byte)がコードになりますので、このメッセージはタイプが「8」、コードが「0」でEcho Requestになっています。「08」 「00」となっているのですが、Wiresharkは16進数表記になっていますので、「08」 「00」という単位でそれぞれ8bit(1byte)となります。(16進数表記に慣れていない方イメージつかないかもですね。また別の記事で2進数、10進数、16進数について書こうと思います)
ちなみに、下にくっついているデータ(青で選択されていない)はEthernetヘッダとIPヘッダになります。ですので、
という感じでパケットができていることがわかります。
それでは、次に、Echo ReplyをWiresharkで見てみると以下の結果になっておりました。
見るところは先ほどと同じですので、メッセージタイプが「0」、コードが「0」でEcho Replyになっています。
これでめでたくpingの中が解読できたわけですが、きっちりとICMPに従っておりました。
ちなみに、正常に疎通ができなかった場合。例えば別ネットワークにあるPCにpingを飛ばしたけど、ルーターでルーティングできてなかったときなどは先ほど説明した「3:Destination Unreachable」タイプでICMPメッセージが返ってきます。タイプがエラーですので、その際はコードも原因にあったコードがつけられます。「1:Host Unreachable」とか「6:Destination Network Unknown」とかで返ってくると思います。このエラーメッセージを返すのはこの例ではルーターです。目的のPCまでにはたどり着けてませんので、PCはどうやっても返しようがないですからね。
以上、今回はICMPについて説明してみました。
まとめ
何気なく使っているpingコマンドでも、中をのぞいて解析してみると結構面白かったりします。プロトコルのルールと合わせて見てみるとより理解が深まりますのでとてもオススメです。今回キャプチャしたデータはWiresharkというフリーソフトを使ったのですが、これ、本当にオススメです。(いわれるまでもなく使っている方大勢いらっしゃるでしょうが^^;)
いろんなプロトコルの中が見れますんで、もし使っていないという方は是非試してみてください。
今後も基本的な知識をわかりやすく伝えていこうと思います。
※TCP/IPの各プロトコルについてこちらで紹介しております。
こちらもCHECK
-
TCP/IPの各プロトコルについてわかりやすく説明します
人生を自由に楽しむため、会社員をやめてフリーランスになった『ユウイチ』です。 今回はネットワークの紹介です。 専門は組み込みエンジニアなのでネットワークが専門というわけではないのですが、20年間でいろ ...
続きを見る