Webページを開く、メールを送る、ファイルをアップロードする、データベースに問い合わせる。こうした通信の大部分は、TCP という決まりの上で動いています。
TCPは、データが相手に届いたことを確かめながら通信する方式で、確実に届けることを何より優先しています。書留郵便に近く、相手に届いたかを確認しながら送るので確実ですが、確認のぶんだけ時間がかかります。
書留のように送る手順
TCP の通信は、おおまかに次の順で進みます。
- 送る前に、相手と「これから話しましょう」と接続を確立する(3ウェイハンドシェイクと呼ばれる3回のやり取り)
- データをパケットに小分けし、順番が分かるよう番号を振って送る
- 受け取った側は「受け取りました」と確認を返す
- 確認が返ってこないパケットは、自動で送り直す
- 受け取った側は、ばらばらに届いた順番を正しく並べ直す
途中で欠けたり順番が入れ替わったりしても、アプリの側はそれを気にせず、きれいにそろったデータを受け取れるわけです。Webでやり取りに使う HTTP も、この仕組みの上に乗っています。暗号化が必要なら、TCPの上に TLS を重ねます。
確実さと引き換えのもの
確認のやり取りが増えるぶん、確認を省く UDP と比べて遅延が生じやすくなります。接続の確立と切断にも手順があるので、ごく短い問い合わせを大量に繰り返す使い方だと、その手間が負荷として効いてくる。つないでいる接続が増えすぎると、サーバーの資源も消費します。
動画配信や音声通話のように、多少欠けても速さを優先したい通信では、UDP が選ばれることがあります。どんな場面でどちらを選ぶかは、TCPとUDPの違いで詳しく比べています。