IPv4パケットヘッダー構造#
IPv4(Internet Protocol version 4)のパケットは、先頭に付与されるヘッダーと、その後に続くデータ(ペイロード)から構成されています。ヘッダーは32ビット(4バイト)単位の行が積み重なる形で定義されており、基本部分は20バイト、オプションを含めると最大60バイトになります。ここでは各フィールドの役割について解説します。
各フィールドの説明#
| フィールド名 | サイズ | 説明 |
|---|---|---|
| バージョン (Version) | 4 ビット | IPのバージョンを示す。IPv4では固定値 4 が入る。 |
| IHL (Internet Header Length) | 4 ビット | ヘッダー長を32ビット(4バイト)単位で表す。オプションがない場合の最小値は5(=20バイト)、最大値は15(=60バイト)。 |
| サービスタイプ (Type of Service / DSCP + ECN) | 8 ビット | パケットの優先度や輻輳通知を制御するフィールド。上位6ビットがDSCP(Differentiated Services Code Point)、下位2ビットがECN(Explicit Congestion Notification)として使用される。 |
| 全長 (Total Length) | 16 ビット | IPヘッダーとデータを合わせたパケット全体のバイト数。最大65535バイトまで表現できる。 |
| 識別子 (Identification) | 16 ビット | パケットを分割(フラグメント化)した際に、同一パケットから分割されたことを識別するための値。 |
| フラグ (Flags) | 3 ビット | フラグメント制御用のビット列。bit0は予約(0固定)、bit1はDF(Don’t Fragment、分割禁止)、bit2はMF(More Fragments、後続フラグメントの有無)を表す。 |
| フラグメントオフセット (Fragment Offset) | 13 ビット | 分割されたデータが元のパケットの先頭から何バイト目(8バイト単位)に位置するかを示す。 |
| 生存時間 (TTL / Time To Live) | 8 ビット | パケットが経由できるルータの最大ホップ数。ルータを1つ経由するごとに1減算され、0になった時点で破棄される。ループするパケットが永続することを防ぐための仕組み。 |
| プロトコル (Protocol) | 8 ビット | データ部分に格納されている上位層プロトコルの種別を示す。 |
| ヘッダーチェックサム (Header Checksum) | 16 ビット | IPヘッダー部分のみを対象とした誤り検出用のチェックサム。ルータを通過するたびにTTLが変化するため、都度再計算される。 |
| 送信元アドレス (Source Address) | 32 ビット | パケットの送信元IPアドレス。 |
| 宛先アドレス (Destination Address) | 32 ビット | パケットの宛先IPアドレス。 |
| オプション (Options) | 可変長(0〜40 バイト) | セキュリティやタイムスタンプ記録など、追加機能を指定する際に使用される任意のフィールド。存在する場合は32ビット境界に揃うようパディングが付加される。IHLが5より大きい場合にのみ存在する。 |
| データ (Data / Payload) | 可変長 | 上位層(TCP、UDP、ICMPなど)から渡されるデータ本体。 |
プロトコル値の代表例#
プロトコルフィールドの値は、データ部分に格納されている上位層プロトコルの種別を示します。代表的な値は以下の通りです。
| プロトコル値 | プロトコル |
|---|---|
1 | ICMP |
2 | IGMP |
6 | TCP |
17 | UDP |
41 | IPv6(IPv6カプセル化) |
47 | GRE |
50 | ESP(IPsec) |
51 | AH(IPsec) |
89 | OSPF |
132 | SCTP |
プロトコル番号はIANAが管理しており、割り当て済みの全一覧は以下で公開されています。
ヘッダー長とフラグメンテーション#
IHLはあくまでヘッダー長のみを表す値であり、パケット全体の長さはTotal Lengthフィールドで別途表される。
| 項目 | サイズ | 備考 |
|---|---|---|
| IPヘッダー(オプションなし) | 20 バイト | IHL = 5 の場合。最も一般的な構成。 |
| IPヘッダー(オプションあり) | 24〜60 バイト | IHL = 6〜15 の場合。4バイト単位で増加する。 |
| IPパケット全体 | 最大65535 バイト | Total Lengthフィールドで表現できる上限値。 |
経路上のリンクのMTU(Maximum Transmission Unit)よりもパケットサイズが大きい場合、送信元またはルータによってパケットが分割(フラグメンテーション)されます。分割されたパケットは、識別子・フラグ・フラグメントオフセットの各フィールドを用いて受信側で再構成されます。ただしDFビットが立っている場合は分割が禁止され、MTUを超えるパケットは破棄されてICMP到達不能メッセージが送信元へ返されます。
関連RFC#
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 791 | Internet Protocol | IPv4の原典。ヘッダー構造やフラグメンテーション、TTLなど基本フォーマットを定義。 |