届いたことを確認するTCP

TCPは、データが正しく・順番通りに届いたことを確認しながら通信する、信頼性を重視した通信方式です。

Webページを開く、メールを送る、ファイルをアップロードする、データベースに問い合わせる。こうした通信の大部分は、TCP という決まりの上で動いています。

TCPは、データが相手に届いたことを確かめながら通信する方式で、確実に届けることを何より優先しています。書留郵便に近く、相手に届いたかを確認しながら送るので確実ですが、確認のぶんだけ時間がかかります。

書留のように送る手順

TCP の通信は、おおまかに次の順で進みます。

  1. 送る前に、相手と「これから話しましょう」と接続を確立する(3ウェイハンドシェイクと呼ばれる3回のやり取り)
  2. データをパケットに小分けし、順番が分かるよう番号を振って送る
  3. 受け取った側は「受け取りました」と確認を返す
  4. 確認が返ってこないパケットは、自動で送り直す
  5. 受け取った側は、ばらばらに届いた順番を正しく並べ直す

途中で欠けたり順番が入れ替わったりしても、アプリの側はそれを気にせず、きれいにそろったデータを受け取れるわけです。Webでやり取りに使う HTTP も、この仕組みの上に乗っています。暗号化が必要なら、TCPの上に TLS を重ねます。

確実さと引き換えのもの

確認のやり取りが増えるぶん、確認を省く UDP と比べて遅延が生じやすくなります。接続の確立と切断にも手順があるので、ごく短い問い合わせを大量に繰り返す使い方だと、その手間が負荷として効いてくる。つないでいる接続が増えすぎると、サーバーの資源も消費します。

動画配信や音声通話のように、多少欠けても速さを優先したい通信では、UDP が選ばれることがあります。どんな場面でどちらを選ぶかは、TCPとUDPの違いで詳しく比べています。