第4章 通信の制御|4-1|コース全体 19回中13本目
TCPとUDPの違い ― どっちを使うべきか
「TCP UDP 違い どっち」で調べている人向け。判断基準を最初に示し、3ウェイハンドシェイクの図つきで確実さと速さのトレードオフを解説します。
1バイトも欠けては困るならTCP、遅れるくらいなら欠けたほうがマシならUDP
TCPとUDPはどちらもトランスポート層(第4層)のプロトコルで、データを運ぶという役割は同じです。 違いは確実さと速さのどちらを優先するかにあります。判断基準はこれだけです。
以下では、なぜこの2択になるのか、それぞれの仕組みから説明します。
TCPとUDPの違い一覧
| 観点 | TCP | UDP |
|---|---|---|
| 接続 | あり(コネクション型) | なし(コネクションレス型) |
| 到達確認・再送 | ACKで確認し、届かなければ再送する | しない |
| 順序保証 | シーケンス番号で並べ直す | 保証しない |
| ヘッダサイズ | 20バイト〜 | 8バイト |
| 代表的な用途 | HTTP/HTTPS, メール, ファイル転送 | 音声通話, ビデオ会議, オンラインゲーム, DNS |
TCPが確実さをどう担保しているか
TCPはデータを送る前に、3回のやりとりでお互いの準備を確認してから通信を始めます。 これを3ウェイハンドシェイクと呼びます。
SYN(つなぎたい)、SYN+ACK(いいよ、こちらもつなぎたい)、ACK(了解)の3段階を経て、 お互いにデータを受け取る準備ができたことを確認してから通信を始めます。
再送制御 ― 届かなければ、もう一度送る
TCPはデータを送るたびに、相手からのACK(受け取ったという返事)を待ちます。 一定時間が経ってもACKが返ってこなければ、届かなかったと判断して同じデータを再送します。 これにより、途中でデータが失われても最終的には確実に届きます。 シーケンス番号とACK番号が何を数えているかなど、具体的な数値での流れは 次回「3ウェイハンドシェイクと再送制御」で扱います。
順序制御 ― 届いた順ではなく、送った順に組み立てる
ネットワーク上では、先に送ったデータが後から届くことがあります。 TCPは送るデータ1つずつにシーケンス番号(送信順を示す番号)を振っており、 受信側はこの番号を見て、届いた順序に関係なく送った順に並べ直してから上位のアプリに渡します。
UDPが速い理由
UDPはTCPが行っている手続きを、そもそも行いません。 接続を確立するハンドシェイクもなく、届いたかどうかの確認も再送もせず、順序を並べ直すこともありません。 その分、ヘッダは8バイトしかなく、TCPの20バイト〜と比べても小さくなります。
手続きが少なく、ヘッダも小さいということは、それだけオーバーヘッド(本来のデータ以外にかかる負荷)が小さいということです。 だからUDPは軽く、速く送れます。かわりに、届く保証も順序の保証もアプリケーション側で必要なら自分で用意することになります。
用途別の判断表
| 用途 | 選ぶプロトコル | 理由 |
|---|---|---|
| Web閲覧 | TCP | ページの一部が欠けたまま表示されては困るから |
| メール送受信 | TCP | 本文の一部が欠落してはいけないから |
| ファイル転送 | TCP | 1バイトでも壊れたファイルは使い物にならないから |
| 音声通話 | UDP | 再送を待って音声が止まる方が、少し欠けるより聞き苦しいから |
| ビデオ会議 | UDP | 再送で映像が止まるより、1コマ欠けて再生し続ける方がよいから |
| 動画配信(見逃し配信・ライブ配信) | TCP | 数秒ぶん先に読み込んで貯めておけるので、遅れても欠けないほうがよいから |
| オンラインゲーム | UDP | 再送で古い座標情報が遅れて届いても、その時点ではもう意味がないから |
| DNS | UDP | 問い合わせと応答が1往復で終わるため、接続確立の手間が割に合わないから |
なぜDNSはUDPなのか
DNSの名前解決(ドメイン名からIPアドレスを調べる処理)は、基本的に問い合わせ1回・応答1回の1往復で完結します。 もしここでTCPを使うと、データを送る前にまず3ウェイハンドシェイクを行う必要があり、接続を確立するだけで1往復かかってしまいます。本来1往復で済む処理のために、先にもう1往復かけるのは割に合いません。
なお、応答データが大きくなるゾーン転送(DNSサーバ間でドメイン情報をまとめて複製する処理)などでは、 例外的にTCPも使われます。ここでは深入りせず、基本はUDPということだけ押さえておけば十分です。
練習問題(全5問)
選んでから「採点する」を押すと、解説つきで答え合わせができます。
正解:コネクション型で、ACKによる到達確認と再送を行う
TCPはコネクション型で、ACKで到達を確認し、届かなければ再送します。順序保証も行い、その分ヘッダはUDPより大きく(20バイト〜)なります。
正解:8バイト
UDPのヘッダは8バイトです。TCPの20バイト〜と比べて小さく、その分オーバーヘッドが少なくなります。
正解:SYN → SYN+ACK → ACK
クライアントがSYNで接続を要求し、サーバがSYN+ACKで応じ、クライアントがACKで了解を返します。この3回のやりとりで接続が確立します。
正解:再送で古い座標情報が遅れて届いても、もう意味がないから
ゲームの座標は次々と新しい値で更新されます。再送を待って古い座標が届いても、その時点では役に立ちません。だから再送せず、常に最新の状態を送り続けるUDPが向いています。
正解:問い合わせと応答が1往復で完結するため、接続確立の往復を先に挟むのが割に合わないから
DNSの名前解決は「問い合わせ1回・応答1回」の1往復で終わります。TCPの3ウェイハンドシェイクだけで1往復かかるので、先に接続を作るのは非効率です。なおゾーン転送など応答が大きい場合は例外的にTCPも使われます。