タップできる目次
- 1. IPv4
- 2. TCP
- 3. UDP
- 4. ICMP
- 4.1 Destination Unreachable Message – 到達不能メッセージ
- 4.2 Time Exceeded Message – 時間超過メッセージ
- 4.3 Parameter Problem Message – パラメータ異常メッセージ
- 4.4 Source Quench Message – 送信元抑制メッセージ
- 4.5 Redirect Message – リダイレクトメッセージ
- 4.7 Timestamp or Timestamp Reply Message Message – タイムスタンプ要求/応答メッセージ
- 4.8 Information Request or Information Reply Message – インフォメーション要求/応答メッセージ
- おすすめ書籍
1. IPv4
以下の図はRFC 791 からの抜粋です。この図をもとに説明します。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version
IPバージョンが格納されます。バージョンは4です。
IHL
4オクテット単位でIPヘッダーサイズを表します。IPヘッダーは最低20バイトなので、ここの値は最低でも5が格納されます。
Type of Service
TOS値が入ります。
Identification
ID番号が格納されます。パケットがフラグメント化された際はこのID番号を基に再構築されます。
Flags
3ビットのフラグはフラグメント状態を示します。
Fragment Offset
先頭パケットからのオフセット値を8オクテット単位で示します。
Time to Live
TTLが格納されます。Protocol上位プロトコルのプロトコル番号が格納されます。
Heaer Checksum
IPヘッダーのチェックサムが格納されます。
Source Address
送信元IPアドレスが格納されます。
Destination Address
送信先IPアドレスが格納されます。
Options
タイムスタンプやソールルーティングなどオプションがあればここに格納されます。
Padding
IPヘッダーのオプションは可変長のため4の倍数に収まるようにパディングします。
2. TCP
以下の図はRFC793 からの抜粋です。この図をもとに説明します。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Source Port
送信元ポート番号が格納されます。
Destination Port
送信先ポート番号が格納されます。
Sequence Number
シーケンス番号が格納されます。
Acknowledgment Number
確認応答番号が格納されます。
Data Offset
4オクテット単位でTCPヘッダーのサイズを表します。TCPヘッダーは最低20バイトなので最低でも5が格納されます。
Reserved
予約領域です。常に0が格納されます。
URG
緊急ポインタを示すフラグです。
ACK
確認応答を示すACKフラグを示すフラグです。
PSH
データ送信要求時に使用されるフラグです。
RST
コネクションのリセットを示すフラグです。SYN3WAYハンドシェークで使用される同期要求を示すフラグです。
FIN
送信するデータがない事を示し、コネクションの終了を示すフラグです。
Window
ウィンドウサイズが格納されます。この値は送信者が確認応答を待たず送信できるサイズを示します。
Checksum
チェックサムが格納されます。
Urgent Pointer
緊急ポインタは正しくは帯域外データの最後のバイトを指す現在のシーケンス番号からのオフセット値を格納します。RFC793の説明(緊急ポインタが帯域外データの次のバイトを指す)は間違っていて、RFC 1122 の4.2.2.4で訂正していますが、現在のTCP/IPの実装はRFC793の動作をエミュレートしています。
Options
可変長のTCPオプションが格納されます。
Padding
4の倍数に収まるように、Paddingします。
3. UDP
以下の図はRFC768 からの抜粋です。この図をもとに説明します。
0 7 8 15 16 23 24 31 +--------+--------+--------+--------+ | Source | Destination | | Port | Port | +--------+--------+--------+--------+ | | | | Length | Checksum | +--------+--------+--------+--------+ | | data octets ... +---------------- ...
Source Port
送信元ポート番号が格納されます。
Destination Port
送信先ポート番号が格納されます。
Length
UDPヘッダーと後続のデータサイズの合計が格納されます。
Checksum
チェックサムが格納されます。UDPのチェックサムは0にすることもできます。0にした場合は、受信側がチェックサムの計算をおこなわないため、途中でパケットが壊れていても検知することができません。
4. ICMP
RFC792 から抜粋した図をもとに説明します。
ICMPはその性質上さまざまなタイプがありますが、多くはセキュリティの問題からファイアウォールで弾かれるか受信したネットワーク機器側で破棄されることに注意してください。
4.1 Destination Unreachable Message – 到達不能メッセージ
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Header + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
データグラムの宛先フィールドに指定されたネットワークへ到達できなかった場合、ゲートウェイはデータグラムの送信元ホストへ到達不能メッセージを送信してもよい。また、送信先ポート番号の動作していない場合やプロトコルモジュールが動作していない場合、宛先ホストは送信元ホストへ到達不能メッセージを送信してもよい。別のケースとして、転送にフラグメント化が必要だがDFフラグがセットされていて転送できない場合、ゲートウェイはデータグラムを破棄せねばならず、送信元ホストへ到達不能メッセージを送信してもよい。
Type
タイプコードは「3」
Code
0 – ネットワーク到達不能
1 – ホスト到達不能
2 – プロトコル到達不能
3 – ポート到達不能
4 – フラグメント化が必要だがDF(Don’t Fragment)がセットされている
5 – ソースルーティング不能
6 – 宛先ネットワーク不明
7 – 宛先ホスト不明
8 – 発信元ホストが孤立
9 – 宛先ネットワークへの通信禁止
10 – 宛先ホストへの通信禁止
11 – TOSに対してネットワーク到達不能
12 – TOSに対してホスト到達不能
13 – 通信禁止
14 – ホスト優先度違反
15 – 優先度が低い
Checksum
チェックサム
unused
ここは使用しない
Internet Header + 64bits of Original Data Datagram
到達不能を送信する元となったパケットのIPヘッダとそれに続く8バイトのデータを格納する
4.2 Time Exceeded Message – 時間超過メッセージ
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer | unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Header + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
データグラム処理中にTTLが0になった場合、ゲートウェイはデータグラムを破棄しなければならない。その際、ゲートウェイは送信元ホストへ時間超過メッセージを送信してもよい。また、フラグメント化されたデータグラムをホストが再構築するとき、制限時間内に再構築が完了できなければホストはデータグラムを破棄しなければならず、その際時間超過メッセージを送信してもよい。
Type
タイプコードは「11」
Code
0 – 生存時間を超過した
1 – フラグメント再構築時間を超過した
Checksum
チェックサム
unused
ここは使用しない
Internet Header + 64bits of Original Data Datagram
時間超過を送信する元となったパケットのIPヘッダとそれに続く8バイトのデータを格納する
4.3 Parameter Problem Message – パラメータ異常メッセージ
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer | unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Header + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
データグラムを処理しているゲートウェイまたはホストがヘッダパラメータに問題を発見し処理できない場合、データグラムを破棄しなければならない。その際、ゲートウェイまたはホストは送信元ホストへパラメータ異常メッセージを送信してもよい。
ポインタは元のデータグラムのヘッダ内のエラーが検出されたオクテットを示す位置を表す。
Type
タイプコードは「12」
Code
0 – エラーを指すポインタ
Checksum
チェックサム
Pointer
Codeが0の場合、エラーが見つかったオクテットを指す
unused
未使用
Internet Header + 64bits of Original Data Datagram
パラメータ異常を送信する元となったパケットのIPヘッダとそれに続く8バイトのデータを格納する
4.4 Source Quench Message – 送信元抑制メッセージ
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Header + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ゲートウェイがデータグラムを送信するために必要なバッファ領域が不足した場合、ゲートウェイはデータグラムを破棄してもよい。データグラムを破棄した場合、ゲートウェイは送信元ホストへ送信元抑制メッセージを送信してもよい。また、宛先ホストに処理能力を超えるトラフィックが到達した場合、宛先ホストは送信元ホストへ送信元抑制メッセージを送信してもよい。
Type
タイプコードは「4」
Code
Codeは「0」
Checksum
チェックサム
unused
未使用
Internet Header + 64bits of Original Data Datagram
送信元抑制を送信する元になったパケットのIPヘッダとそれに続く8バイトのデータを格納する
4.5 Redirect Message – リダイレクトメッセージ
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Gateway Internet Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Header + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
送信元ホストからデータグラムを受信した際、ネクストホップが送信元ホストと同じネットワーク上にあれば、ゲートウェイは送信元ホストへリダイレクトメッセーを送信してもよい。
IPソールルートオプションのアドレスフィールドにゲートウェイアドレスが含まれている場合、ゲートウェイはリダイレクトメッセージを送信しない。
Type
タイプコードは「5」Code
0 – ネットワークのためのリダイレクトデータグラム
1 – ホストのためのリダイレクトデータグラム
2 – サービス種別とネットワークのためのリダイレクトデータグラム
3 – サービス種別とホストのためのリダイレクトデータグラム
Checksum
チェックサム
Gateway Internet Address
本来送信されるべきゲートウェイのIPアドレス
unused
未使用
Internet Header + 64bits of Original Data Datagram
リダイレクトメッセージを送信する元になったパケットのIPヘッダとそれに続く8バイトのデータを格納する
4.6 Echo or Echo Reply Message – エコー要求/応答
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data ... +-+-+-+-+-
エコー要求メッセージにデータが含まれている場合、エコー応答に受信したデータを返送しなければならない。
ID番号とシーケンス番号は、エコー要求送信者がエコー要求とその応答を対応させるために使用する。シーケンス番号は送信するたびに増加させてもよい。エコー応答送信者は、エコー応答を送信する際に同じ値を返す。
Type
8 – エコー要求
0 – エコー応答
Code
コードは「0」
Checksum
チェックサム
Identifier
ID番号(0でも良い)
Sequence Number
シーケンス番号(0でも良い)
4.7 Timestamp or Timestamp Reply Message Message – タイムスタンプ要求/応答メッセージ
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Originate Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Receive Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Transmit Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ID番号とシーケンス番号は、タイムスタンプ要求送信者がタイムスタンプ要求とその応答を対応させるために使用する。シーケンス番号は送信するたびに増加させてもよい。タイムスタンプ応答送信者は、タイムスタンプ応答を送信する際に同じ値を返す。
Type
13 – タイムスタンプ要求
24 – タイムスタンプ応答
Code
コードは「0」
Checksum
チェックサム
Identifier
ID番号
Sequence Number
シーケンス番号
Originate Timestamp
送信者が送信した時刻
Receive Timestamp
受信者が受信した時刻
Transmit Timestamp
受信者が返送した時刻
4.8 Information Request or Information Reply Message – インフォメーション要求/応答メッセージ
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ID番号とシーケンス番号は、インフォメーション要求送信者がタイムスタンプ要求とその応答を対応させるために使用する。シーケンス番号は送信するたびに増加させてもよい。インフォメーション応答送信者は、インフォメーション応答を送信する際に同じ値を返す。
Type
15 – インフォメーション要求
16 – インフォメーション応答
Code
コードは「0」
Checksum
チェックサム
Identifier
ID番号
Sequence Number
シーケンス番号