15. Grammar (文法)
この仕様は、7 つの新しい SDP 属性を定義します。「candidate」、「remote-candidates」、「ice-lite」、「ice-mismatch」、「ice-ufrag」、「ice-pwd」、および「ice-options」属性です。
15.1. "candidate" Attribute ("candidate" 属性)
Candidate 属性は、メディアレベルの属性のみです。これは、接続性チェックに使用できる候補のトランスポートアドレスを含みます。
この属性の構文は、RFC 5234 [RFC5234] で定義されている Augmented BNF を使用して定義されています。
candidate-attribute = "candidate" ":" foundation SP component-id SP
transport SP
priority SP
connection-address SP ;from RFC 4566
port ;port from RFC 4566
SP cand-type
[SP rel-addr]
[SP rel-port]
*(SP extension-att-name SP
extension-att-value)
foundation = 1*32ice-char
component-id = 1*5DIGIT
transport = "UDP" / transport-extension
transport-extension = token ; from RFC 3261
priority = 1*10DIGIT
cand-type = "typ" SP candidate-types
candidate-types = "host" / "srflx" / "prflx" / "relay" / token
rel-addr = "raddr" SP connection-address
rel-port = "rport" SP port
extension-att-name = byte-string ;from RFC 4566
extension-att-value = byte-string
ice-char = ALPHA / DIGIT / "+" / "/"
この文法は、候補に関する主要な情報(IP アドレス、ポート、トランスポートプロトコル)と、そのプロパティ(foundation、コンポーネント ID、優先順位、タイプ、および関連するトランスポートアドレス)をエンコードします。
<connection-address>: RFC 4566 [RFC4566] から取得されます。これは候補の IP アドレスであり、IPv4 アドレス、IPv6 アドレス、および完全修飾ドメイン名(FQDN)を許可します。このフィールドを解析するとき、エージェントは値にコロンが存在するかどうかで IPv4 アドレスと IPv6 アドレスを区別できます。コロンの存在は IPv6 を示します。エージェントは、サポートまたは認識されていない IP アドレスバージョンの候補を含む candidate 行を無視しなければなりません (MUST)。IP アドレスを使用すべきです (SHOULD) が、IP アドレスの代わりに FQDN を使用してもかまいません (MAY)。その場合、a=candidate 属性に FQDN を含むオファーまたはアンサーを受信すると、FQDN は最初に AAAA レコードを使用して DNS で検索され(エージェントが IPv6 をサポートしていると仮定)、結果が見つからないかエージェントが IPv4 のみをサポートしている場合は A を使用します。DNS クエリが複数の IP アドレスを返す場合、1 つが選択され、ICE 処理の残りの部分で使用されます。
<port>: RFC 4566 [RFC4566] からも取得されます。これは候補のポートです。
<transport>: 候補のトランスポートプロトコルを示します。この仕様では UDP のみが定義されています。ただし、TCP やデータグラム輻輳制御プロトコル(DCCP)[RFC4340] など、将来のトランスポートプロトコルを ICE で使用できるように拡張性が提供されています。
<foundation>: 1 から 32 個の <ice-char> で構成されます。これは、同じタイプで、同じベースを共有し、同じ STUN サーバーからの 2 つの候補に対して同等の識別子です。Foundation は、Frozen アルゴリズムで ICE パフォーマンスを最適化するために使用されます。
<component-id>: 1 から 256 までの正の整数で、これが候補であるメディアストリームの特定のコンポーネントを識別します。これは 1 で開始しなければならず (MUST)、特定の候補のコンポーネントごとに 1 ずつ増加しなければなりません (MUST)。RTP に基づくメディアストリームの場合、実際の RTP メディアの候補はコンポーネント ID 1 を持たなければならず (MUST)、RTCP の候補はコンポーネント ID 2 を持たなければなりません (MUST)。複数のコンポーネントを必要とする他のタイプのメディアストリームは、コンポーネントのコンポーネント ID へのマッピングを定義する仕様を開発しなければなりません (MUST)。新しいメディアストリームへの ICE の拡張に関する追加の議論については、セクション 14 を参照してください。
<priority>: 1 から (2**31 - 1) までの正の整数です。
<cand-type>: 候補のタイプをエンコードします。この仕様では、host、server reflexive、peer reflexive、および relayed 候補に対して、それぞれ値 "host"、"srflx"、"prflx"、および "relay" を定義しています。候補タイプのセットは将来のために拡張可能です。
<rel-addr> および <rel-port>: 候補に関連するトランスポートアドレスを伝達し、診断やその他の目的に役立ちます。<rel-addr> および <rel-port> は、server reflexive、peer reflexive、および relayed 候補の場合に存在しなければなりません (MUST)。候補が server または peer reflexive の場合、<rel-addr> および <rel-port> は、その server または peer reflexive 候補のベースと同じです。候補が relayed の場合、<rel-addr> および <rel-port> は、クライアントにその relayed 候補を提供した Allocate 応答内のマップされたアドレスと同じです(その目的の議論については、付録 B.3 を参照してください)。候補が host 候補の場合、<rel-addr> および <rel-port> は省略しなければなりません (MUST)。
Candidate 属性自体も拡張できます。文法では、属性の最後に新しい名前/値のペアを追加できます。実装は、理解できない名前/値のペアを無視しなければなりません (MUST)。
15.2. "remote-candidates" Attribute ("remote-candidates" 属性)
"remote-candidates" 属性の構文は、RFC 5234 [RFC5234] で定義されている Augmented BNF を使用して定義されています。remote-candidates 属性は、メディアレベルの属性のみです。
remote-candidate-att = "remote-candidates" ":" remote-candidate
0*(SP remote-candidate)
remote-candidate = component-ID SP connection-address SP port
この属性には、各コンポーネントの connection-address とポートが含まれています。コンポーネントの順序は無関係です。ただし、メディアストリームの各コンポーネントに対して値が存在しなければなりません (MUST)。この属性は、Completed であるメディアストリームの制御エージェントによるオファーに含まれなければならず (MUST)、その他の場合には含まれてはなりません (MUST NOT)。
15.3. "ice-lite" and "ice-mismatch" Attributes ("ice-lite" および "ice-mismatch" 属性)
"ice-lite" および "ice-mismatch" 属性(どちらもフラグ)の構文は次のとおりです。
ice-lite = "ice-lite"
ice-mismatch = "ice-mismatch"
"ice-lite" はセッションレベルの属性のみであり、エージェントが lite 実装であることを示します。"ice-mismatch" はメディアレベルの属性のみであり、アンサーに存在する場合、対応する candidate 属性を持たないメディアコンポーネントのデフォルトの宛先とともにオファーが到着したことを示します。
15.4. "ice-ufrag" and "ice-pwd" Attributes ("ice-ufrag" および "ice-pwd" 属性)
"ice-ufrag" および "ice-pwd" 属性は、メッセージの整合性のために ICE によって使用されるユーザー名フラグメントとパスワードを伝達します。それらの構文は次のとおりです。
ice-pwd-att = "ice-pwd" ":" password
ice-ufrag-att = "ice-ufrag" ":" ufrag
password = 22*256ice-char
ufrag = 4*256ice-char
"ice-pwd" および "ice-ufrag" 属性は、セッションレベルまたはメディアレベルのいずれかに表示できます。両方に存在する場合、メディアレベルの値が優先されます。したがって、セッションレベルの値は、メディアレベルの値によってオーバーライドされない限り、実質的にすべてのメディアストリームに適用されるデフォルトです。セッションレベルまたはメディアレベルのどちらに存在する場合でも、各メディアストリームには ice-pwd および ice-ufrag 属性がなければなりません (MUST)。2 つのメディアストリームが同一の ice-ufrag を持つ場合、それらは同一の ice-pwd を持たなければなりません (MUST)。
Ice-ufrag および ice-pwd 属性は、セッションの開始時にランダムに選択されなければなりません (MUST)。Ice-ufrag 属性は少なくとも 24 ビットのランダム性を含まなければならず (MUST)、ice-pwd 属性は少なくとも 128 ビットのランダム性を含まなければなりません (MUST)。これは、これらの属性の文法が文字あたり 6 ビットのランダム性を許可するため、ice-ufrag 属性は少なくとも 4 文字の長さになり、ice-pwd は少なくとも 22 文字の長さになることを意味します。属性は、もちろん、最大 256 文字まで、それぞれ 4 文字および 22 文字より長くてもかまいません (MAY)。上限は、実装でのバッファサイジングを可能にします。その大きな上限により、時間の経過とともにランダム性の量を増やすことができます。
15.5. "ice-options" Attribute ("ice-options" 属性)
"ice-options" 属性は、セッションレベルの属性です。これは、エージェントによってサポートされるオプションを識別する一連のトークンを含みます。その文法は次のとおりです。
ice-options = "ice-options" ":" ice-option-tag
0*(SP ice-option-tag)
ice-option-tag = 1*ice-char