本サイトはプロモーションを含みます。

TCP/IPヘッダ構造

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

シーケンス番号

おすすめ書籍