1.ICMP
ICMP(Internet Control Message Protocol)というと耳慣れないが、pingコマンドと聞けば、身近であろう。
ICMPは,ネットワーク層で動作し,通信相手との接続性を確認したりするプロトコルです。ICMPの代表的なコマンドがpingとtracert(またはtraceroute)です。
pingコマンドでは、通信相手にエコー要求(Echo Request)を送信すると、通信相手が正常に動作していれば、正常である旨を示すエコー応答(Echo Reply)が返ってきます。トラブルシューティングにも活用されます。
※Windowsのコマンドプロンプトではtracert、Ciscoなどのネットワーク機器ではtracerouteがほとんど。
では早速、pingを打ってみよう。pingコマンド(Echo Request)によって,8.8.8.8の端末が動作しているかどうかを確認した結果です。「Reply from 8.8.8.8」とあり(Echo Reply),これが8.8.8.8の端末が正常に動作していることのメッセージです。
・環境を変えてpingを打ってみると、色々なメッセージがでるので試してみましょう。
例えば、以下の構成があります。
■Case1
PCから、192.168.2.0/24の存在しないIPアドレスにPingを打ってみましょう。
ping 192.168.2.100
このように、「タイムアウト」と表示されます。
■Case2
PCから、ルータが知らないネットワークにpingを打ちましょう。
今度は「宛先ホストに到達できません」と出ます。しかも、そのメッセージを返しているのは、192.168.1.254なので、Ciscoルータです。
Case1の場合は、pingを送っても、相手からの応答がないので、PCが「タイムアウト」というメッセージを出し、Case2の場合は、デフォルトGWであるルータまで届くのですが、ルータからは宛先が無いので、「到達できません」というメッセージを返しています。
その通りです。メッセージの中身を理解しておくと、実践での切り分けにも役立ちますよ!
ネットワークスペシャリスト試験の過去問では、ICMPに関して「TCP/IP環境において、pingによってホストの接続確認をするときに使用されるプロトコル(H20NW午前 問31)」、「送信元ホストへのIPパケットの送信エラー報告などの制御メッセージを通知する。(H19NW午前 問24)」「ネットワーク機器の接続状態を調べるためのコマンドpingが用いるプロトコル(H18NW午前 問28)」と述べている。
▼過去問
過去問(H19秋NW午前) |
---|
問24 TCP/IPのネットワークにおけるICMPの説明として,適切なものはどれか。 ア MACアドレスだけが分かっているときにIPアドレスの解決を可能にする。 イ グローバルIPアドレスとプライベートIPアドレスを相互に変換する。 ウ 送信元ホストへのIPパケットの送信エラー報告などの制御メッセージを通知する。 エ ネットワーク内のIPアドレスを一元管理し,クライアントに動的に割り当てる。 |
↓
↓
↓
↓
↓
正解はウ
アはRARP、イはNAT、ウがICMP、エはDHCP
過去問(H20秋NW午前) |
---|
問31 TCP/IP環境において, pingによってホストの接続確認をするときに使用されるプロトコルはどれか。 ア CHAP イ ICMP ウ SMTP エ SNMP |
↓
↓
↓
↓
↓
正解はイのICMP
過去問(H26春FE午前) |
---|
問34 IPネットワークにおいて,ICMPのエコー要求,エコー応答,到達不能メッセージなどによって,通信相手との接続性を確認するコマンドはどれか。 ア arp イ echo ウ ipconfig エ ping |
↓
↓
↓
↓
↓
正解:エ
2.ICMPのフレーム
▼フレームフォーマット
・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など。
▼ICMPのフレームフォーマット詳細解説
※Type(8)のEcho Requestの場合
(1)ヘッダ
①Type(1)
②Code(1)
③チェックサム(2)
④識別子(2)
⑤シーケンス番号(2)
⑥データ(可変)
(2)Typeの例
0 Echo Reply :pingコマンドの応答パケット
3 Destination Unreachable
※前の記事の、ルータが知らないセグメントにpingを打った場合に、ルータがこのメッセージを返した。
4 Source Quench
5 Redirect :ICMPリダイレクト
8 Echo Request :pingコマンドを実行した場合
11 Time Exceeded: 定められた生存時間(TTL:Time To Live)を超えた(Exceeded)とうことで、パケットを破棄したことを通知するメッセージ。tracerouteは、この仕組みを利用している。
▼実際のキャプチャ例
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)フィールドがあり、パケットの優先順位をつけることができる。しかしあまり使われていない。
3.ICMPのTypeとCode
(1)Type
ICMPメッセージの種類を表します。8ビット。
タイプ | メッセージの種類 | 解説 |
---|---|---|
0 | Echo Reply (エコー応答) |
ping コマンドの応答パケットで、正常に応答したことを表す |
3 | Destination Unreachable (宛先到達不能) |
宛先に到達不能であることを表す ・ コード0:Network Unreachable(宛先のネットワークに到達不能) ・ コード1:Host Unreachable(宛先のホストに到達不能) |
4 | Source Quench | |
5 | Redirect (経路変更) |
より最適な経路があることを表す |
8 | Echo (エコー要求) |
ping コマンドの要求パケットで、通信相手との接続性を確認するために送る |
11 | Time Exceeded (時間超過) |
定められた生存時間(TTL:Time To Live)を超えた(Exceeded)ため、パケットを破棄したことを表す |
12 | Parameter Problem | |
13 | Timestamp | |
14 | Timestamp Reply | |
15 | Information Request | |
16 | Information Reply |
*TTLは、何台の機器を通過することができるかを示し、その値は機器ごとに異なります。たとえば、ping を送信した相手がWindows の場合は128(台)、Linux の場合は64(台)、Cisco ルータの場合は256(台)です。
(2)Code
Codeは、Typeの内容の詳細である。8ビット。
例えば、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 より
4.ICMPリダイレクト
ルーティングにおいて、より適切なルータがある場合にそれを伝えるICMP(Type5)のメッセージ。このICMPパケットの中で、Gatewaya Addressという情報があり、より適切なGateway(ルータ)情報を送る。私は昔、ICMPリダイレクトはICMPパケットだけだと勘違いしていましたが、そうではなかったです。
以下の構成図で考えます。
PCのデフォルトゲーウェイは 192.168.1.254のIPアドレスを持つ R1(下図①)です。 PCが 172.16.1.0/24のネットワークに通信する場合 のネットワークに通信する場合,まずはデフォルトゲーウェイであるR1にパケットを送ります(下図②)。 R1はそのパケットを R2に転送(下図③)し ,172.16.1.0/24のネットワークにパケットが届きます(下図④)。
そこで,もっといい経路があることを伝えるのがICMPリダイレクトです。
▼ネットワークスペシャリスト試験の過去問を見てみましょう。
過去問(H29秋NW午前2) |
---|
問7 IPv4におけるICMPのメッセージに関する説明として,適切なものはどれか。 ア 送信元が設定したソースルーティングが失敗した場合は, Echo Reply を返す。 イ 転送されてきたデータグラムを受信したルータが,そのネットワークの最適なルータを送信元に通知して経路の変更を要請するには, Redirectを使用する。 ウ フラグメントの再組立て中にタイムアウトが発生した場合は,データグラムを破棄してParameter Problem を返す。 エ ルータでメッセージを転送する際に,受信側のバッファがあふれた場合はTimeExceededを送り,送信ホストに送信を抑制することを促す。 |
↓
↓
↓
↓
↓
ア:Echo Replyは、正常に応答した場合のメッセージです。
イ:正解選択肢です。
ウ:タイムアウトが発生しているので、時間が超過したことを意味するTime Exceededを送ります。
エ:送信を抑制するSource Quenchを送ります。
5.【参考】tracerouteの仕組み
tracerouteは、ICMPのタイプ11(Time Exceeded)を使って、経由するルータを調べることができるコマンドです。ネットワークの障害時の切り分けなどにも利用されます。
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)であることがわかります。
PingがNGになるものでも、途中までは経路がわかるのが不思議です。
PingがNGになる場合、最終的な宛先に届かなくても、途中の経路までは届く場合があります。たとえば、最終的な宛先のFirewallで拒否されている場合や、最終的な宛先の直前のルーティングが間違っている場合などです。
tracerouteの仕組みを説明したように、最終的な宛先に関係なく、順次TTLを増やしていくので、PingがNGでも途中までの経路がわかる場合があるんのです。
以下、TracerouteのICMPコマンドです。Echo requestをTTL1で送り、その結果としてTime Exceededが返ってきた様子が分かります。そして、その下の行はTTLが2になっています。
みなさんも確認してみてください。
6.【参考】TTL
試験には出ないので、余談として。
TTLは、パケットが無限にループして流れ続けることをを防止するためのもので、TTLが0になると破棄されます。
TTLは装置ごとに違います。たとえば、WindowsXPパソコンからpingを打つとLinuxサーバは64、Ciscoルータは255から始まる。
ちなみに、Windowsパソコンは128から始まるので、ICMPのEcho RequestのTTLは128、Echo Replyは64と異なる値になる。
この仕組みを利用すれば、pingの応答のTTLによって、通信相手がどんな機器か、予測を付けることができる。
以下はwww.yahoo.co.jpにpingを打った結果です。YahooはLinuxサーバだと想定されるので、TTLのスタートは64。私の家までに64-54=10台のL3装置(ルータ)があると想定されます。※Tracerouteの場合と、経由する値が異なるのでこの点は疑問。