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

1. はじめに (Introduction)

本セクションでは、ストリーム制御伝送プロトコル (Stream Control Transmission Protocol, SCTP) の開発の背景にある理由、それが提供するサービス、およびプロトコルの詳細な説明を理解するために必要な基本概念について説明します。

本文書はRFC2960およびRFC3309を廃止します。

1.1. 動機 (Motivation)

TCP [RFC0793]は、IPネットワークにおける信頼性の高いデータ転送の主要な手段として、計り知れないサービスを提供してきました。しかし、最近のアプリケーションの増加により、TCPが制限的すぎることが判明し、UDP [RFC0768]の上に独自の信頼性の高いデータ転送プロトコルを組み込んでいます。ユーザーが回避したいと望んでいる制限には、以下が含まれます:

  • TCPは信頼性の高いデータ転送と厳密な送信順序でのデータ配信の両方を提供します。一部のアプリケーションはシーケンス維持なしで信頼性の高い転送を必要とし、他のアプリケーションはデータの部分的な順序付けで満足するでしょう。これらのどちらの場合でも、TCPが提供するヘッドオブラインブロッキング (head-of-line blocking) は不要な遅延を引き起こします。

  • TCPのストリーム指向の性質は、しばしば不便です。アプリケーションは、メッセージを区切るために独自のレコードマーキングを追加する必要があり、完全なメッセージが妥当な時間内に転送されることを保証するためにプッシュ機能を明示的に使用する必要があります。

  • TCPソケットの限られたスコープは、マルチホームホストを使用して高可用性データ転送機能を提供するタスクを複雑にします。

  • TCPは、SYN攻撃などのサービス拒否攻撃に対して比較的脆弱です。

IPネットワーク経由でのPSTN (公衆交換電話網) シグナリングの転送は、TCPのこれらすべての制限が関連するアプリケーションです。このアプリケーションはSCTPの開発を直接動機付けましたが、他のアプリケーションもSCTPが要件に適合することを発見する可能性があります。

1.2. SCTPのアーキテクチャビュー (Architectural View of SCTP)

SCTPは、SCTPユーザーアプリケーション(略して「SCTPユーザー」)とIPなどのコネクションレス型パケットネットワークサービスとの間の層として見られます。本文書の残りの部分では、SCTPがIPの上で実行されることを前提としています。SCTPが提供する基本サービスは、ピアSCTPユーザー間のユーザーメッセージの信頼性の高い転送です。これは、2つのSCTPエンドポイント間のアソシエーション (association) のコンテキスト内でこのサービスを実行します。本文書のセクション10では、SCTPとSCTPユーザー層の境界に存在すべきAPIをスケッチしています。

SCTPは本質的に接続指向ですが、SCTPアソシエーション (association) はTCP接続よりも広い概念です。SCTPは、各SCTPエンドポイント(セクション1.3)が、アソシエーション起動中に、そのエンドポイントに到達できる、およびそこからSCTPパケットを発信するトランスポートアドレスのリスト(つまり、SCTPポートと組み合わせた複数のIPアドレス)を他のエンドポイントに提供する手段を提供します。アソシエーションは、各エンドポイントのリストから生成される可能性のあるすべての送信元/宛先の組み合わせにわたる転送にまたがります。

     _____________                                      _____________
| SCTP User | | SCTP User |
| Application | | Application |
|-------------| |-------------|
| SCTP | | SCTP |
| Transport | | Transport |
| Service | | Service |
|-------------| |-------------|
| |One or more ---- One or more| |
| IP Network |IP address \/ IP address| IP Network |
| Service |appearances /\ appearances| Service |
|_____________| ---- |_____________|

SCTP Node A |<-------- Network transport ------->| SCTP Node B

図1: SCTPアソシエーション

1.3. 主要用語 (Key Terms)

SCTPを記述するために使用される言語のいくつかは、前のセクションで紹介されています。このセクションでは、主要な用語とその定義の統合リストを提供します。

  • アクティブ宛先トランスポートアドレス (Active destination transport address): 送信エンドポイントがユーザーメッセージの受信に利用可能であると見なすピアエンドポイント上のトランスポートアドレス。

  • バンドリング (Bundling): オプションの多重化操作で、複数のユーザーメッセージを同じSCTPパケットで運ぶことができます。各ユーザーメッセージは独自のDATAチャンクを占有します。

  • チャンク (Chunk): SCTPパケット内の情報単位で、チャンクヘッダーとチャンク固有のコンテンツで構成されます。

  • 輻輳ウィンドウ (Congestion window, cwnd): 送信者が確認応答を受信する前に特定の宛先トランスポートアドレスに送信できるデータをバイト数で制限するSCTP変数。

  • 累積TSN確認応答ポイント (Cumulative TSN Ack Point): SACKの累積TSN確認応答フィールドを介して確認応答された最後のDATAチャンクのTSN。

  • アイドル宛先アドレス (Idle destination address): 通常HEARTBEATインターバル以上の一定時間内にユーザーメッセージが送信されていないアドレス。

  • 非アクティブ宛先トランスポートアドレス (Inactive destination transport address): エラーのために非アクティブと見なされ、ユーザーメッセージの転送に利用できないアドレス。

  • メッセージ = ユーザーメッセージ (Message = user message): 上位層プロトコル (ULP) によってSCTPに送信されるデータ。

  • メッセージ認証コード (Message Authentication Code, MAC): 秘密鍵を使用した暗号ハッシュ関数に基づく完全性チェックメカニズム。通常、メッセージ認証コードは、これらのパーティ間で送信される情報を検証するために、秘密鍵を共有する2つのパーティ間で使用されます。SCTPでは、エンドポイントがCOOKIE ECHOチャンクでピアから返されるState Cookie情報を検証するために使用されます。「MAC」という用語は、異なるコンテキストで異なる意味を持ちます。SCTPは、[RFC2104]と同じ意味でこの用語を使用します。

  • ネットワークバイトオーダー (Network Byte Order): 最上位バイトが最初、つまりビッグエンディアン。

  • 順序付きメッセージ (Ordered Message): メッセージが送信されたストリーム内で送信されたすべての以前のユーザーメッセージに関して順序付けされて配信されるユーザーメッセージ。

  • 未処理TSN (Outstanding TSN, SCTPエンドポイントで): エンドポイントによって送信されたが、まだ確認応答を受信していないTSN(および関連するDATAチャンク)。

  • パス (Path): 1つのSCTPエンドポイントがピアSCTPエンドポイントの特定の宛先トランスポートアドレスに送信するSCTPパケットがとるルート。異なる宛先トランスポートアドレスへの送信は、必ずしも別々のパスを取得することを保証しません。

  • プライマリパス (Primary Path): デフォルトでピアエンドポイントへのアウトバウンドパケットに入れられる宛先および送信元アドレス。定義には送信元アドレスが含まれます。これは、実装が返信チャンクがとる戻りパスをより適切に制御し、データ送信者がマルチホームの場合にパケットが送信されるインターフェイスを指定することを望む場合があるためです。

  • 受信ウィンドウ (Receiver Window, rwnd): データ送信者がピアの最近計算された受信ウィンドウをバイト数で保存するために使用するSCTP変数。これにより、送信者は受信者のインバウンドバッファで利用可能なスペースを示すことができます。

  • SCTPアソシエーション (SCTP association): SCTPエンドポイント間のプロトコル関係で、2つのSCTPエンドポイントと、検証タグ (Verification Tags) や現在アクティブな伝送シーケンス番号 (TSN) のセットなどのプロトコル状態情報で構成されます。アソシエーションは、アソシエーション内のエンドポイントによって使用されるトランスポートアドレスによって一意に識別できます。2つのSCTPエンドポイントは、いつでも互いに複数のSCTPアソシエーションを持ってはなりません (MUST NOT)。

  • SCTPエンドポイント (SCTP endpoint): SCTPパケットの論理的な送信者/受信者。マルチホームホスト上では、SCTPエンドポイントは、SCTPパケットを送信できる適格な宛先トランスポートアドレスのセットと、SCTPパケットを受信できる適格な送信元トランスポートアドレスのセットの組み合わせとして、ピアに表されます。SCTPエンドポイントによって使用されるすべてのトランスポートアドレスは同じポート番号を使用する必要がありますが、複数のIPアドレスを使用できます。SCTPエンドポイントによって使用されるトランスポートアドレスは、別のSCTPエンドポイントによって使用されてはなりません。つまり、トランスポートアドレスはSCTPエンドポイントに固有です。

  • SCTPパケット(またはパケット) (SCTP packet or packet): SCTPとコネクションレス型パケットネットワーク(例: IP)との間のインターフェイス間のデータ配信単位。SCTPパケットには、共通SCTPヘッダー、可能なSCTP制御チャンク、およびSCTP DATAチャンク内にカプセル化されたユーザーデータが含まれます。

  • SCTPユーザーアプリケーション(SCTPユーザー) (SCTP user application, SCTP user): SCTPのサービスを使用する論理的な上位層アプリケーションエンティティで、上位層プロトコル (ULP) とも呼ばれます。

  • スロースタート閾値 (Slow-Start Threshold, ssthresh): SCTP変数。これは、エンドポイントが特定の宛先トランスポートアドレスでスロースタートまたは輻輳回避を実行するかどうかを判断するために使用する閾値です。Ssthreshはバイト数です。

  • ストリーム (Stream): 1つの関連するSCTPエンドポイントから別のエンドポイントに確立された単方向論理チャネルで、その中で、順序なし配信サービスに送信されたメッセージを除いて、すべてのユーザーメッセージが順番に配信されます。

注意: 反対方向のストリーム番号間の関係は、アプリケーションがそれらをどのように使用するかに厳密に依存します。望ましい場合、これらの相関を作成および管理することはSCTPユーザーの責任です。

  • ストリームシーケンス番号 (Stream Sequence Number): 指定されたストリーム内でのユーザーメッセージの順序付き配信を保証するためにSCTPが内部的に使用する16ビットシーケンス番号。各ユーザーメッセージに1つのストリームシーケンス番号が添付されます。

  • タイタグ (Tie-Tags): 2つの32ビット乱数で、合わせて64ビットのノンスを構成します。これらのタグはState CookieとTCB内で使用され、新しく再起動されたアソシエーションが再起動しなかったエンドポイント内の元のアソシエーションにリンクでき、既存のアソシエーションの真の検証タグを明らかにしないようにします。

  • 伝送制御ブロック (Transmission Control Block, TCB): SCTPエンドポイントが他のSCTPエンドポイントへの既存の各SCTPアソシエーションに対して作成する内部データ構造。TCBには、対応するアソシエーションを維持および管理するためのエンドポイントのすべてのステータスと操作情報が含まれます。

  • 伝送シーケンス番号 (Transmission Sequence Number, TSN): SCTPが内部的に使用する32ビットシーケンス番号。ユーザーデータを含む各チャンクに1つのTSNが添付され、受信SCTPエンドポイントがその受信を確認し、重複配信を検出できるようにします。

  • トランスポートアドレス (Transport address): トランスポートアドレスは、伝統的にネットワーク層アドレス、トランスポート層プロトコル、およびトランスポート層ポート番号によって定義されます。IP上で実行されるSCTPの場合、トランスポートアドレスは、IPアドレスとSCTPポート番号の組み合わせによって定義されます(SCTPはトランスポートプロトコルです)。

  • 未確認応答TSN (Unacknowledged TSN, SCTPエンドポイントで): エンドポイントによって受信されたが、まだ確認応答が送信されていないTSN(および関連するDATAチャンク)。または反対の場合、送信されたがまだ確認応答が受信されていないパケット。

  • 順序なしメッセージ (Unordered Message): 順序なしメッセージは、他のメッセージに関して「順序なし」です。これには、他の順序なしメッセージと他の順序付きメッセージの両方が含まれます。順序なしメッセージは、同じストリームで送信された順序付きメッセージの前または後に配信される場合があります。

  • ユーザーメッセージ (User message): SCTPとそのユーザー間のインターフェイス間のデータ配信単位。

  • 検証タグ (Verification Tag): ランダムに生成される32ビット符号なし整数。検証タグは、受信者がSCTPパケットが現在のアソシエーションに属し、以前のアソシエーションからの古いまたは古いパケットではないことを検証できるようにするキーを提供します。

1.4. 略語 (Abbreviations)

  • MAC - メッセージ認証コード (Message Authentication Code) [RFC2104]
  • RTO - 再送タイムアウト (Retransmission Timeout)
  • RTT - ラウンドトリップタイム (Round-Trip Time)
  • RTTVAR - ラウンドトリップタイム変動 (Round-Trip Time Variation)
  • SCTP - ストリーム制御伝送プロトコル (Stream Control Transmission Protocol)
  • SRTT - 平滑化RTT (Smoothed RTT)
  • TCB - 伝送制御ブロック (Transmission Control Block)
  • TLV - タイプ-長さ-値符号化形式 (Type-Length-Value coding format)
  • TSN - 伝送シーケンス番号 (Transmission Sequence Number)
  • ULP - 上位層プロトコル (Upper-Layer Protocol)

1.5. SCTPの機能ビュー (Functional View of SCTP)

SCTPトランスポートサービスは、多数の機能に分解できます。これらは図2に示されており、このセクションの残りの部分で説明されます。

                        SCTP User Application

-----------------------------------------------------
_____________ ____________________
| | | Sequenced Delivery |
| Association | | within Streams |
| | |____________________|
| Startup |
| | ____________________________
| and | | User Data Fragmentation |
| | |____________________________|
| Takedown |
| | ____________________________
| | | Acknowledgement |
| | | and |
| | | Congestion Avoidance |
| | |____________________________|
| |
| | ____________________________
| | | Chunk Bundling |
| | |____________________________|
| |
| | ________________________________
| | | Packet Validation |
| | |________________________________|
| |
| | ________________________________
| | | Path Management |
|_____________| |________________________________|

図2: SCTPトランスポートサービスの機能ビュー

1.5.1. アソシエーションの起動と停止 (Association Startup and Takedown)

アソシエーションは、SCTPユーザーからのリクエストによって開始されます(セクション10のASSOCIATE(またはSEND)プリミティブの説明を参照)。

初期化中に、同期攻撃に対する保護を提供するために、KarnとSimpsonが[RFC2522]で説明したものと同様のCookieメカニズムが採用されています。Cookieメカニズムは4ウェイハンドシェイクを使用し、その最後の2レッグでは、高速セットアップのためにユーザーデータを運ぶことが許可されています。起動シーケンスは、本文書のセクション5で説明されています。

SCTPは、SCTPユーザーからのリクエストに基づいて、アクティブなアソシエーションの優雅なクローズ(つまり、シャットダウン)を提供します。セクション10のSHUTDOWNプリミティブの説明を参照してください。SCTPはまた、ユーザーからのリクエスト(ABORTプリミティブ)またはSCTP層内で検出されたエラー条件の結果として、非優雅なクローズ(つまり、アボート)を許可します。セクション9では、優雅な閉鎖手順と非優雅な閉鎖手順の両方について説明します。

SCTPは、一方がデータを送信し続け、もう一方が閉じられているハーフオープン状態(TCPのように)をサポートしていません。いずれかのエンドポイントがシャットダウンを実行すると、各ピアのアソシエーションはユーザーからの新しいデータの受け入れを停止し、優雅なクローズ時にキューに入っているデータのみを配信します(セクション9を参照)。

1.5.2. ストリーム内での順序付き配信 (Sequenced Delivery within Streams)

「ストリーム」という用語は、SCTPでは、同じストリーム内の他のメッセージに関して上位層プロトコルに順番に配信される必要があるユーザーメッセージのシーケンスを指すために使用されます。これは、TCPでの使用法とは対照的であり、TCPではバイトのシーケンスを指します(本文書では、バイトは8ビットであると想定されています)。

SCTPユーザーは、アソシエーション起動時に、アソシエーションでサポートされるストリームの数を指定できます。この数値は、リモートエンド(セクション5.1.1参照)とネゴシエートされます。ユーザーメッセージはストリーム番号に関連付けられます(SEND、RECEIVEプリミティブ、セクション10)。内部的に、SCTPはSCTPユーザーから渡された各メッセージにストリームシーケンス番号を割り当てます。受信側では、SCTPは、特定のストリーム内でメッセージがSCTPユーザーに順番に配信されることを保証します。ただし、1つのストリームが次の順序内ユーザーメッセージを待ってブロックされている間でも、他のストリームからの配信は続行される場合があります。

SCTPは、順序付き配信サービスをバイパスするメカニズムを提供します。このメカニズムを使用して送信されたユーザーメッセージは、受信されるとすぐにSCTPユーザーに配信されます。

1.5.3. ユーザーデータの断片化 (User Data Fragmentation)

必要に応じて、SCTPはユーザーメッセージを断片化し、下位層に渡されるSCTPパケットがパスMTUに準拠するようにします。受信時に、フラグメントは完全なメッセージに再構成されてから、SCTPユーザーに渡されます。

1.5.4. 確認応答と輻輳回避 (Acknowledgement and Congestion Avoidance)

SCTPは、各ユーザーデータフラグメントまたは断片化されていないメッセージに伝送シーケンス番号 (TSN) を割り当てます。TSNは、ストリームレベルで割り当てられたストリームシーケンス番号から独立しています。受信側は、シーケンスにギャップがあっても、受信したすべてのTSNを確認応答します。このように、信頼性の高い配信は、順序付きストリーム配信から機能的に分離されます。

確認応答と輻輳回避機能は、タイムリーな確認応答が受信されていない場合のパケット再送信を担当します。パケット再送信は、TCPで使用されるものと同様の輻輳回避手順によって条件付けられます。この機能に関連するプロトコル手順の詳細な説明については、セクション6およびセクション7を参照してください。

1.5.5. チャンクのバンドル (Chunk Bundling)

セクション3で説明されているように、下位層に配信されるSCTPパケットは、共通ヘッダーの後に1つ以上のチャンクが続きます。各チャンクには、ユーザーデータまたはSCTP制御情報のいずれかが含まれる場合があります。SCTPユーザーには、複数のユーザーメッセージを単一のSCTPパケットにバンドルすることを要求するオプションがあります。SCTPのチャンクバンドル機能は、完全なSCTPパケットの組み立てと、受信側でのその分解を担当します。

輻輳時には、ユーザーがSCTPがバンドルしないように要求した場合でも、SCTP実装はバンドルを実行できます (MAY)。ユーザーのバンドルの無効化は、送信前に短時間遅延する可能性のあるSCTP実装にのみ影響します(バンドルを促進しようとするため)。ユーザー層がバンドルを無効にすると、この短い遅延は禁止されますが、輻輳または再送信中に実行されるバンドルは禁止されません。

1.5.6. パケット検証 (Packet Validation)

SCTP共通ヘッダーには、必須の検証タグフィールドと32ビットチェックサムフィールド(CRC32cチェックサムの説明については付録Bを参照)が含まれています。検証タグ値は、アソシエーション起動中にアソシエーションの各エンドによって選択されます。予期される検証タグ値なしで受信されたパケットは、ブラインドマスカレード攻撃および以前のアソシエーションからの古いSCTPパケットに対する保護として破棄されます。CRC32cチェックサムは、ネットワーク内のデータ破損に対する追加の保護を提供するために、各SCTPパケットの送信者によって設定されるべきです (should)。無効なCRC32cチェックサムを持つSCTPパケットの受信者は、パケットをサイレントに破棄します。

1.5.7. パス管理 (Path Management)

送信SCTPユーザーは、セクション10で説明されているプリミティブを通じて、SCTPパケットの宛先として使用されるトランスポートアドレスのセットを操作できます。SCTPパス管理機能は、SCTPユーザーの指示と適格な宛先セットの現在認識されている到達可能性ステータスに基づいて、送信する各SCTPパケットの宛先トランスポートアドレスを選択します。パス管理機能は、他のパケットトラフィックがこの情報を提供するのに不十分な場合にハートビートを通じて到達可能性を監視し、遠端のトランスポートアドレスの到達可能性が変化したときにSCTPユーザーに通知します。パス管理機能は、アソシエーション起動中に遠端にローカルトランスポートアドレスの適格なセットを報告し、遠端から返されたトランスポートアドレスをSCTPユーザーに報告する責任もあります。

アソシエーション起動時に、各SCTPエンドポイントに対してプライマリパスが定義され、SCTPパケットの通常の送信に使用されます。

受信側では、パス管理は、インバウンドSCTPパケットをさらに処理するために渡す前に、そのパケットが属する有効なSCTPアソシエーションの存在を検証する責任があります。

注意: パス管理とパケット検証は同時に実行されるため、上記で別々に説明されていますが、実際には別々の項目として実行することはできません。

1.6. シリアル番号演算 (Serial Number Arithmetic)

実際の伝送シーケンス番号空間は、非常に大きいものの有限であることを覚えておくことが重要です。この空間は0から232 - 1までの範囲です。空間は有限であるため、伝送シーケンス番号を扱うすべての算術は、モジュロ232で実行する必要があります。この符号なし算術は、シーケンス番号が232 - 1から0に再び循環する際の関係を保持します。コンピュータモジュロ演算にはいくつかの微妙な点があるため、このような値の比較をプログラミングする際には細心の注意を払う必要があります。TSNを参照する場合、記号「=<」は「以下」を意味します(モジュロ232)。

本文書のTSNの比較および算術は、SERIAL_BITS = 32である[RFC1982]で定義されているシリアル番号演算を使用すべきです (SHOULD)。

エンドポイントは、現在の送信ウィンドウの開始TSNよりも2**31 - 1を超えるTSNを持つDATAチャンクを送信すべきではありません (SHOULD NOT)。そうすると、TSNの比較で問題が発生します。

伝送シーケンス番号は、232 - 1に達すると折り返します。つまり、TSN = 232 - 1を送信した後にDATAチャンクが使用しなければならない (MUST) 次のTSNは、TSN = 0です。

ストリームシーケンス番号で実行される算術は、SERIAL_BITS = 16である[RFC1982]で定義されているシリアル番号演算を使用すべきです (SHOULD)。本文書の他のすべての算術および比較は、通常の算術を使用します。

1.7. RFC 2960からの変更 (Changes from RFC 2960)

SCTPは元々[RFC2960]で定義されており、本文書はそれを廃止します。本文書が組み込んださまざまな変更の詳細に興味がある読者は、[RFC4460]を参照してください。