3. SCTPパケットフォーマット (SCTP Packet Format)
SCTPパケットは、共通ヘッダーとチャンク (chunks) で構成されます. チャンクには、制御情報またはユーザーデータが含まれます.
SCTPパケットフォーマットを以下に示します:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Common Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk #1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk #n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
複数のチャンクをMTUサイズまで1つのSCTPパケットにバンドルできますが、INIT、INIT ACK、SHUTDOWN COMPLETEチャンクは除外されます. これらのチャンクは、パケット内の他のチャンクとバンドルしてはなりません (MUST NOT). チャンクのバンドルの詳細については、セクション6.10を参照してください.
ユーザーデータメッセージが1つのSCTPパケットに収まらない場合、セクション6.9で定義されている手順を使用して複数のチャンクに断片化できます.
SCTPパケット内のすべての整数フィールドは、特に記載されていない限り、ネットワークバイトオーダーで送信する必要があります (MUST).
3.1. SCTP共通ヘッダーフィールドの説明 (SCTP Common Header Field Descriptions)
SCTP共通ヘッダーフォーマット
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 Number | Destination Port Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Verification Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
送信元ポート番号 (Source Port Number): 16ビット (符号なし整数)
これはSCTP送信者のポート番号です. 受信者は、このパケットが属するアソシエーションを識別するために、送信元IPアドレス、SCTP宛先ポート、および場合によっては宛先IPアドレスと組み合わせて使用できます. ポート番号0を使用してはなりません (MUST NOT).
宛先ポート番号 (Destination Port Number): 16ビット (符号なし整数)
これは、このパケットが宛先とするSCTPポート番号です. 受信ホストは、このポート番号を使用して、SCTPパケットを正しい受信エンドポイント/アプリケーションに逆多重化します. ポート番号0を使用してはなりません (MUST NOT).
検証タグ (Verification Tag): 32ビット (符号なし整数)
このパケットの受信者は、検証タグを使用してこのSCTPパケットの送信者を検証します. 送信時に、この検証タグの値は、アソシエーションの初期化中にピアエンドポイントから受信した開始タグ (Initiate Tag) の値に設定する必要があります (MUST)。ただし、以下の例外があります:
-
INITチャンクを含むパケットは、ゼロの検証タグを持つ必要があります (MUST).
-
Tビットが設定されたSHUTDOWN COMPLETEチャンクを含むパケットは、SHUTDOWN ACKチャンクを含むパケットから検証タグをコピーする必要があります (MUST).
-
ABORTチャンクを含むパケットは、ABORTの送信を引き起こしたパケットから検証タグをコピーすることができます (may). 詳細については、セクション8.4およびセクション8.5を参照してください.
INITチャンクは、それを運ぶSCTPパケット内の唯一のチャンクである必要があります (MUST).
チェックサム (Checksum): 32ビット (符号なし整数)
このフィールドには、このSCTPパケットのチェックサムが含まれます. その計算については、セクション6.8で説明されています. SCTPは、チェックサムの計算に付録Bで説明されているCRC32cアルゴリズムを使用します.
3.2. チャンクフィールドの説明 (Chunk Field Descriptions)
以下の図は、SCTPパケットで送信されるチャンクのフィールドフォーマットを示しています. 各チャンクは、チャンクタイプ (Chunk Type) フィールド、チャンク固有のフラグ (Flag) フィールド、チャンク長 (Chunk Length) フィールド、および値 (Value) フィールドでフォーマットされます.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk Type | Chunk Flags | Chunk Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Chunk Value /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
チャンクタイプ (Chunk Type): 8ビット (符号なし整数)
このフィールドは、チャンク値 (Chunk Value) フィールドに含まれる情報のタイプを識別します. 0から254までの値を取ります. 値255は、拡張フィールドとして将来使用するために予約されています.
チャンクタイプの値は次のように定義されます:
ID値 チャンクタイプ
----- ----------
0 - ペイロードデータ (Payload Data, DATA)
1 - 初期化 (Initiation, INIT)
2 - 初期化確認応答 (Initiation Acknowledgement, INIT ACK)
3 - 選択的確認応答 (Selective Acknowledgement, SACK)
4 - ハートビートリクエスト (Heartbeat Request, HEARTBEAT)
5 - ハートビート確認応答 (Heartbeat Acknowledgement, HEARTBEAT ACK)
6 - アボート (Abort, ABORT)
7 - シャットダウン (Shutdown, SHUTDOWN)
8 - シャットダウン確認応答 (Shutdown Acknowledgement, SHUTDOWN ACK)
9 - 操作エラー (Operation Error, ERROR)
10 - 状態Cookie (State Cookie, COOKIE ECHO)
11 - Cookie確認応答 (Cookie Acknowledgement, COOKIE ACK)
12 - 明示的輻輳通知エコー用に予約 (Reserved for ECNE)
13 - 輻輳ウィンドウ削減用に予約 (Reserved for CWR)
14 - シャットダウン完了 (Shutdown Complete, SHUTDOWN COMPLETE)
15~62 - 利用可能
63 - IETF定義のチャンク拡張用に予約
64~126 - 利用可能
127 - IETF定義のチャンク拡張用に予約
128~190 - 利用可能
191 - IETF定義のチャンク拡張用に予約
192~254 - 利用可能
255 - IETF定義のチャンク拡張用に予約
チャンクタイプは、処理エンドポイントがチャンクタイプを認識しない場合に取らなければならないアクションを最上位の2ビットが指定するようにエンコードされます.
00 - このSCTPパケットの処理を停止し、破棄します。その中のそれ以上のチャンクを処理しません.
01 - このSCTPパケットの処理を停止し、破棄します。その中のそれ以上のチャンクを処理せず、
「認識されないチャンクタイプ」で認識されないチャンクを報告します.
10 - このチャンクをスキップして処理を続行します.
11 - このチャンクをスキップして処理を続行しますが、
「認識されないチャンクタイプ」エラー原因を使用してERRORチャンクで報告します.
注: ECNEおよびCWRチャンクタイプは、明示的輻輳通知 (ECN) の将来の使用のために予約されています。付録Aを参照してください.
チャンクフラグ (Chunk Flags): 8ビット
これらのビットの使用は、チャンクタイプ (Chunk Type) フィールドによって与えられるチャンクタイプに依存します. 特に指定がない限り、送信時には0に設定され、受信時には無視されます.
チャンク長 (Chunk Length): 16ビット (符号なし整数)
この値は、チャンクタイプ、チャンクフラグ、チャンク長、およびチャンク値フィールドを含む、チャンクのサイズをバイト単位で表します. したがって、チャンク値フィールドの長さがゼロの場合、長さフィールドは4に設定されます. チャンク長フィールドは、チャンクパディングをカウントしません.
チャンク (タイプ、長さ、値フィールドを含む) は、送信者によってすべてゼロバイトで埋められて、4バイトの倍数の長さになります. このパディングは、合計で3バイトを超えてはなりません (MUST NOT). チャンク長値には、チャンクの終端パディングは含まれません. ただし、チャンク内の最後のパラメーター以外の可変長パラメーターのパディングは含まれます. 受信者はパディングを無視する必要があります (MUST).
注: 堅牢な実装は、最終的なパディングがチャンク長に含まれているかどうかに関係なく、チャンクを受け入れる必要があります.
チャンク値 (Chunk Value): 可変長
チャンク値フィールドには、チャンクで転送される実際の情報が含まれます. このフィールドの使用とフォーマットは、チャンクタイプに依存します.
チャンクの合計長 (タイプ、長さ、値フィールドを含む) は、4バイトの倍数である必要があります (MUST). チャンクの長さが4バイトの倍数でない場合、送信者はすべてゼロバイトでチャンクをパディングする必要があり (MUST)、このパディングはチャンク長フィールドに含まれません. 送信者は3バイトを超えてパディングしてはなりません (MUST NOT). 受信者はパディングバイトを無視する必要があります (MUST).
SCTP定義のチャンクは、セクション3.3で詳細に説明されています. IETF定義のチャンク拡張のガイドラインは、このドキュメントのセクション14.1にあります.
3.2.1. オプション/可変長パラメーターフォーマット (Optional/Variable-Length Parameter Format)
SCTP制御チャンクのチャンク値は、必須フィールドのチャンクタイプ固有のヘッダーで構成され、その後にゼロ個以上のパラメーターが続きます. チャンクに含まれるオプションおよび可変長パラメーターは、以下に示すタイプ-長さ-値フォーマットで定義されます.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Parameter Type | Parameter Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Parameter Value /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
チャンクパラメータータイプ (Chunk Parameter Type): 16ビット (符号なし整数)
タイプフィールドは、パラメータータイプの16ビット識別子です. 0から65534までの値を取ります.
値65535は、IETF定義の拡張のために予約されています. 特定のSCTPチャンクの説明で定義されているもの以外の値は、IETFが使用するために予約されています.
チャンクパラメーター長 (Chunk Parameter Length): 16ビット (符号なし整数)
パラメーター長フィールドには、パラメータータイプ、パラメーター長、およびパラメーター値フィールドを含む、パラメーターのサイズがバイト単位で含まれます. したがって、長さゼロのパラメーター値フィールドを持つパラメーターの長さフィールドは4になります. パラメーター長には、パディングバイトは含まれません.
チャンクパラメーター値 (Chunk Parameter Value): 可変長
パラメーター値フィールドには、パラメーターで転送される実際の情報が含まれます.
パラメーターの合計長 (タイプ、パラメーター長、値フィールドを含む) は、4バイトの倍数である必要があります (MUST). パラメーターの長さが4バイトの倍数でない場合、送信者は、パラメーターの末尾 (つまり、パラメーター値フィールドの後) にすべてゼロバイトでパラメーターをパディングします. パディングの長さは、パラメーター長フィールドに含まれません. 送信者は3バイトを超えてパディングしてはなりません (MUST NOT). 受信者はパディングバイトを無視する必要があります (MUST).
パラメータータイプは、処理エンドポイントがパラメータータイプを認識しない場合に取らなければならないアクションを最上位の2ビットが指定するようにエンコードされます.
00 - このパラメーターの処理を停止します。このチャンク内のそれ以上のパラメーターを処理しません.
01 - このパラメーターの処理を停止し、このチャンク内のそれ以上のパラメーターを処理せず、
セクション3.2.2で説明されているように、「認識されないパラメーター」で
認識されないパラメーターを報告します.
10 - このパラメーターをスキップして処理を続行します.
11 - このパラメーターをスキップして処理を続行しますが、
セクション3.2.2で説明されているように、「認識されないパラメーター」で
認識されないパラメーターを報告します.
4つのケースすべてで、INIT ACKまたはCOOKIE ECHOチャンクが送信されることに注意してください. 00または01のケースでは、未知のパラメーターの後のパラメーターの処理はキャンセルされますが、すでに実行された処理はロールバックされません.
実際のSCTPパラメーターは、特定のSCTPチャンクセクションで定義されています. IETF定義のパラメーター拡張のルールは、セクション14.2で定義されています. パラメータータイプは、すべてのチャンクで一意である必要があることに注意してください (MUST). たとえば、パラメータータイプ「5」は、IPv4アドレスを表すために使用されます (セクション3.3.2.1を参照). 次に、値「5」は、すべてのチャンクでIPv4アドレスを表すために予約され、他のチャンクで異なる意味で再利用してはなりません (MUST NOT).
3.2.2. 認識されないパラメーターの報告 (Reporting of Unrecognized Parameters)
INITチャンクの受信者が認識されないパラメーターを検出し、セクション3.2.1に従ってそれらを報告する必要がある場合、INITチャンクへの応答として送信されるINIT ACKチャンクに「認識されないパラメーター」パラメーターを入れる必要があります (MUST). INITチャンクの受信者がアソシエーションを確立しない場合 (たとえば、リソース不足のため)、INITの送信者に送信されるABORTに「認識されないパラメーター」が含まれないことに注意してください.
INIT ACKチャンクの受信者が認識されないパラメーターを検出し、セクション3.2.1に従ってそれらを報告する必要がある場合、INIT ACKチャンクへの応答として送信されるCOOKIE ECHOチャンクと「認識されないパラメーター」エラー原因を含むERRORチャンクをバンドルする必要があります (SHOULD). INIT ACKの受信者がCOOKIE ECHOチャンクをERRORチャンクとバンドルできない場合、ERRORチャンクは個別に送信できますが (MAY)、COOKIE ACKが受信される前ではありません.
注: COOKIE ECHOがパケットで送信される場合、それは常に最初のチャンクである必要があります (MUST).
3.3. SCTPチャンク定義 (SCTP Chunk Definitions)
このセクションでは、さまざまなSCTPチャンクタイプのフォーマットを定義します.
注: セクション3.3には、さまざまなチャンクタイプ (DATA、INIT、INIT ACK、SACKなど) を詳細に定義する多数のサブセクション (3.3.1〜3.3.13) が含まれているため、これらの内容は後続のドキュメントで続行されます.