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

6. STUN Message Structure (STUNメッセージ構造)

STUNメッセージは、ネットワーク指向フォーマット (最上位バイトまたはオクテットが最初、一般にビッグエンディアンとも呼ばれる) を使用してバイナリでエンコードされます。伝送順序は、RFC 791 [RFC0791] の付録Bで詳しく説明されています。特に記載がない限り、数値定数は10進数 (基数10) です。

すべてのSTUNメッセージは、20バイトのヘッダーで始まり、その後に0個以上の属性 (Attributes) が続く必要があります (MUST)。STUNヘッダーには、STUNメッセージタイプ、マジッククッキー (magic cookie)、トランザクションID (transaction ID)、およびメッセージ長が含まれます。

    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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0| STUN Message Type | Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic Cookie |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Transaction ID (96 bits) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

図2: STUNメッセージヘッダーのフォーマット

すべてのSTUNメッセージの最上位2ビットはゼロでなければなりません (MUST)。これは、STUNが同じポート上で他のプロトコルと多重化される場合に、STUNパケットを他のプロトコルと区別するために使用できます。

メッセージタイプ (message type) は、メッセージクラス (request, success response, failure response, または indication) とSTUNメッセージのメッセージメソッド (message method) (主要機能) を定義します。4つのメッセージクラスがありますが、STUNには2つのタイプのトランザクションのみがあります:リクエスト/レスポンストランザクション (request/response transactions) (リクエストメッセージとレスポンスメッセージで構成) とインディケーショントランザクション (indication transactions) (単一のインディケーションメッセージで構成)。レスポンスクラスは、STUNメッセージの迅速な処理を支援するために、エラーレスポンスと成功レスポンスに分割されています。

メッセージタイプフィールドは、さらに次の構造に細分化されます:

                     0                 1
2 3 4 5 6 7 8 9 0 1 2 3 4 5

+--+--+-+-+-+-+-+-+-+-+-+-+-+-+
|M |M |M|M|M|C|M|M|M|C|M|M|M|M|
|11|10|9|8|7|1|6|5|4|0|3|2|1|0|
+--+--+-+-+-+-+-+-+-+-+-+-+-+-+

図3: STUNメッセージタイプフィールドのフォーマット

ここで、メッセージタイプフィールドのビットは、最上位ビット (M11) から最下位ビット (M0) として示されています。M11からM0は、メソッドの12ビットエンコーディングを表します。C1とC0は、クラスの2ビットエンコーディングを表します。クラス0b00はリクエスト (request)、クラス0b01はインディケーション (indication)、クラス0b10は成功レスポンス (success response)、クラス0b11はエラーレスポンス (error response) です。本仕様は単一のメソッド、Bindingを定義します。メソッドとクラスは直交しているため、各メソッドに対して、そのメソッドのリクエスト、成功レスポンス、エラーレスポンス、およびインディケーションが可能です。新しいメソッドを定義する拡張は、そのメソッドに許可されるクラスを示す必要があります (MUST)。

例えば、バインディングリクエスト (Binding request) は、class=0b00 (request) およびmethod=0b000000000001 (Binding) であり、最初の16ビットに0x0001としてエンコードされます。バインディングレスポンス (Binding response) は、class=0b10 (success response) およびmethod=0b000000000001であり、最初の16ビットに0x0101としてエンコードされます。

マジッククッキーフィールドは、ネットワークバイトオーダーで固定値0x2112A442を含む必要があります (MUST)。RFC 3489 [RFC3489] では、このフィールドはトランザクションIDの一部でした。このマジッククッキーをこの位置に配置することで、サーバーはクライアントがこの改訂仕様で追加された特定の属性を理解できるかどうかを検出できます。さらに、STUNが同じポート上で他のプロトコルと多重化される場合に、STUNパケットを他のプロトコルのパケットと区別するのに役立ちます。

トランザクションID (transaction ID) は、STUNトランザクションを一意に識別するために使用される96ビット識別子です。リクエスト/レスポンストランザクションの場合、トランザクションIDはSTUNクライアントがリクエスト用に選択し、サーバーがレスポンスでエコーバックします。インディケーションの場合、インディケーションを送信するエージェントによって選択されます。主にリクエストとレスポンスを関連付けるために機能しますが、特定の種類の攻撃を防ぐのに小さな役割も果たします。サーバーは、すべてのクライアントにわたって各トランザクションを一意に識別するためのキーとしてトランザクションIDも使用します。したがって、トランザクションIDは区間0 .. 2**96-1から均一にランダムに選択される必要があり (MUST)、暗号学的にランダムであるべきです (SHOULD)。同じリクエストの再送信は同じトランザクションIDを再利用しますが、クライアントは新しいトランザクションに対して新しいトランザクションIDを選択する必要があります (MUST)。ただし、新しいリクエストが以前のリクエストとビット単位で同一で、同じトランスポートアドレスから同じIPアドレスに送信される場合を除きます。成功レスポンスとエラーレスポンスは、対応するリクエストと同じトランザクションIDを持つ必要があります (MUST)。エージェントが同じポートでSTUNサーバーとSTUNクライアントの両方として動作している場合、エージェントが送信するリクエストのトランザクションIDは、エージェントが受信するリクエストのトランザクションIDとは関係ありません。

メッセージ長 (message length) は、20バイトのSTUNヘッダーを含まないメッセージのサイズをバイト単位で含む必要があります (MUST)。すべてのSTUN属性は4バイトの倍数にパディングされるため、このフィールドの最後の2ビットは常にゼロです。これにより、STUNパケットを他のプロトコルのパケットと区別する別の方法が提供されます。

STUN固定ヘッダーの後には、0個以上の属性が続きます。各属性はTLV (Type-Length-Value) でエンコードされます。エンコーディングの詳細と属性自体については、第15節で説明します。