TCPの動作の流れ

TCPでアプリケーションプロトコルのデータを送受信する流れについて見ていきましょう。

  1. TCPコネクションの確立
  2. TCPでのデータの分割(アプリケーションのデータの送信)
  3. TCPでのデータ受信の確認
  4. TCPコネクションの切断

TCPコネクションの確立

TCPを利用しているアプリケーションプロトコルは、アプリケーションのデータを転送するときにTCPコネクションを確立します。データを転送する前に、アプリケーション間のデータの転送がきちんとできることを確認しています。また、コネクションの確立のときに初期のシーケンス番号やデータを分割する単位であるMSSを決めています。

TCPコネクションの確立は3つの手順で行うことから3ウェイハンドシェイクと呼びます。

  1. クライアントアプリケーションからコネクション確立の要求を送信します。(SYNフラグ)
  2. コネクション要求に応答するとともにサーバアプリケーションからもコネクション確立の要求を送信します。(SYN/ACKフラグ)
  3. サーバアプリケーションからのコネクション要求に応答して、クライアントアプリケーションとサーバアプリケーション間の双方向のTCPコネクションが確立します。(ACKフラグ)
図 3ウェイハンドシェイクの概要

TCPでのデータの分割

TCPにはデータの分割機能もあります。TCPでアプリケーションのデータを分割する単位をMSS(Maximum Segment Size)と呼びます。MSSを超えるサイズのデータはMSSごとに分割して送信します。MSSの標準的なサイズは1460バイトです。ほとんどのアプリケーションのデータはMSSよりも大きいので、TCPで分割されて転送されます。

Webアクセスの際のWebサーバアプリケーションからWebサイトのデータを送信する場合について、TCPで分割する様子を考えます。アプリケーションプロトコルとしてHTTPを利用するのでWebサイトのデータにHTTPヘッダが付加されます。これがTCPにとってのデータです。MSSごとに分割してそれぞれにTCPヘッダを付加して複数のTCPセグメントとします。元のデータをどのように分割しているかは、TCPヘッダ内のシーケンス番号を見るとわかります。

TCPのMSSの標準的なサイズが1460バイトとなっているのは、ネットワークインタフェース層にイーサネットを利用していることが多いからです。イーサネットでは1つのフレームで送信できるデータのサイズの最大値であるMTUは1500バイトです。イーサネットのMTUにおさまるように、TCPのMSSが1460バイトとなっています。TCPヘッダは20バイトでさらにIPヘッダの20バイトが付加されたものがイーサネットにとってのデータです。1500バイトからIPヘッダ20バイトとTCPヘッダ20バイトを引いて、MSSを1460バイトとしています。

図 Webサイトのデータの分割の例

TCPでのデータ受信の確認

TCPで正しくデータを受信できたことを表すのがACK番号です。ACK番号は次にまっているデータ(TCPセグメント)のシーケンス番号です。

サーバアプリケーションからシーケンス番号1000で1460バイトのデータを転送した場合を考えます。クライアントアプリケーションは、データを受信できたことを知らせるためをACK番号2460(1000+1460)としてサーバアプリケーションへ送信します。これは、「次はシーケンス番号2460になっているデータを待っています」という意味です。そして、サーバアプリケーションはシーケンス番号2460で次のデータを送ります。次のデータのサイズが1460バイトとすると、クライアントアプリケーションは確認としてACK番号3920で返します。

図 データ受信の確認

以上のように、ACK番号によって正しくデータを受信したことを確認することで信頼性の高いアプリケーション間のデータ転送ができるようにしています。ただし、1つのデータを送って確認してから次のデータを送る・・・とすると、効率がよくありません。そのため、実際には1つのデータごとに確認をしているわけではなく、複数のデータを一括して転送して、確認も一括して行っています。

一括して送信するデータのサイズがウィンドウサイズです。

TCPコネクションの切断

TCPでアプリケーションのデータの送受信がすべて完了したら、TCPコネクションを切断します。TCPコネクションは双方向で確立していて、双方向のTCPコネクションを4つのステップで切断します。TCPコネクションの切断要求を表しているのがFINフラグです。

サーバアプリケーション側からTCPコネクションを切断する様子を見ていきます。

  1. サーバアプリケーションのデータの送信がすべて完了するとコネクション切断要求を送信します。
  2. クライアントアプリケーションは切断要求に応答します。
  3. クライアントアプリケーションからコネクション切断要求を送信します。
  4. サーバアプリケーションは切断要求に応答します
図 TCPコネクションの切断

コネクションの切断に4つのステップを踏んでいるのは、データの送信処理や受信処理が確実に完了していることを確認するためです。コネクションの切断要求ですぐに双方向のコネクションを切断してしまうと、送信するべきデータや受信するべきデータの処理がきちんと完了できていない可能性があります。そこで、4つのステップを踏んで、少し時間をかけてTCPコネクションの切断処理を行うようにしています。

なお、通常のTCPコネクションの切断はこの4ステップですが、強制的にTCPコネクションを切断することもできます。強制的なTCPコネクションの切断を行うときに、RSTフラグを利用します。