恋人時代は、送った言葉に返事が来る。届かなければ、もう一度送る。 夫婦になると、必要な情報は送るが、受信確認は省略されることがある。 この変化は、どこかTCPとUDPに似ています。
1. 恋人時代 ― TCP
Dating / Connected
おはよう。
おはよう。今日も早いね。
昨日はよく眠れた?
うん。そっちは?
僕も眠れたよ。
送れば返事が来る。返事が来なければ、届かなかったのではないかと心配してもう一度送る。 恋人同士の会話は、相手との接続を確かめながら進むTCPのようです。
2. 会話を始める前にも会話する
TCPでは、いきなり本題を送りません。最初に通信できる状態かを3段階で確認します。
Three-way handshake
今、話せる? SYN
話せるよ。そっちは? SYN + ACK
こちらも大丈夫。 ACK
これが3ウェイハンドシェイクです。 TCPは接続を確立してから、データのやり取りを始めます。 本題の前に三つのパケットが必要ですが、双方が送受信できることを確かめられます。
3. 返事がなければ再送する
Acknowledgement timeout
日曜日、会える? SEQ 101
……受信確認が返ってこない
日曜日、会える? SEQ 101 / 再送
会えるよ。 ACK
TCPは送ったデータのバイト位置をシーケンス番号で管理し、受信側から確認応答のACKが返るのを待ちます。 一定時間たってもACKがなければ再送します。同じ範囲のデータが届いた場合、受信側は重複を見分けます。
4. 話の順番も元に戻す
ネットワークでは、後から送ったデータが先に届くことがあります。
もし1番、3番、2番の順で届いても、TCPは番号を見て元の順番へ並べ直します。 アプリケーションには、順序のそろった連続したデータとして渡されます。
ただし、TCPは「メッセージ単位」ではなく連続したバイト列を扱います。 どこまでが一つの発言かは、アプリケーション側で決める必要があります。
5. 夫婦になった後 ― UDP
Marriage / Connectionless
今日は少し遅くなります。
応答なし
帰りに牛乳をお願いします。
応答なし
双方とも必要な情報は送っています。しかし受信確認はありません。 UDPは事前に接続を確立せず、データグラムをそのまま送ります。 届いたかどうかをUDP自身は確認せず、返事を待たずに次の処理へ進みます。
Out of order
牛乳は普通のでいい?
あと洗剤もお願いします。
低脂肪?
詰め替え用です。
メッセージは届いているのに、会話が少しかみ合いません。 UDPには、到着順を並べ直す機能もありません。
6. パケットロスと大きな遅延
Packet loss
帰りに牛乳をお願いします。
このパケットは途中で失われました
ただいま。
牛乳は?
聞いてないよ。
再送機能くらい付けてください。
UDPは、途中で失われたデータを自動では再送しません。 必要なら、アプリケーション側で受信確認や再送を実装します。
Very high latency
今度、棚を直してほしい。
……数日後
今度やります。
パケットは失われていませんでした。非常に大きな遅延が発生していただけです。
7. UDPは雑なのではなく、待たない
UDPはTCPの劣化版ではありません。確認や再送を標準で行わない分、処理が単純で、 遅れて届く古いデータよりも最新データを優先したい用途に向いています。
- リアルタイム音声・映像:一瞬前の音を再送して会話全体を止めるより、先へ進みたい。
- オンラインゲーム:古い位置情報を待つより、最新の位置を受け取りたい。
- DNS:短い問い合わせを少ない手順で処理したい。
UDPの上に、用途に必要な確認や再送だけを追加することもできます。 例えばHTTP/3で使われるQUICはUDPを土台にしながら、独自に信頼性や輻輳制御を実現しています。
8. TCPとUDPを並べてみる
| 項目 | TCP | UDP |
|---|---|---|
| 通信開始 | 接続を確立する | 接続確立なしで送る |
| 到着確認 | ACKで確認する | UDP自身は確認しない |
| 再送 | 失われたデータを再送する | UDP自身は再送しない |
| 順序 | 元の順序へ並べる | 到着順を保証しない |
| データ | 連続したバイト列 | データグラム単位 |
| 代表例 | HTTP/1.1・HTTP/2、メール、ファイル転送 | DNS、音声・映像、ゲーム、QUIC |
9. 結婚生活に必要なプロトコル
今日の夕飯はカレーです。 UDPでも可
明日は結婚記念日です。 TCP推奨
恋人時代は、すべてのメッセージにACKが返ってきた。
夫婦になると、重要なパケットだけ選んで返事をするようになった。
通信は効率化された。
それを最適化と呼んでよいかは、まだ分からない。