PR

UDPヘッダーとは?4つのフィールドとIPv4・IPv6のチェックサムを解説

ネットワーク
スポンサーリンク

はじめに

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ビット
送信元ポート番号宛先ポート番号
LengthChecksum

基本の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とは?ネットワーク層の役割やルーティングを初心者向けに分かりやすく解説を参照してください。

チェックサム計算の流れ

送信側では、概ね次の手順でチェックサムを計算します。

  1. UDPヘッダーのChecksumフィールドを0にする
  2. IP情報から疑似ヘッダーを作る
  3. 疑似ヘッダー、UDPヘッダー、UDPデータを16ビット単位で並べる
  4. 桁あふれを最下位へ足し戻す1の補数加算で合計する
  5. 合計値の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を省略できるかどうかが異なります。

項目IPv4IPv6
通常のChecksum使用を推奨原則として必須
Checksumが0未計算を表せる受信側は原則として破棄
計算結果が0FFFFを格納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情報を含む範囲を検査するという違いが重要です。

関連記事


コメント

タイトルとURLをコピーしました