本講では、トランスポート層に求められる機能のうち「多重化と簡易な誤り検出」しか提供しない最小機能プロトコル UDP(User Datagram Protocol) を深掘りします。第17回で固めたポート・ソケット・多重化、第18回で扱った TCP の信頼性・コネクション・輻輳制御を踏まえ、対極にある「あえて何もしない」設計の合理性を見ます。8 バイトのヘッダ・コネクションレス性・無信頼性を図で確認し、DNS・DHCP・SNMP・VoIP・リアルタイム動画・オンラインゲーム・QUIC など、UDP が選ばれる用途とその設計上の理由を整理します。
本講を終えると、以下の問いに学術的な言葉で答えられるようになります。
送信側は sendto(socket, data, …, 宛先IP, 宛先ポート) を呼ぶたびに、独立した1個のデータグラムが送出されます。事前のセットアップは不要、送信後の確認も行いません。受信側は recvfrom でブロッキング待機し、届いたデータグラム単位でアプリに渡します。
TCP はコネクション指向で、データ送信前に3ウェイハンドシェイク(SYN → SYN+ACK → ACK)で双方向の論理回線を確立します。確立後はバイトストリームとしてデータを流し、シーケンス番号と確認応答(ACK)で確実な配送・順序保証・フロー制御・輻輳制御を提供します(詳細は 第18回 TCP)。
| 観点 | UDP | TCP |
|---|---|---|
| コネクション | なし(コネクションレス) | あり(3ウェイハンドシェイク) |
| 信頼性 | なし(再送・確認応答なし) | あり(ACK・再送) |
| 順序保証 | なし | あり(シーケンス番号で並べ直し) |
| フロー制御 | なし | あり(受信窓 RcvWindow) |
| 輻輳制御 | なし | あり(CongWin・AIMD 等) |
| ヘッダ長 | 固定 8 バイト | 最小 20 バイト(オプション含むと最大 60) |
| メッセージ境界 | 保たれる(データグラム単位) | 失われる(バイトストリーム) |
| 1対多通信 | マルチキャスト・ブロードキャスト可 | 1対1のみ |
| 典型用途 | DNS・DHCP・SNMP・VoIP・動画・ゲーム・QUIC | HTTP/1.1, 2 / SMTP / SSH / FTP / IMAP |
つながる知識: 「TCP は信頼性、UDP は速さ」という二分は正しい一方、QUIC(HTTP/3 が乗る)はUDP の上にアプリ層で TCP 相当の信頼性を実装するという、新しい中間設計です。発展編で扱います。
Q. なぜ動画のライブ配信や VoIP は UDP を選ぶのでしょうか?「TCP の方が確実なのでは?」と思った人は、ぜひ自分なりの仮説を立ててからクリック。
キーワードは「再送よりも時間優先」です。
つまり、用途によっては「全部届く」より「今届く」の方が大事、という判断です。
図の見方:UDP のヘッダは「送信元ポート / 宛先ポート / 長さ / チェックサム」の4つだけで、各 16 ビット = 計 64 ビット = 8 バイトです。TCP の最小 20 バイトと比べてとてもコンパクト。これがオーバーヘッドの小ささを生みます。
| フィールド | サイズ | 役割 |
|---|---|---|
| 送信元ポート | 16 bit | 送り手側のソケットを示す。応答が必要な場合の戻り口。クライアントがリクエスト時に動的ポートをここに入れる |
| 宛先ポート | 16 bit | 受け手側のソケットを示す。逆多重化の鍵となる必須情報 |
| 長さ | 16 bit | ヘッダ + データの合計バイト数(最小 8、上限は理論上 65535) |
| チェックサム | 16 bit | 誤り検出。16 ビットごとの和の1の補数で計算(後述) |
UDP チェックサムは、トランスポート層の誤り検出フィールドです。計算は次の手順で行います。
擬似ヘッダを混ぜるのは、IP 層のアドレスまで含めて誤りを検出するため(間違った宛先で届いたものを撥ねる)です。
IPv4 ではチェックサムを省略可能(計算しない場合は値 0 を入れる)であり、ローカルでオーバーヘッドを下げる用途に使われた歴史があります。一方 IPv6 ではUDP チェックサムは必須で、0 にすることはできません(RFC 2460 系)[要確認:RFC 番号と例外規定の最新動向]。
誤り検出能力としては、CRC のような強い符号と比べて1の補数和は弱い(すべてのビット誤りを検出できるわけではない)ことが知られています。リンク層(Ethernet)の CRC で多くは弾かれる前提で、トランスポート層は最終確認として軽量チェックを行う、という分担になっています。
図の見方:UDP は TCP のような事前のハンドシェイク・確認応答・タイムアウトを持たないため、送信側・受信側ともに状態管理が簡素です。送信1回・受信1回がそれぞれ独立した「データグラム」として扱われます。
つながる知識: このステップ図はカプセル化(第11回 第4節)の具体例です。アプリ層の生データに、UDP ヘッダ → IP ヘッダ → リンク層ヘッダ/トレイラ、と層を下りるたびに包まれていく流れを思い出してください。
| アプリ・プロトコル | ポート | UDP を選ぶ理由 |
|---|---|---|
| DNS(ドメイン名解決) | 53 | 多くの問い合わせは1往復で完結。応答も小さい。コネクション確立の3パケット分が無駄になる。応答が大きい場合のみ TCP にフォールバック |
| DHCP(IP アドレス自動設定) | 67/68 | クライアントは IP を持っていない段階でブロードキャストしてサーバを探す必要がある。TCP は IP が前提なので不可能 |
| SNMP(機器管理) | 161/162 | 多数の機器に短い Get/Trap を頻繁に送る用途。コネクション維持コストが負担になる |
| NTP(時刻同期) | 123 | 1往復のタイムスタンプ交換で完結。再送より新鮮な時刻が大事 |
| TFTP(簡易ファイル転送) | 69 | ブートローダなど、TCP スタックがまだ動かない環境でも実装できる軽さが必要 |
| VoIP / RTP(音声・動画) | 動的 | 古い音声フレームの再送は無意味。遅延と揺らぎを抑える方が品質に直結 |
| オンラインゲーム | 動的 | 位置・状態の最新スナップショットが届けば古いものは捨ててよい。低遅延が勝敗を決める |
| QUIC / HTTP/3(Web 新世代) | 443 | UDP の上で TCP 相当の信頼性 + TLS + 0-RTT 接続を独自実装。中間装置が UDP を「ただ通す」性質を活かしている |
コネクションレス + 8バイトヘッダ。リクエスト 1 パケット・レスポンス 1 パケットの合計2パケットで完結でき、TCP の 3 パケット(ハンドシェイク)+ 2 パケット(本文)+ 4 パケット(切断)と比べて圧倒的に少ない。DNS や NTP がこれに該当。
無信頼・順序非保証・フロー制御なし。ネットワーク輻輳時に送信を絞らないため遅延が安定しやすく、消えたフレームは捨てて次へ進める。VoIP・動画・ゲームに適合。
UDP はトランスポート層の「素地」として機能する。QUIC は UDP の上にコネクション概念・暗号・輻輳制御を再構築。アプリレベルで全機能を握れるため、ブラウザの更新だけで TCP を置き換えるかのような進化が可能になった。
QUIC(RFC 9000, 2021年)は Google が 2012 年頃から実装を始め、IETF で標準化されたトランスポートプロトコルです。UDP の上にアプリ層として実装され、TLS 1.3 を統合し、0-RTT 再接続・コネクション識別子による経路変更耐性などを備えます。HTTP/3 はこの QUIC 上で動作します。「なぜ UDP の上に作ったのか?」の最大の理由は、OS カーネルの TCP を置き換える政治的・技術的コストを払わずに、トランスポート層を進化させるためと説明されます [要確認:RFC・年代の正確性]。詳しくは 発展編で扱います。
考えてみよう: 「UDP は不便で危ない」という印象を持つ人もいますが、本当の問題は用途と性質のミスマッチです。動画配信に TCP を使うとカクつき、ファイル転送に UDP を使うと壊れたファイルが届く。設計者は「アプリが本当に求めているのは信頼性か、低遅延か」を見極めて選んでいます。
| 用語 | 1行説明 |
|---|---|
| UDP(User Datagram Protocol) | RFC 768。コネクションレス・無信頼・8バイトヘッダのトランスポート |
| UDP セグメント / データグラム | UDP の通信単位。ヘッダ 8 バイト + データ |
| コネクションレス | 事前のハンドシェイクなしで送信できる通信モデル |
| チェックサム | UDP/TCP のヘッダで使う 16 ビットの誤り検出符号(1 の補数和) |
| 擬似ヘッダ | UDP/TCP チェックサム計算のために IP の送信元/宛先 IP・プロトコル番号・長さを混ぜる仮想領域 |
| sendto / recvfrom | UDP ソケットでデータを送受信するシステムコール |
| FEC(前方誤り訂正) | 受信側だけで誤りを訂正できるよう冗長情報を加える方式。UDP の上で再送せずに信頼性を補う |
| QUIC | UDP の上に実装された新しいトランスポート。HTTP/3 が乗る |