9. アソシエーションの終了 (Termination of Association)
SCTPは、アソシエーション終了のために2つのメカニズムを提供します:正常シャットダウン (Shutdown) と強制中止 (Abort) です。
9.1. アソシエーションの中止 (Abort of an Association)
ABORTチャンクは、アソシエーションを即座に終了するために使用されます。これは異常終了であり、データ配信の保証はありません。
9.1.1. ABORTの送信
エンドポイントは、以下の状況でABORTチャンクを送信してもよい (MAY):
- プロトコル違反の検出
- 回復不能なエラーの受信
- アプリケーション層が即座の終了を要求
- リソース枯渇
ABORTチャンクフォーマット:
ABORTチャンクには以下が含まれる:
- Chunk Type = 6
- Tビット:Verification Tagの使用を示す
- エラー原因 (オプション):中止理由を記述
9.1.2. ABORTの受信
ABORTチャンクを受信すると、エンドポイントは以下を行わなければならない (MUST):
1. そのアソシエーションへの新しいデータの送信を停止
2. すべての未送信および未確認データを破棄
3. 上位層にアソシエーション中止を報告
4. TCBを破棄
5. 応答を送信しない
重要:ABORTは一方向であり、受信側は応答を送信してはならない (MUST NOT)。
9.1.3. ABORTの原因
一般的なABORT原因は以下の通り:
| 原因コード | 名前 | 説明 |
|---|---|---|
| 1 | Invalid Stream Identifier | 無効なストリーム識別子 |
| 2 | Missing Mandatory Parameter | 必須パラメータの欠落 |
| 3 | Stale Cookie Error | 古いCookie |
| 4 | Out of Resource | リソース不足 |
| 5 | Unresolvable Address | 解決不能なアドレス |
| 6 | Unrecognized Chunk Type | 認識できないチャンクタイプ |
| 7 | Invalid Mandatory Parameter | 無効な必須パラメータ |
| 8 | Unrecognized Parameters | 認識できないパラメータ |
| 9 | No User Data | ユーザーデータなし |
| 10 | Cookie Received While Shutting Down | シャットダウン中にCookieを受信 |
| 11 | Restart with New Addresses | 新しいアドレスで再起動 |
| 12 | User Initiated Abort | ユーザー開始の中止 |
| 13 | Protocol Violation | プロトコル違反 |
9.1.4. Tビットの使用
Tビット (T bit) は、ABORTチャンクでのVerification Tagの選択を制御します:
T=0:
- 通常のVerification Tagを使用
- 通常のアソシエーション内のABORTに使用
T=1:
- 受信したパケットのVerification Tagを使用
- "Out of the Blue"パケットへの応答に使用
- または正しいTagが不明な場合に使用
9.2. アソシエーションのシャットダウン (Shutdown of an Association)
SHUTDOWNは、すべてのデータが確実に配信されることを保証する、正常で秩序あるアソシエーション終了プロセスです。
9.2.1. シャットダウンプロセスの概要
正常シャットダウンは3つのチャンクの交換を含みます:
エンドポイントA エンドポイントZ
(送信データなし)
--------[SHUTDOWN]--------->
(残りのデータを送信)
<------[SHUTDOWN ACK]-------
-----[SHUTDOWN COMPLETE]---->
両側がTCBを破棄
9.2.2. SHUTDOWNの開始
ULPがアソシエーションのクローズを要求すると:
送信側の動作:
1. 新しいユーザーデータの受け入れを停止
2. すべての未送信データの送信を完了
3. すべての未確認データが確認されるまで待機
4. 累積TSN Ackを含むSHUTDOWNチャンクを送信
5. T2-shutdownタイマーを開始
SHUTDOWNチャンクフォーマット:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 7 | Flags | Length = 8 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cumulative TSN Ack |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9.2.3. SHUTDOWNの受信
SHUTDOWNチャンクを受信すると、エンドポイントは以下を行わなければならない (MUST):
1. 新しいユーザーデータの受け入れを停止
2. Cumulative TSN Ackまでのすべてのデータが送信されたことを確認
3. 未送信データがある場合は、送信を継続
4. すべてのデータが確認されたら、SHUTDOWN ACKを送信
5. T2-shutdownタイマーを開始
状態遷移:
ESTABLISHED -> SHUTDOWN-RECEIVED
9.2.4. SHUTDOWN ACKの送信
SHUTDOWN ACKチャンクフォーマット:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 8 | Flags | Length = 4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
送信タイミング:
- すべての受信データがULPに配信された
- すべてのローカルデータがピアによって確認された
9.2.5. SHUTDOWN ACKの受信
SHUTDOWN ACKを受信すると、エンドポイントは以下を行わなければならない (MUST):
1. SHUTDOWN COMPLETEチャンクを送信
2. T2-shutdownタイマーを停止
3. ULPにアソシエーションのクローズを報告
4. TCBを破棄
状態遷移:
SHUTDOWN-SENT -> CLOSED
9.2.6. SHUTDOWN COMPLETE
SHUTDOWN COMPLETEチャンクフォーマット:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 14 |Reserved |T| Length = 4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Tビットの使用:
- T=0:通常の場合、ローカルTagを使用
- T=1:予期しないSHUTDOWN ACKに応答する場合に使用
SHUTDOWN COMPLETEの受信:
1. T2-shutdownタイマーを停止
2. ULPにアソシエーションのクローズを報告
3. TCBを破棄
状態遷移:
SHUTDOWN-ACK-SENT -> CLOSED
9.2.7. T2-shutdownタイマー
目的:SHUTDOWNプロセスが無期限に待機しないことを保証します。
タイムアウト処理:
SHUTDOWN-SENT状態の場合:
- SHUTDOWNチャンクを再送信
- RTOを2倍にする
- T2-shutdownタイマーを再開始
SHUTDOWN-ACK-SENT状態の場合:
- SHUTDOWN ACKチャンクを再送信
- RTOを2倍にする
- T2-shutdownタイマーを再開始
再送信回数がAssociation.Max.Retransを超えた場合:
- ULPにエラーを報告
- TCBを破棄
9.2.8. シャットダウン中のデータ処理
SHUTDOWN-PENDING状態:
- データの通常の送受信を継続
- すべての未確認データが確認されるまで待機
SHUTDOWN-SENT状態:
- 新しいユーザーデータを受け入れない
- ピアのデータを受信してもよい
- 受信したデータを確認するためにSACKを送信
SHUTDOWN-RECEIVED状態:
- 新しいユーザーデータを受け入れない
- 未送信データの送信を継続
- ピアのデータを受信および確認
SHUTDOWN-ACK-SENT状態:
- 新しいユーザーデータを受け入れない
- 新しいデータを送信しない
- 重複したSHUTDOWNに応答してSHUTDOWN ACKを再送信
9.2.9. SHUTDOWNとABORTの比較
| 特徴 | SHUTDOWN | ABORT |
|---|---|---|
| データ保証 | すべての送信データが確認される | データ保証なし |
| 終了速度 | 遅い(ハンドシェイクあり) | 即座 |
| リソースクリーンアップ | 優雅なクリーンアップ | 即座のクリーンアップ |
| 使用ケース | 正常なクローズ | エラーまたは緊急事態 |
| 応答要求 | ピアの応答が必要 | 一方向、応答なし |
まとめ
SCTPは柔軟なアソシエーション終了メカニズムを提供します:
- SHUTDOWN:正常なクローズに適しており、データの整合性を保証
- ABORT:例外的な状況に適しており、即座の終了
ベストプラクティス:
- 正常なクローズにはSHUTDOWNを優先
- エラーまたはリソース問題の場合のみABORTを使用
- T2-shutdownタイマーのタイムアウトを適切に処理
- 適切な再送信メカニズムを実装