はじめに
UDPは、通信前の接続確立や再送制御を行わず、データをUDPデータグラム単位で送るトランスポート層のプロトコルです。UDPデータグラムの先頭には、宛先となるアプリケーションやデータの長さ、誤りの検出に必要な情報をまとめたUDPヘッダーが付きます。
UDPヘッダーは固定8バイトで、送信元ポート番号、宛先ポート番号、Length、Checksumの4つのフィールドから構成されます。この記事では、各フィールドの役割と、疑似ヘッダーを含めて計算するチェックサム、IPv4とIPv6で異なる扱いを解説します。
この記事で分かること
- UDPヘッダーの大きさと構成
- 4つのフィールドが表す情報
- LengthとChecksumの役割
- 疑似ヘッダーをチェックサム計算に含める理由
- IPv4とIPv6で異なるチェックサムの扱い
UDPヘッダーとは
UDPヘッダーは、UDPでデータを送るために必要な制御情報を格納する部分です。各フィールドは16ビットで、合計は64ビット、つまり8バイトになります。UDPの基本的な役割やTCPとの違いは、トランスポート層とは?役割とTCP・UDPの違いを分かりやすく解説で解説しています。
| 0~15ビット | 16~31ビット |
|---|---|
| 送信元ポート番号 | 宛先ポート番号 |
| Length | Checksum |
基本のUDPヘッダーは、この4フィールドからなる固定8バイトの構造です。UDPで送るデータは、ヘッダーの後ろに続きます。
送信元ポート番号
送信元ポート番号は、送信したアプリケーションのポート番号を表します。受信側が応答を返す場合は、通常、この番号を応答先のポートとして利用します。
このフィールドを使用しない場合、仕様上は0を設定できます。ただし、0は「返信が不要」という意味を直接表す値ではなく、送信元ポート番号を指定していないことを表します。現在のUDP利用指針では、送信元ポート番号に0を使わないことが推奨されています。
宛先ポート番号
宛先ポート番号は、受信側でデータを渡すアプリケーションを識別するための番号です。同じ端末で複数のアプリケーションが通信していても、宛先ポート番号によって渡し先を区別できます。
実際の通信は、IPアドレス、ポート番号、UDPというプロトコルの組み合わせで識別されます。そのため、宛先ポート番号だけで通信相手の端末まで特定するわけではありません。
ポート番号の3つの範囲や、IPアドレスと組み合わせて通信を識別する仕組みは、ポート番号とは?3つの範囲と通信を識別する仕組みを解説で詳しく解説しています。
Length
Lengthは、UDPヘッダーとUDPデータを合わせた長さをバイト単位で表します。通常のUDPデータグラムではヘッダーだけで8バイトあるため、Lengthの最小値は8です。
例えば、UDPで20バイトのデータを送る場合、Lengthはヘッダー8バイトとデータ20バイトを合わせた28になります。Lengthはチェックサムの対象範囲そのものを示すフィールドではなく、UDPデータグラム全体の長さを示すフィールドです。
Checksum
Checksumは、UDPヘッダーとデータが通信途中で壊れていないかを検出するための16ビットの値です。計算にはUDPヘッダーとデータだけでなく、IPヘッダーの一部から作る疑似ヘッダーも使用します。
チェックサムは誤りを検出するための仕組みであり、暗号化や改ざん防止を行うものではありません。また、チェックサムが一致しても、データが絶対に正しいことを保証するわけではありません。
UDPチェックサムが検査する範囲
UDPチェックサムは、次の3つを対象に計算します。
- IP情報から作る疑似ヘッダー
- UDPヘッダー
- UDPデータ
UDPヘッダー内のChecksumフィールドは、計算時には0として扱います。データの長さが16ビット単位にそろわない場合は、計算上だけ末尾へ0を補います。この0は、実際のUDPデータとして送信されません。
疑似ヘッダーを含める理由
疑似ヘッダーは、チェックサム計算のために使用する仮想的な情報です。UDPヘッダーの一部として送信されるわけではありません。
疑似ヘッダーには、送信元IPアドレス、宛先IPアドレス、UDPを示すプロトコル番号またはNext Header、UDPの長さが含まれます。これらを計算に含めることで、UDPヘッダーやデータの破損に加え、宛先IPアドレスなどの誤りによる誤配送も検出対象に含められます。
IPアドレスとネットワーク層の役割は、IPとは?ネットワーク層の役割やルーティングを初心者向けに分かりやすく解説を参照してください。
チェックサム計算の流れ
送信側では、概ね次の手順でチェックサムを計算します。
- UDPヘッダーのChecksumフィールドを0にする
- IP情報から疑似ヘッダーを作る
- 疑似ヘッダー、UDPヘッダー、UDPデータを16ビット単位で並べる
- 桁あふれを最下位へ足し戻す1の補数加算で合計する
- 合計値の1の補数をChecksumフィールドへ設定する
受信側は、受信したChecksumを0にせず、疑似ヘッダー、UDPヘッダー、UDPデータを同じ方法で合計します。破損がなければ計算結果は16ビットすべてが1になり、異なる結果なら通信途中でデータや関連情報が壊れた可能性があります。
0とFFFFが示す意味
最終的にChecksumフィールドへ設定する値が0になる場合は、16ビットすべてが1の値であるFFFFを格納します。
IPv4では、Checksumがすべて0なら「チェックサムを生成していない」ことを表します。計算結果が0のときにFFFFへ置き換えることで、未計算を表す全0と区別します。
IPv4とIPv6で異なるチェックサムの扱い
UDPヘッダーの構造はIPv4でもIPv6でも同じですが、Checksumを省略できるかどうかが異なります。
| 項目 | IPv4 | IPv6 |
|---|---|---|
| 通常のChecksum | 使用を推奨 | 原則として必須 |
| Checksumが0 | 未計算を表せる | 受信側は原則として破棄 |
| 計算結果が0 | FFFFを格納 | FFFFを格納 |
| 疑似ヘッダー | IPv4アドレスなどを使用 | IPv6アドレスなどを使用 |
IPv4では、Checksumフィールドを0にしてチェックサムを省略できます。一方、IPv6では通常のUDP通信でチェックサムを計算する必要があり、Checksumが0のUDPデータグラムは原則として受け付けません。
IPv6にも、条件を満たす一部のUDPトンネルでゼロチェックサムを使用できる例外があります。ただし、一般的なUDPアプリケーションへ広く適用できる例外ではありません。基本的には「IPv4では省略可能、IPv6では必須」と理解します。
まとめ
UDPヘッダーは固定8バイトで、送信元ポート番号、宛先ポート番号、Length、Checksumの4つのフィールドから構成されます。
- 送信元ポート番号は送信したアプリケーションを示す
- 宛先ポート番号は受信側でデータを渡すアプリケーションを示す
- LengthはUDPヘッダーとデータを合わせた長さを示す
- Checksumは疑似ヘッダー、UDPヘッダー、データを対象に誤りを検出する
- 計算結果が0なら
FFFFを設定する - IPv4ではチェックサムを省略できるが、IPv6では原則として必須である
UDPヘッダーは項目数が少ないため、各フィールドの役割を分けて理解すると全体像をつかみやすくなります。特に、Lengthはデータグラム全体の長さを示し、ChecksumはIP情報を含む範囲を検査するという違いが重要です。


コメント