UDP — 返事を待たずに、投げっぱなしにする
ネットワークにデータを流すとき、「相手にちゃんと届いたか」を確かめるかどうかで仕組みが2つに分かれます。確かめるのが TCP、確かめないのが UDP です。
UDPは投げっぱなしです。届いたかどうかの返事(ACK)を待たず、次々と送り出します。だから速い。そのかわり消えたパケットは消えたままで、追い越しも起きます。図1で回線の状態(パケットロス)を変えながら、同じ5個のデータを両方に同時に流してみてください。
TCPは「返事」を待つ
TCPは1つ送るたびに、受信側からの ACK(受け取りましたの返事)を待ちます。一定時間たっても返事が来なければ消えたと判断して同じものを送り直す(再送)。だから最終的に全部が、送った順番どおりに相手に揃います。
かわりに、1個あたり往復ぶんの時間がかかります。図1で回線を悪くするほどTCPのレーンが待ち時間だらけになるのは、消えたパケットの再送をタイムアウトするまで待ってからやり直しているからです。
UDPは確かめない。だから速い
UDPがやることは宛先を書いて投げる、それだけです。ACKを待たないので、前のパケットの結果に関係なく次を出せます。図1でUDPのレーンが常に先に終わるのはこのためです。
そのぶん、UDPには3つの保証がありません。届く保証(消えたら消えたまま)、順番の保証(経路差で追い越しが起きる)、重複しない保証。図1の受信リストで番号が飛んでいたり入れ替わっていたりするのが、まさにそれです。
欠けても困らない場面がある
「欠ける」と聞くと困りそうですが、遅れて届くくらいなら欠けたほうがマシな用途があります。通話や動画のライブ配信では、0.5秒前の音声が今さら再送されてきてももう再生する場所がありません。それより次の音を今すぐ流したい。オンラインゲームの位置情報も同じで、古い座標は次の座標が来た時点で価値がゼロです。
やり取りが1往復で終わるものもUDPが向きます。DNSの名前解決は「この名前のIPは?」「これです」の1往復だけ。わざわざ接続を確立してから閉じるTCPの手順を踏むより、投げて返ってくるほうが速い。返事が来なければもう一度聞けば済みます。
- UDP
- User Datagram Protocol。宛先に投げるだけ。到達・順序・重複なしを保証しない。
- TCP
- Transmission Control Protocol。ACKと再送で、全部を順番どおりに届ける。
- ACK
- 受け取りましたという返事。TCPはこれを待ち、来なければ再送する。
- データグラム
- UDPが送る1個の荷物。前後の荷物とは互いに無関係な、独立した1通。
- ヘッドオブラインブロッキング
- TCPで前のパケットが欠けると、後ろが届いていても渡してもらえない現象。
まとめ
UDPとTCPの差は「返事を待つかどうか」の一点から生まれます。待てば全部・順番どおりが手に入り、待たなければ速さが手に入る。どちらが上ということはなく、遅れて届いても価値がないデータかどうかで選びます。図1でスライダーを両端に振ると、その交換条件がそのまま数字になって出てきます。