10. 上位層とのインターフェース (Interface with Upper Layer)
本章では、SCTPと上位層プロトコル (ULP) 間のインターフェースサービスを定義します。これらは抽象インターフェースであり、実際の実装はオペレーティングシステムによって異なる場合があります。
10.1. ULPからSCTPへ (ULP-to-SCTP)
ULPは以下のプリミティブを使用してSCTPにコマンドとデータを送信します:
10.1.1. Initialize
フォーマット: INITIALIZE([local port], [local eligible address list])
目的: SCTPエンドポイントを初期化します。
パラメータ:
- local port: ローカルポート番号 (オプション)
- local eligible address list: ローカル適格アドレスリスト (オプション)
結果:
- 成功: ローカルエンドポイントハンドルを返す
- 失敗: エラーコードを返す
説明:
- SCTPエンドポイントのリソースを割り当て
- 指定されたローカルポートとアドレスにバインド
- ポートが指定されていない場合、システムが自動割り当て
- アドレスが指定されていない場合、すべての利用可能なローカルアドレスを使用
10.1.2. Associate
フォーマット: ASSOCIATE(local SCTP instance name, destination transport addr, outbound stream count)
目的: リモートSCTPエンドポイントとの新しいアソシエーションの確立を要求します。
必須パラメータ:
- local SCTP instance name: ローカルSCTPインスタンス名
- destination transport addr: 宛先トランスポートアドレス (IPアドレスとポート)
- outbound stream count: 要求するアウトバウンドストリーム数
オプションパラメータ:
- destination transport addr list: 宛先トランスポートアドレスリスト (マルチホーミング用)
- stream payload protocol identifier: ストリームペイロードプロトコル識別子
結果:
- COMMUNICATION UP: アソシエーションが正常に確立された
- COMMUNICATION LOST: アソシエーション確立が失敗した
説明:
1. INITチャンクを生成
2. T1-initタイマーを開始
3. 宛先アドレスにINITを送信
4. INIT ACKを待機
5. COOKIE ECHOを送信
6. COOKIE ACKを待機
7. ESTABLISHED状態に入る
10.1.3. Send
フォーマット: SEND(association id, buffer address, byte count [,context] [,stream id] [,life time] [,destination transport address] [,unordered flag] [,no-bundle flag] [,payload protocol-id])
目的: ユーザーメッセージをSCTPに渡して送信します。
必須パラメータ:
- association id: アソシエーション識別子
- buffer address: バッファアドレス
- byte count: バイト数
オプションパラメータ:
- context: ユーザーコンテキスト (エラー報告用)
- stream id: ストリーム識別子 (デフォルト0)
- life time: メッセージライフタイム (ミリ秒)
- destination transport address: 宛先トランスポートアドレス
- unordered flag: 順序なし配信フラグ
- no-bundle flag: バンドル禁止フラグ
- payload protocol-id: ペイロードプロトコルID
結果:
- 成功: メッセージが送信のために受け入れられた
- 失敗: エラーコードを返す
説明:
- ユーザーデータをDATAチャンクにセグメント化
- ストリームIDとSSNに従って割り当て
- ライフタイムが指定されている場合、タイムアウト時に破棄
- デフォルトで主要宛先アドレスを使用
10.1.4. Shutdown
フォーマット: SHUTDOWN(association id)
目的: アソシエーションを優雅にクローズします。
必須パラメータ:
- association id: アソシエーション識別子
結果:
- SHUTDOWN COMPLETE: シャットダウン成功
- COMMUNICATION LOST: シャットダウン失敗
説明:
1. 新しいユーザーデータの受け入れを停止
2. すべての未送信データの送信を完了
3. すべてのデータが確認されるまで待機
4. SHUTDOWNチャンクを送信
5. SHUTDOWN ACKを待機
6. SHUTDOWN COMPLETEを送信
7. TCBを破棄
10.1.5. Abort
フォーマット: ABORT(association id [,Upper Layer Abort Reason])
目的: アソシエーションを即座に終了します。
必須パラメータ:
- association id: アソシエーション識別子
オプションパラメータ:
- Upper Layer Abort Reason: 上位層中止理由
結果:
- COMMUNICATION LOST: アソシエーションが中止された
説明:
1. ABORTチャンクを送信 (理由を含む)
2. すべての未送信および未確認データを破棄
3. TCBを破棄
4. ULPにCOMMUNICATION LOSTを報告
10.1.6. Set Primary
フォーマット: SET PRIMARY(association id, destination transport address)
目的: 主要宛先アドレスを設定します。
必須パラメータ:
- association id: アソシエーション識別子
- destination transport address: 宛先トランスポートアドレス
結果:
- 成功: 主要アドレスが更新された
- 失敗: アドレスがアソシエーションのピアアドレスリストにない
説明:
- 現在の主要宛先アドレスを変更
- トラフィックエンジニアリングまたは障害回復に使用
- アドレスはアソシエーションの有効なピアアドレスである必要がある
10.1.7. Receive
フォーマット: RECEIVE(association id, buffer address, buffer size)
目的: SCTPからデータを受信します。
必須パラメータ:
- association id: アソシエーション識別子
- buffer address: 受信バッファアドレス
- buffer size: バッファサイズ
戻り値:
- byte count: 受信したバイト数
- stream id: ストリーム識別子
- stream sequence number: ストリームシーケンス番号
- partial flag: 部分配信フラグ
- delivery number: 配信番号
- transport address: ソーストランスポートアドレス
説明:
- 受信キューからユーザーメッセージを抽出
- データがない場合はブロックする可能性がある (実装依存)
- ストリームIDとSSNの順序で配信 (順序なしでない限り)
10.1.8. Status
フォーマット: STATUS(association id)
目的: 現在のアソシエーションステータスを照会します。
必須パラメータ:
- association id: アソシエーション識別子
戻り値:
- association connection state: アソシエーション接続状態
- destination transport address list: 宛先トランスポートアドレスリスト
- destination transport address reachability states: 宛先トランスポートアドレス到達可能性状態
- current receiver window size: 現在の受信ウィンドウサイズ
- current congestion window sizes: 現在の輻輳ウィンドウサイズ
- number of outbound streams: アウトバウンドストリーム数
- number of inbound streams: インバウンドストリーム数
- primary path: 主要パス
10.1.9. Change Heartbeat
フォーマット: CHANGE HEARTBEAT(association id, destination transport address, new state [,interval])
目的: 特定の宛先アドレスのハートビートを有効または無効にします。
必須パラメータ:
- association id: アソシエーション識別子
- destination transport address: 宛先トランスポートアドレス
- new state: 新しい状態 (有効/無効)
オプションパラメータ:
- interval: ハートビート間隔 (ミリ秒)
10.1.10. Request Heartbeat
フォーマット: REQUEST HEARTBEAT(association id, destination transport address)
目的: 特定の宛先アドレスへのハートビート送信を要求します。
必須パラメータ:
- association id: アソシエーション識別子
- destination transport address: 宛先トランスポートアドレス
用途:
- 特定のパスの到達可能性をテスト
- パスのRTT推定を更新
10.1.11. Get SRTT Report
フォーマット: GET SRTT REPORT(association id, destination transport address)
目的: 特定の宛先アドレスのSRTT (平滑化往復時間) を取得します。
戻り値:
- srtt: 現在のSRTT値
- last update time: 最終更新時刻
10.1.12. Set Failure Threshold
フォーマット: SET FAILURE THRESHOLD(association id, destination transport address, failure threshold)
目的: パス障害閾値を設定します。
パラメータ:
- association id: アソシエーション識別子
- destination transport address: 宛先トランスポートアドレス
- failure threshold: 障害閾値
10.1.13. Set Protocol Parameters
フォーマット: SET PROTOCOL PARAMETERS(association id, [,destination transport address,] protocol parameter list)
目的: SCTPプロトコルパラメータを設定します。
設定可能なパラメータ:
- RTO.Initial: 初期再送信タイムアウト
- RTO.Min: 最小再送信タイムアウト
- RTO.Max: 最大再送信タイムアウト
- RTO.Alpha: SRTT推定器のアルファ値
- RTO.Beta: SRTT推定器のベータ値
- Max.Burst: 最大バーストサイズ
- Association.Max.Retrans: アソシエーション最大再送信回数
- Path.Max.Retrans: パス最大再送信回数
- Valid.Cookie.Life: 有効なCookieライフタイム
- SACK.Delay: SACK遅延
10.1.14. Destroy SCTP Instance
フォーマット: DESTROY(local SCTP instance name)
目的: SCTPインスタンスを破棄します。
説明:
1. すべてのアクティブなアソシエーションを中止
2. すべてのリソースを解放
3. ポートとアドレスのバインドを解除
10.2. SCTPからULPへ (SCTP-to-ULP)
SCTPは以下のプリミティブを使用してULPにイベントを報告します:
10.2.1. COMMUNICATION UP
フォーマット: COMMUNICATION UP(association id, destination transport address list, outbound stream count, inbound stream count)
トリガー条件:
- 新しいアソシエーションが正常に確立された (ASSOCIATE完了)
- パッシブ側として新しいアソシエーションを受け入れた (INITを受信し4ウェイハンドシェイクを完了)
パラメータ:
- association id: 新しく確立されたアソシエーション識別子
- destination transport address list: ピアアドレスリスト
- outbound stream count: ネゴシエートされたアウトバウンドストリーム数
- inbound stream count: ネゴシエートされたインバウンドストリーム数
10.2.2. DATA ARRIVE
フォーマット: DATA ARRIVE(association id, stream id, stream sequence number, flags, payload protocol identifier, user data)
トリガー条件:
- ピアからユーザーデータを受信
パラメータ:
- association id: アソシエーション識別子
- stream id: ストリーム識別子
- stream sequence number: ストリームシーケンス番号
- flags: フラグ (例: 順序なしフラグ)
- payload protocol identifier: ペイロードプロトコル識別子
- user data: ユーザーデータ
説明:
- ULPに新しいデータが利用可能であることを通知
- ULPはRECEIVEプリミティブを使用してデータを取得する必要がある
- データはストリームIDとSSNの順序で配信 (順序なしでない限り)
10.2.3. COMMUNICATION LOST
フォーマット: COMMUNICATION LOST(association id, status)
トリガー条件:
- アソシエーションが失敗または中止された
- ピアエンドポイント障害が検出された
- ABORTチャンクを受信
- SHUTDOWNが失敗
パラメータ:
- association id: アソシエーション識別子
- status: 失敗理由
- Association exceeded maximum retransmissions: 最大再送信回数を超えた
- Peer sent ABORT: ピアがABORTを送信
- Peer unexpectedly closed: ピアが予期せずクローズ
- Resources unavailable: リソースが利用できない
10.2.4. COMMUNICATION ERROR
フォーマット: COMMUNICATION ERROR(association id, error info)
トリガー条件:
- 回復可能な通信エラーが検出された
- ERRORチャンクを受信
- パス障害 (ただしアソシエーションは依然としてアクティブ)
パラメータ:
- association id: アソシエーション識別子
- error info: エラー情報
10.2.5. RESTART
フォーマット: RESTART(association id, peer's new tag)
トリガー条件:
- ピアエンドポイントの再起動が検出された
パラメータ:
- association id: アソシエーション識別子
- peer's new tag: ピアの新しいタグ
説明:
- ULPにピアが再起動したことを通知
- ULPは処理方法を決定する必要がある (再確立または終了)
- アプリケーション層状態の再同期が必要な場合がある
10.2.6. SHUTDOWN COMPLETE
フォーマット: SHUTDOWN COMPLETE(association id)
トリガー条件:
- 優雅なシャットダウンプロセスが正常に完了した
パラメータ:
- association id: アソシエーション識別子
説明:
- アソシエーションが正常にクローズされた
- すべてのデータが確実に配信された
- TCBが破棄された
10.2.7. SEND FAILURE
フォーマット: SEND FAILURE(association id, data retrieval id, cause code, context)
トリガー条件:
- 何らかの理由でデータの送信に失敗した
- 最大再送信回数に達した
- メッセージライフタイムが期限切れになった
パラメータ:
- association id: アソシエーション識別子
- data retrieval id: データ取得識別子
- cause code: 失敗原因コード
- context: ユーザーコンテキスト (SENDプリミティブから)
原因コード:
- Message expired: メッセージが期限切れ
- Association aborted: アソシエーションが中止された
- Send failed: 送信失敗
10.2.8. NETWORK STATUS CHANGE
フォーマット: NETWORK STATUS CHANGE(association id, destination transport address, new status)
トリガー条件:
- 宛先トランスポートアドレスの状態が変更された
- パスがアクティブまたは非アクティブになった
パラメータ:
- association id: アソシエーション識別子
- destination transport address: 宛先トランスポートアドレス
- new status: 新しい状態
- Active: パスが現在利用可能
- Inactive: パスが現在利用不可
- Unconfirmed: パスが未確認
まとめ
SCTPのULPインターフェースは以下を提供します:
- 完全なアソシエーション管理: 初期化、確立、クローズ、中止
- 柔軟なデータ送信: マルチストリーム、順序あり/なし、ライフタイムをサポート
- パス管理: ハートビート、障害検出、主要パス選択
- ステータス監視: アソシエーションステータス照会、ネットワークステータス変更通知
- パラメータ構成: プロトコルパラメータのランタイム調整
ベストプラクティス:
- すべてのSCTPからULPへの通知を適切に処理
- ストリームIDを使用して論理的なデータ分離を実現
- 合理的なメッセージライフタイムを設定
- ネットワークステータスの変更を監視して応答
- 強制中止よりも優雅なシャットダウンを優先