メインコンテンツまでスキップ

1. Introduction (序論)

伝送制御プロトコル (Transmission Control Protocol, TCP) は、パケット交換コンピュータ通信ネットワークおよびそのようなネットワークの相互接続システムにおけるホスト間で使用される高信頼性ホスト間プロトコル (host-to-host protocol) として使用されることを目的としています。

本文書は、伝送制御プロトコルが実行すべき機能、それを実装するプログラム、およびそのサービスを必要とするプログラムまたはユーザーへのインターフェースについて説明します。


1.1. Motivation (動機)

コンピュータ通信システムは、軍事、政府、民間の環境においてますます重要な役割を果たしています。本文書は主に軍事コンピュータ通信要件、特に通信の信頼性が低い状況下でのロバストネス (robustness) と、輻輳状況下での可用性 (availability) に焦点を当てていますが、これらの問題の多くは民間および政府部門でも見られます。

戦略的および戦術的コンピュータ通信ネットワークが開発・展開されるにつれて、これらを相互接続する手段を提供し、広範なアプリケーションをサポートできる標準的なプロセス間通信プロトコル (interprocess communication protocols) を提供することが不可欠です。このような標準の必要性を見越して、国防総省研究工学次官補は、本書で説明する伝送制御プロトコル (TCP) を国防総省全体のプロセス間通信プロトコル標準化の基礎とすることを宣言しました。

TCPの主要な特徴

TCPは、マルチネットワークアプリケーションをサポートする階層化されたプロトコル階層 (layered hierarchy of protocols) に適合するように設計されたコネクション指向のエンドツーエンド信頼性プロトコル (connection-oriented, end-to-end reliable protocol) です。TCPは、異なるが相互接続されたコンピュータ通信ネットワークに接続されたホストコンピュータ内のプロセスのペア間で信頼性の高いプロセス間通信を提供します。

TCPは、TCP層より下位の通信プロトコルの信頼性について非常に少ない仮定しか行いません。TCPは、下位レベルのプロトコルから単純で、潜在的に信頼性の低いデータグラムサービス (datagram service) を取得できると仮定しています。原則として、TCPは、有線接続からパケット交換またはサーキット交換ネットワークに至る広範な通信システム上で動作できるはずです。

理論的基礎

TCPは、CerfとKahnが[1]で最初に説明した概念に基づいています。TCPは、基本的なインターネットプロトコル (Internet Protocol, [2]) のすぐ上の階層化されたプロトコルアーキテクチャに適合します。インターネットプロトコルは、TCPがインターネットデータグラム (internet datagram) の「封筒」に封入された可変長の情報セグメント (segments) を送受信する方法を提供します。

インターネットデータグラムは、異なるネットワーク内の送信元と宛先のTCPをアドレス指定する手段を提供します。インターネットプロトコルは、複数のネットワークと相互接続ゲートウェイを介した転送と配信を実現するために必要なTCPセグメントのフラグメンテーション (fragmentation) または再構成 (reassembly) も処理します。インターネットプロトコルは、TCPセグメントの優先度 (precedence)、セキュリティ分類 (security classification)、および区画化 (compartmentation) に関する情報も運ぶため、この情報は複数のネットワークを介してエンドツーエンドで通信できます。

プロトコル階層化 (Protocol Layering)

+---------------------+
| higher-level | ← アプリケーション層プロトコル (HTTP, FTP, SMTPなど)
+---------------------+
| TCP | ← トランスポート層 (本プロトコル)
+---------------------+
| Internet Protocol | ← ネットワーク層 (RFC 791)
+---------------------+
|communication network| ← リンク層/物理層
+---------------------+

本文書の大部分は、TCP実装がホストコンピュータ内の上位レベルプロトコルと共存する環境で書かれています。一部のコンピュータシステムは、TCPとインターネットプロトコル層、およびネットワーク固有のソフトウェアを収容するフロントエンドコンピュータ (front-end computers) を介してネットワークに接続されます。TCP仕様は、適切なホスト対フロントエンドプロトコルが実装されている限り、フロントエンドの場合でも実装可能と思われる上位レベルプロトコルへのインターフェースを説明しています。


1.2. Scope (範囲)

TCPは、マルチネットワーク環境 (multinetwork environment) で信頼性の高いプロセス間通信サービス (reliable process-to-process communication service) を提供することを目的としています。TCPは、複数のネットワークで一般的に使用されるホスト間プロトコルとして意図されています。


1.3. About This Document (本文書について)

本文書は、上位レベルプロトコルとの対話および他のTCPとの対話の両方における、あらゆるTCP実装に必要な動作の仕様を表しています。本セクションの残りの部分では、プロトコルインターフェースと動作の非常に簡単な概要を提供します。

文書構造

  • セクション2: TCP設計の哲学的基礎 (philosophical basis) をまとめています
  • セクション3: 以下の詳細な説明を提供します:
    • さまざまなイベント (新しいセグメントの到着、ユーザー呼び出し、エラーなど) が発生したときにTCPが取るべき動作
    • TCPセグメント形式の詳細

1.4. Interfaces (インターフェース)

TCPは、一方でユーザーまたはアプリケーションプロセス (application processes) と、もう一方でインターネットプロトコルなどの下位レベルプロトコルと対話します。

TCP/ユーザーインターフェース (TCP/User Interface)

アプリケーションプロセスとTCP間のインターフェースは、合理的な詳細で説明されています。このインターフェースは、オペレーティングシステムがファイルを操作するためにアプリケーションプロセスに提供する呼び出しに非常に似た一連の呼び出しで構成されています。

主要なインターフェース呼び出し:

  • OPEN: 接続を開く
  • CLOSE: 接続を閉じる
  • SEND: 確立された接続でデータを送信する
  • RECEIVE: 確立された接続でデータを受信する

TCPは、アプリケーションプログラムと非同期に通信する (asynchronously communicate) こともできます。TCP実装者には、特定のオペレーティングシステム環境に適したインターフェースを設計するかなりの自由が許可されていますが、有効な実装にはTCP/ユーザーインターフェースで最小限の機能 (minimum functionality) が必要です。

TCP/下位レベルプロトコルインターフェース (TCP/Lower Level Protocol Interface)

TCPと下位レベルプロトコル間のインターフェースは、2つのレベルが互いに非同期に情報を渡すメカニズムが存在すると仮定されることを除いて、基本的に未指定 (essentially unspecified) です。通常、下位レベルプロトコルがこのインターフェースを指定することが期待されます。

TCPは、非常に汎用的な相互接続ネットワーク環境で動作するように設計されています。本文書で想定されている下位レベルプロトコルは、インターネットプロトコル (Internet Protocol, [2]) です。


1.5. Operation (動作)

上述のように、TCPの主な目的は、プロセスのペア間で信頼性が高く、安全な論理回路または接続サービス (reliable, securable logical circuit or connection service) を提供することです。信頼性の低いインターネット通信システムの上にこのサービスを提供するには、以下の領域で機能が必要です:

コア機能の概要

1. Basic Data Transfer (基本データ転送)

TCPは、一定数のオクテット (octets) をセグメント (segments) にパッケージ化してインターネットシステムを介して送信することにより、各方向でユーザー間でオクテットの連続ストリームを転送できます。一般に、TCPは自分の都合でデータをブロックして転送するタイミングを決定します。

プッシュ機能 (Push Function): ユーザーは、TCPに提出したすべてのデータが送信されたことを確認する必要がある場合があります。この目的のために、プッシュ機能が定義されています。TCPに提出されたデータが実際に送信されることを保証するために、送信ユーザーはそれが受信ユーザーにプッシュ (pushed) されるべきであることを示します。プッシュにより、TCPは即座にデータを転送して受信者に配信します。正確なプッシュポイントは受信ユーザーには見えない場合があり、プッシュ機能はレコード境界マーカー (record boundary marker) を提供しません。

2. Reliability (信頼性)

TCPは、インターネット通信システムによって破損、紛失、重複、または順序が狂って配信されたデータから回復しなければなりません (must)。これは、送信される各オクテットにシーケンス番号 (sequence number) を割り当て、受信TCPから肯定確認応答 (positive acknowledgment, ACK) を要求することによって実現されます。タイムアウト間隔内にACKが受信されない場合、データは再送信されます。受信側では、シーケンス番号を使用して、順序が狂って受信される可能性のあるセグメントを正しく順序付けし、重複を排除します。破損は、送信される各セグメントにチェックサム (checksum) を追加し、受信側でそれをチェックし、破損したセグメントを破棄することによって処理されます。

信頼性メカニズム:

  • タイムアウトと再送信: タイムアウト間隔内にACKが受信されない場合、データは再送信されます
  • シーケンス処理: 受信側では、シーケンス番号を使用して順序が狂って受信されたセグメントを正しく順序付けます
  • 重複排除: 重複セグメントを排除します
  • チェックサム: 送信される各セグメントにチェックサムを追加し、受信側でチェックし、破損したセグメントを破棄することで破損を処理します

TCPが適切に機能し続け、インターネットシステムが完全に分割 (completely partitioned) されない限り、送信エラーがデータの正しい配信に影響を与えることはありません。TCPは、インターネット通信システムのエラーから回復します。

3. Flow Control (フロー制御)

TCPは、受信側が送信側によって送信されるデータ量を制御する手段を提供します。これは、すべてのACKで「ウィンドウ」(window) を返すことによって実現され、最後に正常に受信されたセグメントを超える許容可能なシーケンス番号の範囲を示します。ウィンドウは、さらなる許可を受け取る前に送信側が送信できる許可されたオクテット数を示します。

スライディングウィンドウ (Sliding Window): ウィンドウは、さらなる許可を受け取る前に送信側が送信できる許可されたオクテット数を示します。

4. Multiplexing (多重化)

単一のホスト内の多数のプロセスがTCP通信機能を同時に使用できるようにするために、TCPは各ホスト内でアドレスまたはポート (ports) のセットを提供します。インターネット通信層からのネットワークアドレスとホストアドレスと連結すると、これがソケット (socket) を形成します。ソケットのペアが各接続を一意に識別します。つまり、ソケットは複数の接続で同時に使用できます。

ポートバインディング (Port Binding):

  • プロセスへのポートのバインディングは、各ホストが独立して処理します
  • 頻繁に使用されるプロセス (例:「logger」またはタイムシェアリングサービス) は、公開される固定ソケットに接続されます
  • これらのサービスには、既知のアドレスからアクセスできます
  • 他のプロセスのポートアドレスを確立および学習するには、より動的なメカニズムが含まれる場合があります

5. Connections (接続)

上記の信頼性とフロー制御メカニズムでは、TCPが各データストリームの特定のステータス情報 (status information) を初期化および維持する必要があります。ソケット (sockets)、シーケンス番号 (sequence numbers)、およびウィンドウサイズ (window sizes) を含むこの情報の組み合わせは、接続 (connection) と呼ばれます。各接続は、その両側を識別するソケットのペアによって一意に指定されます。

接続ライフサイクル:

  1. 確立: 2つのプロセスが通信したい場合、それらのTCPは最初に接続を確立しなければなりません (must) (各側のステータス情報を初期化します)
  2. 使用: データ転送フェーズ
  3. 終了: 通信が完了すると、接続は終了 (terminated) または閉じられ (closed)、他の用途のためにリソースを解放します

3ウェイハンドシェイク (Three-Way Handshake): 信頼性の低いホスト間および信頼性の低いインターネット通信システムを介して接続を確立する必要があるため、接続の誤った初期化を回避するために、クロックベースのシーケンス番号を使用したハンドシェイクメカニズム (handshake mechanism with clock-based sequence numbers) が使用されます。

6. Precedence and Security (優先度とセキュリティ)

TCPのユーザーは、通信のセキュリティと優先度を示すことができます (may)。これらの機能が不要な場合に使用されるデフォルト値が提供されます。


実装に関する考慮事項 (Implementation Considerations)

最小機能要件

有効なTCP実装は、以下を提供しなければなりません (must):

  1. 接続管理 (確立、維持、終了)
  2. 信頼性の高いデータ転送 (確認応答、再送信、シーケンス処理)
  3. フロー制御 (スライディングウィンドウ)
  4. 多重化 (ポート管理)
  5. エラー検出 (チェックサム)

柔軟性

本仕様はTCPの動作を定義していますが、実装者には以下の点でかなりの自由があります:

  • 内部データ構造の設計
  • オペレーティングシステムとの統合アプローチ
  • パフォーマンス最適化戦略
  • ユーザーインターフェースの具体的な形式

他のプロトコルとの関係 (Relation to Other Protocols)

アプリケーション層:  HTTP, FTP, SMTP, Telnet, など

トランスポート層: TCP (本プロトコル) | UDP (RFC 768)

ネットワーク層: IP (RFC 791)

リンク層: Ethernet, Wi-Fi, など

TCPはプロトコルスタックのトランスポート層に位置し、アプリケーション層に信頼性の高いエンドツーエンド通信サービスを提供し、ルーティングとアドレス指定のためにネットワーク層のIPプロトコルに依存しています。


: 2. Philosophy (哲学) - TCPの設計哲学と理論的基礎の詳細な探求