TCPとは

TCPとは、信頼性のあるアプリケーション間のデータ転送を行うためのプロトコルです。TCP/IPというネットワークアーキテクチャの名前に含まれているようにとても重要なプロトコルです。

TCPを利用したアプリケーション間のデータの送受信は次のような手順で行われます。

  1. TCPコネクションの確立
    まず、データを送受信するアプリケーション間の通信が正常に行うことが可能かどうかを確認します。この確認のプロセスは3ウェイハンドシェイクと呼ばれます。TCPコネクションの確立は、アプリケーション間で仮想的な直通の通信回線を確保しているようなイメージです。
  2. アプリケーション間のデータの送受信
    アプリケーションが扱うデータをTCPで送信するためには、アプリケーションのデータにアプリケーションプロトコルのヘッダとTCPヘッダを付加します。これをTCPセグメントと表現することがあります。
    このときアプリケーションのデータサイズが大きければ分割して、複数のTCPセグメントとして転送します。どのように分割したかはTCPヘッダに記述されて、宛先で元のデータに組み立てられるようにしています。また、データを受け取ったらその確認を行います。データの受信確認のことをACKと呼んでいます。
    もし、一部のデータがきちんと届いていなければデータを再送します。また、ネットワークの混雑を検出すると、データの送信速度を抑えます。このようなデータの転送の仕組みをフロー制御と呼びます。
  3. TCPコネクションの切断
    アプリケーションのデータの転送がすべて終了すれば、TCPコネクションを切断します。これにより、サーバおよびクライアントホストのCPUやメモリの利用を解放します。
図 TCPによるアプリケーションのデータの転送の概要

このように、TCPコネクションの確立を行ってから、実際のアプリケーションデータの転送を開始します。そして、データを正しく転送できていることを確認しています。これにより、TCPでは信頼性の高いアプリケーション間のデータ転送を行うことが可能です。

TCPヘッダフォーマット

TCPでのさまざまな機能を実現するためのTCPヘッダのフォーマットは以下のとおりです。

図 TCPヘッダフォーマット

TCPヘッダ内で重要な部分のみを簡単に解説します。もっとも重要なのはポート番号です。ポート番号によって適切なプリケーションプロトコルへデータを振り分けることができるからです。

そして、信頼性のあるデータの転送をするためにシーケンス番号やACK番号があります。シーケンス番号は、「シーケンス(順序)」という名前の通りTCPで転送するデータの順序を表しています。データを分割しているときには、シーケンス番号でどのようにデータを分割しているかがわかります。ACK番号はデータを正しく受信したことを確認するために利用します。

また、フラグはTCPのコネクションやデータの転送を制御するためのもので、主なフラグとして、以下があります。

  • SYN
    TCPコネクションを確立するときにSYNフラグを立てる
  • ACK
    TCPコネクションの最初のセグメント以外、ACKフラグを立てる
  • FIN
    TCPコネクションを切断するときにFINフラグを立てる
  • RST
    TCPコネクションを強制的に切断するときにRSTフラグを立てる