15. Grammar (Grammatik)
Diese Spezifikation definiert sieben neue SDP-Attribute – die Attribute „candidate“, „remote-candidates“, „ice-lite“, „ice-mismatch“, „ice-ufrag“, „ice-pwd“ und „ice-options“.
15.1. "candidate" Attribute ("candidate"-Attribut)
Das candidate-Attribut ist nur ein Attribut auf Medienebene. Es enthält eine Transportadresse für einen Kandidaten, der für Konnektivitätsprüfungen verwendet werden kann.
Die Syntax dieses Attributs wird unter Verwendung von Augmented BNF definiert, wie in RFC 5234 [RFC5234] definiert:
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 / "+" / "/"
Diese Grammatik codiert die primären Informationen über einen Kandidaten: seine IP-Adresse, Port und Transportprotokoll sowie seine Eigenschaften: die Foundation, Komponenten-ID, Priorität, Typ und zugehörige Transportadresse:
<connection-address>: wird aus RFC 4566 [RFC4566] entnommen. Es ist die IP-Adresse des Kandidaten, die IPv4-Adressen, IPv6-Adressen und vollqualifizierte Domänennamen (FQDNs) zulässt. Beim Parsen dieses Felds kann ein Agent eine IPv4-Adresse und eine IPv6-Adresse durch das Vorhandensein eines Doppelpunkts in seinem Wert unterscheiden – das Vorhandensein eines Doppelpunkts zeigt IPv6 an. Ein Agent MUST candidate-Zeilen ignorieren, die Kandidaten mit IP-Adressversionen enthalten, die nicht unterstützt oder erkannt werden. Eine IP-Adresse SHOULD verwendet werden, aber ein FQDN MAY anstelle einer IP-Adresse verwendet werden. In diesem Fall wird beim Empfang eines Angebots oder einer Antwort, die einen FQDN in einem a=candidate-Attribut enthält, der FQDN zuerst unter Verwendung eines AAAA-Datensatzes (unter der Annahme, dass der Agent IPv6 unterstützt) im DNS nachgeschlagen, und wenn kein Ergebnis gefunden wird oder der Agent nur IPv4 unterstützt, unter Verwendung eines A. Wenn die DNS-Abfrage mehr als eine IP-Adresse zurückgibt, wird eine ausgewählt und dann für den Rest der ICE-Verarbeitung verwendet.
<port>: wird ebenfalls aus RFC 4566 [RFC4566] entnommen. Es ist der Port des Kandidaten.
<transport>: gibt das Transportprotokoll für den Kandidaten an. Diese Spezifikation definiert nur UDP. Es wird jedoch Erweiterbarkeit bereitgestellt, um die Verwendung zukünftiger Transportprotokolle mit ICE zu ermöglichen, wie z. B. TCP oder das Datagram Congestion Control Protocol (DCCP) [RFC4340].
<foundation>: besteht aus 1 bis 32 <ice-char>s. Es ist ein Bezeichner, der für zwei Kandidaten äquivalent ist, die vom gleichen Typ sind, die gleiche Basis teilen und vom gleichen STUN-Server stammen. Die Foundation wird verwendet, um die ICE-Leistung im Frozen-Algorithmus zu optimieren.
<component-id>: ist eine positive ganze Zahl zwischen 1 und 256, die die spezifische Komponente des Medienstroms identifiziert, für die dies ein Kandidat ist. Sie MUST bei 1 beginnen und MUST für jede Komponente eines bestimmten Kandidaten um 1 erhöht werden. Für auf RTP basierende Medienströme MUST Kandidaten für die eigentlichen RTP-Medien eine Komponenten-ID von 1 haben, und Kandidaten für RTCP MUST eine Komponenten-ID von 2 haben. Andere Arten von Medienströmen, die mehrere Komponenten erfordern, MUST Spezifikationen entwickeln, die die Zuordnung von Komponenten zu Komponenten-IDs definieren. Siehe Abschnitt 14 für weitere Diskussionen zur Erweiterung von ICE auf neue Medienströme.
<priority>: ist eine positive ganze Zahl zwischen 1 und (2**31 - 1).
<cand-type>: codiert den Typ des Kandidaten. Diese Spezifikation definiert die Werte „host“, „srflx“, „prflx“ und „relay“ für Host-, Server-Reflexive-, Peer-Reflexive- bzw. Relayed-Kandidaten. Der Satz von Kandidatentypen ist für die Zukunft erweiterbar.
<rel-addr> und <rel-port>: übermitteln Transportadressen, die sich auf den Kandidaten beziehen, nützlich für Diagnosen und andere Zwecke. <rel-addr> und <rel-port> MUST für Server-Reflexive-, Peer-Reflexive- und Relayed-Kandidaten vorhanden sein. Wenn ein Kandidat Server- oder Peer-Reflexive ist, sind <rel-addr> und <rel-port> gleich der Basis für diesen Server- oder Peer-Reflexive-Kandidaten. Wenn der Kandidat Relayed ist, sind <rel-addr> und <rel-port> gleich der abgebildeten Adresse in der Allocate-Antwort, die dem Client diesen Relayed-Kandidaten bereitgestellt hat (siehe Anhang B.3 für eine Diskussion ihres Zwecks). Wenn der Kandidat ein Host-Kandidat ist, MUST <rel-addr> und <rel-port> weggelassen werden.
Das candidate-Attribut kann selbst erweitert werden. Die Grammatik erlaubt das Hinzufügen neuer Name/Wert-Paare am Ende des Attributs. Eine Implementierung MUST alle Name/Wert-Paare ignorieren, die sie nicht versteht.
15.2. "remote-candidates" Attribute ("remote-candidates"-Attribut)
Die Syntax des „remote-candidates“-Attributs wird unter Verwendung von Augmented BNF definiert, wie in RFC 5234 [RFC5234] definiert. Das remote-candidates-Attribut ist nur ein Attribut auf Medienebene.
remote-candidate-att = "remote-candidates" ":" remote-candidate
0*(SP remote-candidate)
remote-candidate = component-ID SP connection-address SP port
Das Attribut enthält eine connection-address und einen Port für jede Komponente. Die Reihenfolge der Komponenten ist irrelevant. Es MUST jedoch ein Wert für jede Komponente eines Medienstroms vorhanden sein. Dieses Attribut MUST in einem Angebot von einem steuernden Agenten für einen Medienstrom enthalten sein, der abgeschlossen (Completed) ist, und MUST in keinem anderen Fall enthalten sein (MUST NOT).
15.3. "ice-lite" and "ice-mismatch" Attributes ("ice-lite"- und "ice-mismatch"-Attribute)
Die Syntax der Attribute „ice-lite“ und „ice-mismatch“, die beide Flags sind, ist:
ice-lite = "ice-lite"
ice-mismatch = "ice-mismatch"
„ice-lite“ ist nur ein Attribut auf Sitzungsebene und zeigt an, dass ein Agent eine Lite-Implementierung ist. „ice-mismatch“ ist nur ein Attribut auf Medienebene und zeigt, wenn es in einer Antwort vorhanden ist, an, dass das Angebot mit einem Standardziel für eine Medienkomponente angekommen ist, das kein entsprechendes candidate-Attribut hatte.
15.4. "ice-ufrag" and "ice-pwd" Attributes ("ice-ufrag"- und "ice-pwd"-Attribute)
Die Attribute „ice-ufrag“ und „ice-pwd“ übermitteln das Benutzernamenfragment und das Passwort, die von ICE für die Nachrichtenintegrität verwendet werden. Ihre Syntax ist:
ice-pwd-att = "ice-pwd" ":" password
ice-ufrag-att = "ice-ufrag" ":" ufrag
password = 22*256ice-char
ufrag = 4*256ice-char
Die Attribute „ice-pwd“ und „ice-ufrag“ können entweder auf Sitzungsebene oder auf Medienebene erscheinen. Wenn sie in beiden vorhanden sind, hat der Wert auf Medienebene Vorrang. Somit ist der Wert auf Sitzungsebene effektiv ein Standardwert, der für alle Medienströme gilt, sofern er nicht durch einen Wert auf Medienebene überschrieben wird. Unabhängig davon, ob sie auf Sitzungs- oder Medienebene vorhanden sind, MUST es für jeden Medienstrom ein ice-pwd- und ein ice-ufrag-Attribut geben. Wenn zwei Medienströme identische ice-ufrags haben, MUST sie identische ice-pwds haben.
Die Attribute ice-ufrag und ice-pwd MUST zu Beginn einer Sitzung zufällig ausgewählt werden. Das ice-ufrag-Attribut MUST mindestens 24 Bits Zufälligkeit enthalten, und das ice-pwd-Attribut MUST mindestens 128 Bits Zufälligkeit enthalten. Dies bedeutet, dass das ice-ufrag-Attribut mindestens 4 Zeichen lang sein wird und das ice-pwd mindestens 22 Zeichen lang, da die Grammatik für diese Attribute 6 Bits Zufälligkeit pro Zeichen zulässt. Die Attribute MAY natürlich länger als 4 bzw. 22 Zeichen sein, bis zu 256 Zeichen. Die Obergrenze ermöglicht die Pufferdimensionierung in Implementierungen. Ihre große Obergrenze ermöglicht es, im Laufe der Zeit erhöhte Mengen an Zufälligkeit hinzuzufügen.
15.5. "ice-options" Attribute ("ice-options"-Attribut)
Das „ice-options“-Attribut ist ein Attribut auf Sitzungsebene. Es enthält eine Reihe von Token, die die vom Agenten unterstützten Optionen identifizieren. Seine Grammatik ist:
ice-options = "ice-options" ":" ice-option-tag
0*(SP ice-option-tag)
ice-option-tag = 1*ice-char