2. Philosophy (哲学)
本章では、TCP設計の哲学的基礎 (philosophical basis) をまとめ、インターネット環境におけるTCPの位置づけ、設計原則、および中核概念を説明します。
2.1. Elements of the Internetwork System (インターネットワークシステムの要素)
インターネットワーク環境は、ネットワークに接続されたホスト (hosts) で構成され、これらのネットワークはゲートウェイ (gateways) を介して相互接続されています。ここでは、ネットワークはローカルネットワーク (local networks, 例: ETHERNET) または大規模ネットワーク (large networks, 例: ARPANET) のいずれかである可能性があると仮定されていますが、いずれの場合もパケット交換技術 (packet switching technology) に基づいています。メッセージを生成および消費するアクティブエージェントはプロセスです。ネットワーク、ゲートウェイ、およびホスト内のさまざまなレベルのプロトコルは、プロセスポート (process ports) 間の論理接続上で双方向データフローを提供するプロセス間通信システムをサポートします。
中核概念
- プロセス (Processes): メッセージを生成および消費するアクティブエージェント
- プロセス間通信システム: ネットワーク、ゲートウェイ、およびホスト内のさまざまなレベルのプロトコルが、プロセスポート間の論理接続上で双方向データフローをサポートします
パケット (Packet) という用語は、ここではホストとそのネットワーク間の1つのトランザクションのデータを意味するために一般的に使用されます。ネットワーク内で交換されるデータブロックの形式は、通常、私たちの関心事ではありません。
用語の定義
| 用語 | 定義 |
|---|---|
| ホスト (Host) | ネットワークに接続されたコンピュータで、通信ネットワークの観点からは、パケットの送信元および宛先です |
| プロセス (Process) | ホストコンピュータ内のアクティブな要素 (実行中のプログラムとしてのプロセスのかなり一般的な定義に従って) |
| ポート (Port) | プロセスが通信に使用する論理エンドポイント。プロセスは複数のポートを持つことができます |
重要なポイント: すべての通信はプロセス間通信 (inter-process communication) と見なされます。端末、ファイル、またはその他のI/Oデバイスでさえ、プロセスの使用を通じて互いに通信していると見なされます。
プロセスは、自分自身と別のプロセス (または複数のプロセス) 間のいくつかの通信ストリームを区別する必要がある可能性があるため、各プロセスは、他のプロセスのポートと通信するいくつかのポートを持つことができると想像します。
2.2. Model of Operation (動作モデル)
データ転送フロー
送信プロセス
↓ [TCPを呼び出し、データバッファを渡す]
送信TCP
↓ [データをセグメントにパッケージ化]
インターネットモジュール
↓ [インターネットデータグラムにカプセル化]
ローカルネットワーク
↓ [ローカルネットワークパケットに埋め込む]
... (パケットスイッチ、ゲートウェイ経由) ...
↓
宛先ローカルネットワーク
↓ [アンラップ]
宛先インターネットモジュール
↓ [TCPセグメントを抽出]
受信TCP
↓ [データをユーザーバッファに配置]
受信プロセス
詳細説明
送信側:
- プロセスは、TCPを呼び出してデータのバッファを引数として渡すことでデータを送信します
- TCPは、これらのバッファからのデータをセグメントにパッケージ化します
- TCPは、各セグメントを宛先TCPに送信するためにインターネットモジュールを呼び出します
受信側:
- 受信TCPは、セグメントからのデータを受信ユーザーのバッファに配置します
- 受信TCPは受信ユーザーに通知します
制御情報:
- TCPは、信頼性の高い順序付けされたデータ転送を保証するために使用する制御情報をセグメントに含めます
インターネット通信モデル
[TCPセグメント] → [インターネットデータグラム] → [ローカルネットワークパケット] → ...ゲートウェイ転送... → [宛先]
インターネットモジュール:
- 各TCPに関連付けられています
- ローカルネットワークへのインターフェースを提供します
- TCPセグメントをインターネットデータグラム内にパッケージ化します
- これらのデータグラムを宛先インターネットモジュールまたは中間ゲートウェイにルーティングします
ローカルネットワーク転送:
- ローカルネットワークを介してデータグラムを送信するために、ローカルネットワークパケットに埋め込まれます
- パケットスイッチは、ローカルパケットを宛先インターネットモジュールに配信するために、さらなるパッケージング、フラグメンテーション、またはその他の操作を実行する場合があります
ゲートウェイ操作
ネットワーク間のゲートウェイで:
- アンラップ: インターネットデータグラムはローカルパケットから「アンラップ」されます
- 検査: インターネットデータグラムが次にどのネットワークを経由すべきかを判断します
- リラップ: インターネットデータグラムは、次のネットワークに適したローカルパケットに「ラップ」されます
- ルーティング: 次のゲートウェイまたは最終宛先にルーティングされます
フラグメンテーションメカニズム:
- 次のネットワークを介した送信に必要な場合、ゲートウェイはインターネットデータグラムをより小さなインターネットデータグラムフラグメントに分割することが許可されています
- これを行うために、ゲートウェイは、それぞれがフラグメントを運ぶインターネットデータグラムのセットを生成します
- フラグメントは、後続のゲートウェイでさらに小さなフラグメントに分割される可能性があります
- インターネットデータグラムフラグメント形式は、宛先インターネットモジュールがフラグメントをインターネットデータグラムに再構成できるように設計されています
最終宛先:
- 宛先インターネットモジュールは、データグラムからセグメントをアンラップします (必要に応じてデータグラムを再構成した後)
- 宛先TCPに渡します
サービスの種類
この単純な動作モデルは、多くの詳細を省略しています。重要な機能の1つはサービスの種類 (type of service) です。これは、次のネットワークを横断する際に使用するサービスパラメータを選択する際にゲートウェイ (またはインターネットモジュール) をガイドする情報を提供します。
サービスの種類情報に含まれるもの:
- データグラムの優先度 (precedence): 処理の優先度レベル
- セキュリティ情報 (security information): マルチレベルセキュア環境で動作するホストとゲートウェイが、セキュリティ上の考慮事項のためにデータグラムを適切に分離できるようにします
2.3. The Host Environment (ホスト環境)
TCPは、オペレーティングシステム内のモジュールであると想定されています。ユーザーは、ファイルシステムにアクセスするのとよく似た方法でTCPにアクセスします。TCPは、例えばデータ構造を管理するために、他のオペレーティングシステム機能を呼び出すことができます (may)。
ネットワークインターフェース:
- ネットワークへの実際のインターフェースは、デバイスドライバモジュールによって制御されると想定されています
- TCPは、ネットワークデバイスドライバを直接呼び出しません
- むしろ、インターネットデータグラムプロトコルモジュールを呼び出し、これが今度はデバイスドライバを呼び出す可能性があります
フロントエンド実装:
- TCPのメカニズムは、フロントエンドプロセッサでのTCPの実装を妨げません
- ただし、そのような実装では、ホストとフロントエンド間のプロトコルは、本文書で説明されているTCP/ユーザーインターフェースの種類をサポートする機能を提供しなければなりません (must)
2.4. Interfaces (インターフェース)
TCP/ユーザーインターフェース
TCP/ユーザーインターフェースは、ユーザーがTCPに対して行う以下の呼び出しを提供します:
- 接続をOPENまたはCLOSEする
- データをSENDまたはRECEIVEする
- 接続に関するSTATUSを取得する
これらの呼び出しは、オペレーティングシステム上のユーザープログラムからの他の呼び出しに似ています。例えば、ファイルを開く、読み取る、閉じるための呼び出しです。
TCP/インターネットインターフェース
TCP/インターネットインターフェースは、インターネットシステム内のどこかのホスト内のTCPモジュールにアドレス指定されたデータグラムを送受信する呼び出しを提供します。これらの呼び出しには、以下を渡すためのパラメータがあります:
- アドレス
- サービスの種類
- 優先度
- セキュリティ
- その他の制御情報
2.5. Relation to Other Protocols (他のプロトコルとの関係)
以下の図は、プロトコル階層におけるTCPの位置を示しています:
+------+ +-----+ +-----+ +-----+
|Telnet| | FTP | |Voice| ... | | アプリケーションレベル
+------+ +-----+ +-----+ +-----+
| | | |
+-----+ +-----+ +-----+
| TCP | | RTP | ... | | ホストレベル
+-----+ +-----+ +-----+
| | |
+-------------------------------+
| Internet Protocol & ICMP | ゲートウェイレベル
+-------------------------------+
|
+---------------------------+
| Local Network Protocol | ネットワークレベル
+---------------------------+
プロトコルの関係
重要なポイント:
- TCPが上位レベルのプロトコルを効率的にサポートできることが期待されています
- ARPANET TelnetやAUTODIN II THPのような上位レベルのプロトコルをTCPにインターフェースするのは簡単であるべきです
2.6. Reliable Communication (信頼性の高い通信)
TCP接続上で送信されるデータのストリームは、宛先で確実に順序どおりに配信されます。
信頼性メカニズム
シーケンス番号と確認応答:
- シーケンス番号と確認応答の使用を通じて、送信が信頼できるようになります
- 概念的には、データの各オクテットにシーケンス番号が割り当てられます
- セグメント内のデータの最初のオクテットのシーケンス番号は、そのセグメントとともに送信され、セグメントシーケンス番号と呼ばれます
- セグメントには、逆方向の送信の次に予想されるデータオクテットのシーケンス番号である確認応答番号 (acknowledgment number) も含まれます
再送信:
- TCPがデータを含むセグメントを送信するとき、再送信キューにコピーを置き、タイマーを開始します
- そのデータの確認応答が受信されると、セグメントはキューから削除されます
- タイマーが切れる前に確認応答が受信されない場合、セグメントは再送信されます
重要な注意:
- TCPによる確認応答は、データがエンドユーザーに配信されたことを保証するものではありません
- 受信TCPがそれを行う責任を負ったことを意味するだけです
フロー制御
TCP間のデータフローを制御するために、フロー制御メカニズムが採用されています:
- 受信TCPは、送信TCPに「ウィンドウ」(window) を報告します
- このウィンドウは、確認応答番号から始まる、受信TCPが現在受信する準備ができているオクテットの数を指定します
2.7. Connection Establishment and Clearing (接続の確立とクリア)
ソケットアドレッシング
ポート識別子:
- TCPが処理する可能性のある個別のデータストリームを識別するために、TCPはポート識別子 (port identifier) を提供します
- ポート識別子は各TCPによって独立して選択されるため、一意ではない可能性があります
ソケットの作成:
- 各TCP内で一意のアドレスを提供するために、TCPを識別するインターネットアドレスとポート識別子を連結してソケット (socket) を作成します
- ソケットは、接続されているすべてのネットワーク全体で一意になります
接続の指定:
- 接続は、両端のソケットのペアによって完全に指定されます
- ローカルソケットは、異なる外部ソケットへの多数の接続に参加できます (may)
- 接続は、両方向にデータを運ぶために使用できます。つまり、「全二重」(full duplex) です
ポートとプロセスの関連付け
ポート所有権:
- TCPは、選択した方法でポートをプロセスに関連付ける自由があります
- ただし、どの実装でもいくつかの基本的な概念が必要です:
- TCPが何らかの手段で「適切な」プロセスにのみ関連付けるよく知られたソケットが存在しなければなりません (must)
- プロセスがポートを「所有」する可能性があると想定しています
- プロセスは、所有するポートでのみ接続を開始できます
OPEN呼び出しでの接続指定:
- 接続は、OPEN呼び出しでローカルポートと外部ソケット引数によって指定されます
- 返却時に、TCPは、ユーザーが後続の呼び出しで接続を参照する (短い) ローカル接続名を提供します
伝送制御ブロック (TCB)
接続情報を格納するために、伝送制御ブロック (Transmission Control Block, TCB) と呼ばれるデータ構造が存在すると想像します:
- 1つの実装戦略は、ローカル接続名をこの接続のTCBへのポインタにすることです
- OPEN呼び出しは、接続の確立を積極的に追求するか、受動的に待機するかも指定します
パッシブOPEN:
- パッシブOPEN要求は、プロセスが接続を開始しようとするのではなく、着信接続要求を受け入れたいことを意味します
- 多くの場合、パッシブOPENを要求するプロセスは、任意の呼び出し元からの接続要求を受け入れます
- この場合、すべてゼロの外部ソケットが、未指定のソケットを示すために使用されます
- 未指定の外部ソケットは、パッシブOPENでのみ許可されます
2.8. Data Communication (データ通信)
接続が確立されると、プロセス間でデータが双方向に流れることができます。TCPは、このデータフローが次のことを保証します:
- 信頼性 (Reliable): データが正しく到着する
- 順序付け (Ordered): データが正しい順序で到着する
- フロー制御 (Flow controlled): 受信側が圧倒されない
2.9. Precedence and Security (優先度とセキュリティ)
TCPは、以下を処理するメカニズムを提供します:
- 優先度 (Precedence): トラフィックの優先度レベル
- セキュリティ分類 (Security classifications): マルチレベルセキュア環境で動作するため
- 区画化 (Compartmentation): 異なるセキュリティドメインの分離
これらの機能は、インターネットプロトコル層から継承され、TCP接続を通じてエンドツーエンドで維持されます。
2.10. Robustness Principle (堅牢性原則)
TCP実装の指針となる原則は堅牢性原則 (Robustness Principle) であり、しばしば次のように述べられます:
「送信するものには保守的であり、受け入れるものには寛容であれ」 ("Be conservative in what you send, be liberal in what you accept")
これは次を意味します:
- TCP実装は、データを送信する際に仕様に注意深く従うべきです (should)
- しかし、データを受信する際には寛容で柔軟であるべきであり、可能な場合はわずかに不正な形式の入力でも解釈しようと試みるべきです
この原則は、異なる実装間の相互運用性を確保し、インターネット全体の安定性を促進するのに役立ちます。
次: 3. Functional Specification (機能仕様) - TCP動作とセグメント形式の詳細仕様