まず、ICMPツールを作成する前に、ICMPについて調べる必要があります。
日本語約を提供している方のページを参考にします。
<RFC792>
ftp://ftp.rfc-editor.org/in-notes/rfc792.txt
<RFC792 日本語訳>
http://srgia.com/docs/rfc792j.html
ICMPの主な特徴としては、以下の通りとなります。
- ICMP通信時に発生した問題をフィードバックする
- 信頼性を高める為に存在しているわけでは無い
- ICMPに対するICMPのメッセージは存在しない
また、ICMPはそのメッセージの内容によってヘッダが変わります。
メッセージの種類としては、以下の通りです。
- Destination Unreachable Message(宛先到達不能メッセージ)
- Time Exceeded Message(時間切れメッセージ)
- Parameter Problem Message(パラメータ異常メッセージ)
- Source Quench Message(送信元抑制メッセージ )
- Redirect Message(リダイレクトメッセージ)
- Echo or Echo Reply Message(エコー・エコーリプライメッセージ)
- Timestamp or Timestamp Reply Message(タイムスタンプ・タイムスタンプリプライメッセージ)
- Information Request or Information Reply Message(情報リクエスト・情報リプライメッセージ)
- Address mask request or Address mask Reply Message
(アドレスマスク要求・アドレスマスク応答メッセージ)
※アドレスマスクに関してはRFC950から追加されているICMPメッセージです。
http://tools.ietf.org/html/rfc950
<RFC950 日本語訳>
http://www2s.biglobe.ne.jp/~hig/rfc/rfc950j.txt
ICMPは階層としてはTCP/UDPと同等レベルのプロトコルになります。 ルータを超えて通信する必要がある為、IP上に実装されています。よって、まずインターネットヘッダについて確認します。
インターネット(IP)ヘッダーのフィールドについては、上述したメッセージの種類によって異なりますが、 基本的には以下の通りになります。
フィールド名 | 値 | ビット長 | 備考 |
---|---|---|---|
Version | 4 | 4 | "基本的"にIPのバージョンは4です。 |
IHL | 32 ビットワード単位のインターネットヘッダ長 | 4 | IPヘッダのサイズを表します。 |
Type of Service | 0 | 8 | IPパケットの優先度などの情報が入ります。要確認 |
Total Length | インターネットヘッダ及びデータのオクテット単位の長さ | 16 | IHLにIPデータのビット数を足した値 |
Identification | フラグメント化時に利用される。 | 16 | RFC791を参照要確認 |
Flags | 3 | RFC791を参照要確認 | |
Fragment Offset | 13 | RFC791を参照要確認 | |
Time to Live | 通過出来るゲートウェイ(ルータ)の数を設定します。 | 8 | ゲートウェイを通過する毎に1づつ減っていきます。0になるとそのパケットは破棄されます。 |
Protocol | 1 | 8 | ICMPの場合は常に"1"になります。要確認 |
Header Checksum | IPヘッダのチェックサムになります。 | 16 | |
Source Address | ICMP メッセージを作成したゲートウェイまたはホストのアドレス | 32 | RFCには「Unless otherwise noted, this can be any of a gateway's addresses」と記載されている。要確認 |
Destination Address | 宛先のアドレス | 32 |
IPヘッダについては後で掘り下げて確認します。
ICMPのメッセージヘッダは、各メッセージ毎の変わってくるので、 まずは、PingでおなじみのEcho Request及びEcho Replyで確認します。
フィールド名 | 値 | ビット長 | 備考 |
---|---|---|---|
Type | 0 or 8 | 8 | Echo Requestは0、Replyは8となります。 |
Code | 0 | 8 | |
Checksum | 16 | 要確認 | |
Identifier | 0 | 16 | Codeが0の時の、EchoとReplyを対応させる為の識別子 「may be zero」要確認 |
Sequence Number | 0 | 16 | Codeが0の時の、EchoとReplyを対応させる為の識別子 「may be zero」要確認 |
Data | 可変長 | 16 | IPデータグラムの実際の送信できるサイズに制限されます。 |