スキルアップ ネットワーク プログラミング関連スキル

ICMP(Internet Control Message Protocol)についてわかりやすく説明します

エンジニア歴20年以上、フリーランスでソフトウェアエンジニア・ゲームクリエイター・シナリオライターをやっております『NaruTaku』と申します。

今回はICMPについて書いてみようと思います。ICMPと聞いてもピンとこられない方がいるかもしれませんが、pingコマンドなどで使用するプロトコルになります。pingコマンドが一番なじみ深いと思いますので、記事の後半で実際のデータの流れをpingコマンドを例に説明します。

それでは、今回はICMPをわかりやすく説明しようと思います。

ICMPとは

ICMP(Internet Control Message Protocol)はTCP/IPプロトコルスタックのインターネット層に位置するプロトコルで、通信診断やエラー通知を規定したプロトコルになり、メッセージの種類はQuery(通信診断)とError(エラー通知)の2種類になります。

位置づけとしてはIPを補助するプロトコルになり、pingやtracerouteコマンドなどが代表的なコマンドになります。

NaruTaku
NaruTaku
サーバーにつながれへんなぁ、とりあえずpingは通るかな

みたいな感じで疎通確認することは多いと思うのですが、このときに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年以上、フリーランスでソフトウェアエンジニア・ゲームクリエイター・シナリオライターをやっております『NaruTaku』と申します。 ネットワークが専門というわけではないのですが、20年 ...

続きを見る

  • この記事を書いた人
  • 最新記事

NaruTaku

40代のフリーランスエンジニア・シナリオライター。 20代前半から20年間エンジニアとしてキャリアを積みフリーランスへ転身。ソフトウェア開発とゲーム開発、シナリオ執筆をメインに、プログラミング講師・Webライターとしても活動。また、フリーランスになり見た目の重要性に今さら気づき、ヒゲ脱毛を実施中。

-スキルアップ, ネットワーク, プログラミング関連スキル