3. 機能仕様 (Functional Specification)
本章では、TCPの機能仕様について説明します。これには、ヘッダー形式、オプション定義、シーケンス番号管理、接続管理、およびデータ転送メカニズムが含まれます。
3.1. ヘッダー形式 (Header Format)
TCPセグメントはインターネットデータグラムとして送信されます。インターネットプロトコル (Internet Protocol, IP) ヘッダーには、送信元と宛先のホストアドレスを含むいくつかの情報フィールドが含まれています。TCPヘッダーはIPヘッダーに続き、TCP固有の情報を提供します。
TCPヘッダー構造
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset| Rsrvd |W|C|R|C|S|S|Y|I| Window |
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| [Options] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
/ Data /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
フィールドの説明
Source Port (送信元ポート): 16ビット
- 送信元ポート番号
Destination Port (宛先ポート): 16ビット
- 宛先ポート番号
Sequence Number (シーケンス番号): 32ビット
- このセグメント内の最初のデータオクテットのシーケンス番号 (SYNフラグが設定されている場合を除く)
- SYNが設定されている場合、シーケンス番号は初期シーケンス番号 (Initial Sequence Number, ISN) であり、最初のデータオクテットはISN+1です
Acknowledgment Number (確認応答番号): 32ビット
- ACK制御ビットが設定されている場合、このフィールドにはセグメントの送信者が受信を期待している次のシーケンス番号の値が含まれます
- 接続が確立されると、このフィールドは常に送信されます
Data Offset (データオフセット): 4ビット
- TCPヘッダー内の32ビットワードの数
- データがどこから始まるかを示します
- TCPヘッダー (オプションを含む場合でも) は32ビットの整数倍の長さです
Reserved (予約済み): 4ビット
- 将来の使用のために予約された制御ビットのセット
- 生成されたセグメントでは0でなければなりません (must)
- 送信側または受信側のホストが対応する将来の機能を実装していない場合、受信したセグメントでは無視しなければなりません (must)
Control Bits (制御ビット): 制御ビットは「フラグ (Flags)」としても知られています。割り当ては、IANAによって「TCP Header Flags」レジストリから管理されています。現在割り当てられている制御ビットは、CWR、ECE、URG、ACK、PSH、RST、SYN、FINです。
-
CWR (Congestion Window Reduced, 輻輳ウィンドウ削減): 1ビット
- RFC 3168を参照
-
ECE (ECN-Echo, ECNエコー): 1ビット
- RFC 3168を参照
-
URG (Urgent, 緊急): 1ビット
- 緊急ポインターフィールドが有効です
-
ACK (Acknowledgment, 確認応答): 1ビット
- 確認応答フィールドが有効です
-
PSH (Push, プッシュ): 1ビット
- プッシュ機能
-
RST (Reset, リセット): 1ビット
- 接続をリセットします
-
SYN (Synchronize, 同期): 1ビット
- シーケンス番号を同期します
-
FIN (Finish, 終了): 1ビット
- 送信者からのデータがこれ以上ありません
Window (ウィンドウ): 16ビット
- 確認応答フィールドで示されたシーケンス番号から始まる、このセグメントの送信者が受け入れる意思のあるデータオクテットの数
- ウィンドウスケーリング拡張が使用される場合、この値はシフトされます
- ウィンドウサイズは符号なし数として扱わなければなりません (MUST-1)。そうしないと、大きなウィンドウサイズが負のウィンドウのように見え、TCPが動作しなくなります
Checksum (チェックサム): 16ビット
- ヘッダーとテキストのすべての16ビットワードの1の補数和の16ビット1の補数
- TCPチェックサムは決してオプションではありません
- 送信者はそれを生成しなければならず (MUST-2)、受信者はそれをチェックしなければなりません (MUST-3)
Urgent Pointer (緊急ポインター): 16ビット
- このセグメント内のシーケンス番号からの正のオフセットとして、緊急ポインターの現在の値を通信します
- 緊急ポインターは、緊急データに続くオクテットのシーケンス番号を指します
- このフィールドは、URG制御ビットが設定されたセグメントでのみ解釈されます
Options (オプション): 可変長
- オプションはTCPヘッダーの末尾にスペースを占有する可能性があり、長さは8ビットの倍数です
- すべてのオプションはチェックサムに含まれます
注意: この章は非常に広範囲にわたります。完全な機能仕様には、オプション定義、用語の概要、シーケンス番号管理、接続確立、接続終了、セグメンテーション、データ通信、インターフェース、およびイベント処理が含まれます。完全な詳細については、RFC 9293の完全な第3章を参照してください。
3.2. 必須オプション
TCP実装は以下のオプションをサポートしなければなりません (MUST-4):
| Kind | Length | 意味 |
|---|---|---|
| 0 | - | オプションリスト終了 (End of Option List) |
| 1 | - | 無操作 (No-Operation) |
| 2 | 4 | 最大セグメントサイズ (Maximum Segment Size) |
3.3. 接続状態
TCP接続は、その生涯を通じて一連の状態を経過します:
- CLOSED - 接続状態がまったくないことを表します
- LISTEN - 任意のリモートTCPとポートからの接続要求を待機しています
- SYN-SENT - 接続要求を送信した後、一致する接続要求を待機しています
- SYN-RECEIVED - 接続要求を受信および送信した後、接続要求確認の確認応答を待機しています
- ESTABLISHED - オープン接続を表し、受信したデータをユーザーに配信できます
- FIN-WAIT-1 - リモートTCPからの接続終了要求、または以前に送信された接続終了要求の確認応答を待機しています
- FIN-WAIT-2 - リモートTCPからの接続終了要求を待機しています
- CLOSE-WAIT - ローカルユーザーからの接続終了要求を待機しています
- CLOSING - リモートTCPからの接続終了要求確認応答を待機しています
- LAST-ACK - リモートTCPに以前送信された接続終了要求の確認応答を待機しています
- TIME-WAIT - リモートTCPがその接続終了要求の確認応答を受信したことを確実にするために十分な時間が経過するのを待機しています
完全な第3章の内容については、RFC 9293公式文書を参照してください。以下の詳細情報が含まれています:
- オプション定義と処理
- シーケンス番号メカニズム
- 接続確立のための3ウェイハンドシェイク
- 接続終了のための4ウェイハンドシェイク
- データのセグメンテーションと再構成
- フロー制御と輻輳制御
- 再送信メカニズム
- ユーザーインターフェース仕様
- イベント処理ロジック