ネットワークスペシャリスト - SE娘の剣 -

ネットワークスペシャリストの試験対策サイトです。
ネスペ試験の合格体験談、合格のコツ、過去問解説、基礎知識などの情報を掲載します。

カテゴリ:8.ネットワーク層(L3) > 8.3 ICMP

ICMP(Internet Control Message Protocol)というと耳慣れないが、pingコマンドと聞けば、身近であろう。
ICMPの代表例はpingとtracert(またはtraceroute)である。
※Windowsのコマンドプロンプトではtracert、Ciscoなどのネットワーク機器ではtracerouteがほとんど。
では早速、pingを打ってみよう。
ping
・環境を変えてpingを打ってみると、色々なメッセージがでるので試してみましょう。
例えば、以下の構成があります。
ネットワークスペシャリスト_ping
■Case1
PCから、192.168.2.0/24の存在しないIPアドレスにPingを打ってみましょう。
ping 192.168.2.100
timeout
このように、「タイムアウト」と表示されます。

■Case2
PCから、ルータが知らないネットワークにpingを打ちましょう。
unreach
今度は「宛先ホストに到達できません」と出ます。しかも、そのメッセージを返しているのは、192.168.1.254なので、Ciscoルータです。
guts
何となくわかりました。
Case1の場合は、pingを送っても、相手からの応答がないので、PCが「タイムアウト」というメッセージを出しているんですね。
Case2の場合は、デフォルトGWであるルータまで届くのですが、ルータからは宛先が無いので、「到達できません」というメッセージを返しています。
その通りです。メッセージの中身を理解しておくと、実践での切り分けにも役立ちますよ!

過去問では、ICMPに関して「TCP/IP環境において、pingによってホストの接続確認をするときに使用されるプロトコル(H20NW午前 問31)」、「送信元ホストへのIPパケットの送信エラー報告などの制御メッセージを通知する。(H19NW午前 問24)」「ネットワーク機器の接続状態を調べるためのコマンドpingが用いるプロトコル(H18NW午前 問28)」と述べている。

フレームフォーマット
・IPヘッダはIPパケットなので他と共通である。
・プロトコル番号は1である。参考までにUDPは17
・タイプ(type):メッセージの種類。たとえばpingの要求(echo)は8で、pingの応答パケット(echo reply)は0
・コード(code):コードは詳細情報を表す。たとえば、type3は宛先到達不能(destination host unreachable)であるが、その原因はいくつかある。宛先コンピュータが問題ならcode1、UDPのポートが問題なら3(※TCPはTCPの別パケットが返される)、DFビットがセットされている場合は4など。
2

ICMPのフレームフォーマット詳細解説
※Type(8)のEcho Requestの場合
(1)ヘッダ
Type(1)
Code(1)
チェックサム(2)
ぜ永婿(2)
ゥ掘璽吋鵐紅峭(2)
Ε如璽拭焚鎚僉

(2)Typeの例
0 Echo Reply :pingコマンドの応答パケット
icmp2
3 Destination Unreachable
 ※前の記事の、ルータが知らないセグメントにpingを打った場合に、ルータがこのメッセージを返した。
icmp
4 Source Quench
5 Redirect :ICMPリダイレクト
8 Echo Request :pingコマンドを実行した場合
icmp3
11 Time Exceeded: 定められた生存時間(TTL:Time To Live)を超えた(Exceeded)とうことで、パケットを破棄したことを通知するメッセージ。tracerouteは、この仕組みを利用している。
icmp

実際のキャプチャ例
Etherealでキャプチャーした。
皆さんも、ぜひご自分でやっていただきたい。

以下の赤線部分のみ見てもらえばいい。
1.Ethernet ・・・ イーサネットヘッダ
(1)宛先MACアドレス ・・・ 00:0d:02:xx:xx:xx
(2)送信元MACアドレス ・・・ 00:19:d2:xx:xx:xx
(3)タイプ ・・・ IP (ここから次はIPフレームであることを示している)
2.Internet Protocol ・・・ IPヘッダ
(1)プロトコル ・・・ ICMP
(2)送信元IPアドレス ・・・ 192.168.1.111
(3)宛先IPアドレス ・・・ 192.168.1.1

※パケット長の前にTOS(Type Of Service)フィールドがあり、パケットの優先順位をつけることができる。しかしあまり使われていない。
ICMPのパケット

Type
Summary of Message Types
    0  Echo Reply
    3  Destination Unreachable
    4  Source Quench
    5  Redirect
    8  Echo
   11  Time Exceeded
   12  Parameter Problem
   13  Timestamp
   14  Timestamp Reply
   15  Information Request
   16  Information Reply
  
  ※ http://tools.ietf.org/html/rfc792 より
 
Code
Codeは、Typeの内容の詳細である。
 例えば、Destination Unreachable(Type=3)のとき、Codeの例は以下です。なぜUnreachableなのかの詳細が分かります。
      0 = net unreachable
      1 = host unreachable
      2 = protocol unreachable
      3 = port unreachable
      4 = fragmentation needed and DF set
      5 = source route failed.
    ※ http://tools.ietf.org/html/rfc792 より

ルーティングにおいて、より適切なルータがある場合にそれを伝えるICMP(Type5)のメッセージ。このICMPパケットの中で、Gatewaya Addressという情報があり、より適切なGateway(ルータ)情報を送る。私は昔、ICMPリダイレクトはICMPパケットだけだと勘違いしていましたが、そうではなかったです。

以下の構成図で考えます。
PCのデフォルトゲートウェイは192.168.1.254です。172.16.1.0/24のネットワークに通信をしようとすると、,妊襦璽殖韻膨命し、そこから△妊襦璽殖欧帽圓ます。これって無駄ですよね。
そこで、もっといい経路があることを伝えるのがICMPリダイレクトです。
ICMPリダイレクト

女性目閉じる

traceroute(Windowsではtracert)は、ターゲットIPへの通信経路がわかる便利な機能であるが、どんな仕組みになっているのですか?
tracerouteはICMPパケットを利用しています。
以下の構成で説明します。

【PC1】        【ルータA】     【ルータB】     【ルータC】     【PC2】
10.1.1.10 → 10.1.1.1  → 1.1.1.2  → 2.1.1.1   →  3.1.1.10
             1.1.1.1      2.1.1.1     3.1.1.1

PC1(10.1.1.10)からPC2(3.1.1.10)へPingを打ちます。

Reply from 3.1.1.10: bytes=32 time<10ms TTL=128
このように、OKが返ってくるとします。

今度はtracerouteをします。
ICMPパケットのTTL(Time To Live:生存時間)を1に設定します。
▲襦璽A(10.1.1.1)に届きます。
TTL(生存時間)が1のパケットは、ルータAに届いたことでTTLは0になり、破棄されます。破棄されたことを通知するために、ルータAはtime exceeded(生存時間を超過した)というメッセージを返します。
PC1はtime exceededが返ってきた送信元IPアドレスを見て、最初のルータはルータA(10.1.1.1)であることがわかります。
イ海瞭虻遒魴り返します。次はTTLを2に設定し、同じ処理をします。
ζ瑛佑法time exceededが返ってきた送信元IPアドレスを見て、次のルータはルータB(1.1.1.2)であることがわかります。
sef4

PingがNGになるものでも、途中までは経路がわかる。
あれも不思議ですが。
PingがNGになる場合、最終的な宛先に届かなくても、途中の経路までは届く場合があります。たとえば、最終的な宛先のFirewallで拒否されている場合や、最終的な宛先の直前のルーティングが間違っている場合などです。
tracerouteの仕組みを説明したように、最終的な宛先に関係なく、順次TTLを増やしていくので、PingがNGでも途中までの経路がわかる場合があるんのです。

コラムということは、試験には出ないと考えております。

TTLは装置ごとに違う。たとえば、WindowsXPパソコンからpingを打つとLinuxサーバは64、Ciscoルータは255から始まる。
ちなみに、Windowsパソコンは128から始まるので、ICMPのEcho RequestのTTLは128、Echo Replyは64と異なる値になる。

このページのトップヘ