ICMPとネットワーク
ICMPは送信したデータが届かなかったとき、また障害があったときに利用されるプロトコルです。パソコンを操作するときに意識することはあまりないかもしれません。
ポートが無い(使わない)プロトコルなので、パーソナルファイアーウォールのログではポートN/A、などと表示されることもあります。
ICMPはそれぞれTypeごとに分けられ、そして一部はCode(Subtype)により細かく分類されます。
Type | 表示 | 内容 |
0 | Echo Reply | エコー応答Echo Reply(エコー応答)(pingなど) |
3 | Destination Unreachable | 宛先到達不可(宛先の相手が存在しなかった、もしくは障害中) |
4 | Source Quench | 発信制御(受信元のパソコンが送信元に、処理が追いつかないので転送を止めてほしいとリクエスト、など) |
5 | Redirect | ルート変更(ルーター増設時などに最適経路を発見したときに利用)。表示されると一瞬びっくりします |
8 | Echo Request | エコー要求(pingなど) |
11 | Time Exceeded for a Datagram | 時間超過 |
12 | Parameter Problem on a Datagram | パラメーター問題(IPヘッダに問題があったとき、受信側が送信側に送る) |
13 | Timestamp Request | タイムスタンプ要求 |
14 | Timestamp Reply | タイムスタンプ応答 |
15 | Information Request | 情報要求 |
16 | Information Reply | 情報応答 |
17 | Address Mask Request | アドレスマスク要求(自分が所属しているサブネットのサブネットマスクを知ろうとしたパソコンが送信する) |
18 | Address Mask Reply | アドレスマスク応答 |
Type3のDestination UnreachableとType11のTime ExceededのIncomingをパーソナルファイアーウォールでブロックしてしまうと、途中の経路に障害があったときのブラウザの再表示やファイルのダウンロードが極度に遅くなるかもしれません。
難しいですね。まずType3のコードを見てみましょう。
Type3でのCode | 表示 | 内容 |
0 | Network Unreachabele | 到達不可。相手に届かない。導入したばかりのルーターが途中の経路の情報を持っていないときによく発生。よく見かける警告ですけどハッキングではないでしょう、多分 |
1 | Host Unreachable | 到達不可。コンピューターに届かない。相手が存在しなかったときなどに発生 |
2 | Protocol Unreachable | プロトコルに届かない |
3 | Port Unreachable | ポートに届かない。ポートスキャンの結果として表示されることもある |
4 | Fragmentation 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 | 宛先コンピューターとの通信がブロックされている |
11 | Destination Network Unreachable for Type of Service | このサービスではネットワークに届かない |
12 | Desination Host Unreachable for Type of Service | このサービスではコンピューターに届かない |
次の表はType11でのコード表です。これらは回線が不調・極端に低速(コリジョン発生時、Air'Hや低速なダイヤルアップモデム、混み過ぎるアクセスポイント利用時)な場合によく発生します。よく見かけるのはCode 0ですね。
Type11のCode | 内容 |
0 | 生存時間超過。生存時間(TTL:Time To Live)が切れたパケットがあったときに、送信元にICMP Time Exceeded Messageを返信 |
1 | パケットの流れが悪くて届かないものがあり、分割されたデータの結合に失敗 |
Pingについて
Pingコマンドは32BytesのEchoパケットを、NIC・パソコン・ルーターなどに送信するコマンドです。ネットワークの状況を確かめるために利用します。Windows NT系のユーザーの方なら、コマンドプロンプトから[ping (相手のIPアドレスかホスト名)]と打ち込んでみてください。
オプションからパケットサイズを変更したり、タイムアウトの時間を指定することもできます。
これはICMP(Internet Control Message Protocol)Echoパケットをホストに送り(Type 8: Echo Request)、Echo Reply(Type 0: Echo Reply)パケットを受け取るためのものです。
もし存在しないIPアドレスにPingを送信したとき。何も戻ってこない、もしくは経路上のルーターからType 3が送信されてくるかもしれません。
ICMPプロトコルなので、TCPやUDPと違ってポートは関係ありません。
ZoneAlarmというパーソナルファイアーウォールを利用しているなら、Pingを撃たれてブロックしたときに、remoteのIPアドレス:0,rocalのIPアドレス:0,ICMP (type:8/subtype:0)]のようなログが残ります。
どのようなときに使うのでしょう?
たとえばメールの受信ができなくなったとき。あなたの職場のゲートウェイのルーターに送信しても戻ってこなかったなら、LAN内部の障害。プロバイダーのメールサーバーにホスト名指定で送信しても戻らないなら、DNSサーバーの不調かメールサーバーの障害。メールサーバーへIPアドレスを指定して送信してみて、戻ってこなかったならメールサーバーの障害、というようにどこに問題があるのか確かめるための使い道もあります。
もちろん、Pingを返さないように設定されたサーバーもあります。
大変迷惑なことですけど。プロバイダーによっては利用者が接続しているのかを確かめる目的で、定期的にpingを撃つプロバイダーもいます。もしあなたがルーターやパーソナルファイアーウォールでこれをブロックすると、WEBに接続していないと判断されて勝手に切断されてしまいます。
いきなり見覚えのないIPアドレスからPingを撃たれると、ギョッとしますね。Pingはネットワークの状態を知るための手段で、これだけではハッキングや攻撃ではないのですけど。Pingを意味もなく送られる人にとっては、あまり気分のいいものではないのです。
Tracerouteについて
Pingはある特定のホストの状況を確認するものでした。これに対してTraceroutetは、目的とするノードまでのネットワーク経路情報を確認するために使います。TracerouteはWindowsのコマンドプロンプトから実行するときには、tracerouteではなくtracertと入力して利用します。
まずTTLを1にして、AからBにパケットを送信。TTLの数は途中の経路のルーターに到着するたびに1つずつ減らされます。Bに届いたパケットのTTLは0になり破棄され、BからAにICMP Time Exceeded Message(type: 11/code: 0)が返信されます。
次にAからTTLを2にして送信。Bを経由してCのルーターでTTLが0になり、CからAにICMP Time Exceeded Message(type: 11/code: 0)が返信されます。
これを繰り返してTTLを1つずつ増やして、目的のEまでの経路を調査していきます。ネットワーク上の地図作りのようなものです(この経路上のルーターの数をホップ数といいます)。Windowsならデフォルトの最大TTL値の30まで継続して調査します。
目的のEに到達したとき、EはEcho Reply(Type 0: Echo Reply)パケットをAに送信します。
もし途中の経路に問題があった・相手のEが実在しないときには、Type3(Destination Unreachable)でエラー通知されるでしょう(送ってくれない仕様のルーターもあります)
Tracerouteの結果として表示される時間は近くなら数msになります(Windows 2000では10msよりも短い時間は、time<10msとして表示されます)。
でも何か障害が起きていたり混雑していると、とっても長い時間になります(ときには数百ms!)。これで経路上のどの段階でトラブルが起きているのか判断することもできるでしょう。
表示される結果の例を書いてみます。
11 | 30ms | 29ms | 32ms | 12.34.56.XX |
12 | 44ms | 41ms | 40ms | 23.45.67.XX |
13 | * | * | * | Request time out. |
14 | 56ms | 59ms | 51ms | 34.45.56.XX |
一番左がホップ数です。
[ms]は時間です。
13番目では表示がおかしいです、なぜでしょう?それはこのルーターがType3(Destination Unreachable)の通知をこちらに送ってくれないように設定されているからでしょう。
TTLってなに?
生存時間(TTL:Time To Live)という意味です、でも誤解をまねきそうですね・・・これは時間そのものではなく、目的のホストにたどり着くまでに利用できる、経路上のルーターの数です。
あるホストへ送信されたパケットは、途中のルーターを通るときに、TTLを1つずつ減らされていきます。そしてTTLが1しか残っていないパケットが届いた経路上のルーターはパケットを捨てて、元々の送信者にICMP Time Exceeded Message(type: 11/code: 0)を送信して、パケットの破棄を伝えます。
難しい?それでは電車にたとえてみましょう♪
TTLを多くの電車を乗り継いで遠隔地へ向かうときの、切符のようなものと考えてください。そして経路上のルーターは駅の数、送信したホストはあなたの自宅です。
パケットはそれぞれの駅で電車を乗り換えて、少しずつ目的地へ近づいていきます。乗り換えのたびに、切符(TTL)を1つずつ使っていきます。
もし切符の残りが途中の駅までたどり着いたときに無くなってしまったなら、そこからあなたの家に、切符が切れましたと電話(ICMP Time Exceeded Message)することになるでしょう。
でもどうしてTTLは必要なのでしょう?
TTLがないと、誰かが送信したパケットがいつまでもさまよってしまいます。
これではいずれ、ネットワーク全体に負荷を与えてしまいます。ですから区切りをつけてパケットを破棄するのです。
誤解しているひとが多いのが、Pingコマンドの結果として表示されるTTL値です。
オプション[-i]から指定できるのは、あなたが送信するパケットのTTL。
これはPingコマンドの結果として表示されるTTLとは別のものです。
LAN内の他のパソコンへPingを送った結果を見てみましょう。
トポロジーはこのようになってます。
WAN | ルーター:1 | ルーター:2 | Windows 2000(今回Pingを送信したパソコン) |
Windows XP:1 | |||
Windows XP:2 |
Pingの結果はこのようになりました。
Windows XP:1 | Reply from 192.168.1.2: bytes=32 time<10ms TTL=128 |
ルーター2のLAN側IPアドレス | Reply from 192.168.1.1: bytes=32 time<10ms TTL=250 |
ルーター1のLAN側IPアドレス | Reply from 192.168.0.1: bytes=32 time<10ms TTL=63 |
ルーター2の、外側の(ルーター1へ接続するコネクタの)IPアドレス | Reply from 192.168.0.2: bytes=32 time<10ms TTL=250 |
ルーター1に直接接続されているWindows XP:2 | Reply from 192.168.0.3: bytes=32 time=<10ms TTL=127 |
PingのReplyでのTTLの値は、相手のOSによって、そしてルーターなどのネットワーク機器により異なり、Windows
XPでは128、ルーターによっては30・128・250・255など多様な値を返します。
この値から戻る途中の経路のルーターの数を差し引いた数のTTLが、Pingの結果として表示されます。
Windows XP:2へのPingのTTLが127になっているのは、128から1つTTLが引かれたためです。ルーター1でのTTL=63は、64から1つ引かれた数字です。
OS Finger Printと呼ばれる、相手が利用しているパソコンのOS、そして機器を特定するためのテクニックがあります。この目的の1つとして、TTLの値を元に判別することがあります。
参照文献
ICMP TYPE NUMBERS (IANAの文書です)http://www.iana.org/assignments/icmp-parameters