15. Grammar (Grammatica)
Questa specifica definisce sette nuovi attributi SDP: gli attributi "candidate", "remote-candidates", "ice-lite", "ice-mismatch", "ice-ufrag", "ice-pwd" e "ice-options".
15.1. "candidate" Attribute (Attributo "candidate")
L'attributo candidate è solo un attributo a livello multimediale. Contiene un indirizzo di trasporto per un candidato che può essere utilizzato per i controlli di connettività.
La sintassi di questo attributo è definita utilizzando Augmented BNF come definito in RFC 5234 [RFC5234]:
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 / "+" / "/"
Questa grammatica codifica le informazioni primarie su un candidato: il suo indirizzo IP, porta e protocollo di trasporto e le sue proprietà: foundation, ID componente, priorità, tipo e indirizzo di trasporto correlato:
<connection-address>: è tratto da RFC 4566 [RFC4566]. È l'indirizzo IP del candidato, che consente indirizzi IPv4, indirizzi IPv6 e nomi di dominio completi (FQDN). Quando si analizza questo campo, un agente può differenziare un indirizzo IPv4 e un indirizzo IPv6 dalla presenza di due punti nel suo valore: la presenza di due punti indica IPv6. Un agente MUST ignorare le righe candidate che includono candidati con versioni di indirizzi IP non supportate o riconosciute. Un indirizzo IP SHOULD essere utilizzato, ma un FQDN MAY essere utilizzato al posto di un indirizzo IP. In tal caso, quando si riceve un'offerta o una risposta contenente un FQDN in un attributo a=candidate, l'FQDN viene cercato nel DNS prima utilizzando un record AAAA (assumendo che l'agente supporti IPv6) e, se non viene trovato alcun risultato o l'agente supporta solo IPv4, utilizzando una A. Se la query DNS restituisce più di un indirizzo IP, ne viene scelto uno e quindi utilizzato per il resto dell'elaborazione ICE.
<port>: è anch'esso tratto da RFC 4566 [RFC4566]. È la porta del candidato.
<transport>: indica il protocollo di trasporto per il candidato. Questa specifica definisce solo UDP. Tuttavia, viene fornita l'estensibilità per consentire l'utilizzo di futuri protocolli di trasporto con ICE, come TCP o il Datagram Congestion Control Protocol (DCCP) [RFC4340].
<foundation>: è composto da 1 a 32 <ice-char>. È un identificatore che è equivalente per due candidati dello stesso tipo, che condividono la stessa base e provengono dallo stesso server STUN. La foundation viene utilizzata per ottimizzare le prestazioni ICE nell'algoritmo Frozen.
<component-id>: è un numero intero positivo compreso tra 1 e 256 che identifica il componente specifico del flusso multimediale per il quale questo è un candidato. MUST iniziare da 1 e MUST incrementare di 1 per ogni componente di un particolare candidato. Per i flussi multimediali basati su RTP, i candidati per i media RTP effettivi MUST avere un ID componente di 1 e i candidati per RTCP MUST avere un ID componente di 2. Altri tipi di flussi multimediali che richiedono più componenti MUST sviluppare specifiche che definiscono la mappatura dei componenti agli ID componente. Vedere la Sezione 14 per ulteriori discussioni sull'estensione di ICE a nuovi flussi multimediali.
<priority>: è un numero intero positivo compreso tra 1 e (2**31 - 1).
<cand-type>: codifica il tipo di candidato. Questa specifica definisce i valori "host", "srflx", "prflx" e "relay" rispettivamente per candidati host, server reflexive, peer reflexive e relayed. L'insieme dei tipi di candidati è estendibile per il futuro.
<rel-addr> e <rel-port>: trasmettono indirizzi di trasporto relativi al candidato, utili per la diagnostica e altri scopi. <rel-addr> e <rel-port> MUST essere presenti per candidati server reflexive, peer reflexive e relayed. Se un candidato è server o peer reflexive, <rel-addr> e <rel-port> sono uguali alla base per quel candidato server o peer reflexive. Se il candidato è relayed, <rel-addr> e <rel-port> è uguale all'indirizzo mappato nella risposta Allocate che ha fornito al client quel candidato relayed (vedere l'Appendice B.3 per una discussione sul suo scopo). Se il candidato è un candidato host, <rel-addr> e <rel-port> MUST essere omessi.
L'attributo candidate può essere esteso. La grammatica consente di aggiungere nuove coppie nome/valore alla fine dell'attributo. Un'implementazione MUST ignorare qualsiasi coppia nome/valore che non comprende.
15.2. "remote-candidates" Attribute (Attributo "remote-candidates")
La sintassi dell'attributo "remote-candidates" è definita utilizzando Augmented BNF come definito in RFC 5234 [RFC5234]. L'attributo remote-candidates è solo un attributo a livello multimediale.
remote-candidate-att = "remote-candidates" ":" remote-candidate
0*(SP remote-candidate)
remote-candidate = component-ID SP connection-address SP port
L'attributo contiene un connection-address e una porta per ogni componente. L'ordinamento dei componenti è irrilevante. Tuttavia, un valore MUST essere presente per ogni componente di un flusso multimediale. Questo attributo MUST essere incluso in un'offerta da un agente di controllo per un flusso multimediale che è completato (Completed) e MUST NOT essere incluso in nessun altro caso.
15.3. "ice-lite" and "ice-mismatch" Attributes (Attributi "ice-lite" e "ice-mismatch")
La sintassi degli attributi "ice-lite" e "ice-mismatch", entrambi flag, è:
ice-lite = "ice-lite"
ice-mismatch = "ice-mismatch"
"ice-lite" è solo un attributo a livello di sessione e indica che un agente è un'implementazione lite. "ice-mismatch" è solo un attributo a livello multimediale e, quando presente in una risposta, indica che l'offerta è arrivata con una destinazione predefinita per un componente multimediale che non aveva un attributo candidate corrispondente.
15.4. "ice-ufrag" and "ice-pwd" Attributes (Attributi "ice-ufrag" e "ice-pwd")
Gli attributi "ice-ufrag" e "ice-pwd" trasmettono il frammento del nome utente e la password utilizzati da ICE per l'integrità del messaggio. La loro sintassi è:
ice-pwd-att = "ice-pwd" ":" password
ice-ufrag-att = "ice-ufrag" ":" ufrag
password = 22*256ice-char
ufrag = 4*256ice-char
Gli attributi "ice-pwd" e "ice-ufrag" possono apparire a livello di sessione o a livello multimediale. Quando presenti in entrambi, il valore nel livello multimediale ha la precedenza. Pertanto, il valore a livello di sessione è effettivamente un valore predefinito che si applica a tutti i flussi multimediali, a meno che non venga sovrascritto da un valore a livello multimediale. Indipendentemente dal fatto che sia presente a livello di sessione o multimediale, MUST esserci un attributo ice-pwd e ice-ufrag per ogni flusso multimediale. Se due flussi multimediali hanno ice-ufrag identici, MUST avere ice-pwd identici.
Gli attributi ice-ufrag e ice-pwd MUST essere scelti casualmente all'inizio di una sessione. L'attributo ice-ufrag MUST contenere almeno 24 bit di casualità e l'attributo ice-pwd MUST contenere almeno 128 bit di casualità. Ciò significa che l'attributo ice-ufrag sarà lungo almeno 4 caratteri e l'ice-pwd lungo almeno 22 caratteri, poiché la grammatica per questi attributi consente 6 bit di casualità per carattere. Gli attributi MAY essere più lunghi di 4 e 22 caratteri, rispettivamente, ovviamente, fino a 256 caratteri. Il limite superiore consente il dimensionamento del buffer nelle implementazioni. Il suo ampio limite superiore consente di aggiungere maggiori quantità di casualità nel tempo.
15.5. "ice-options" Attribute (Attributo "ice-options")
L'attributo "ice-options" è un attributo a livello di sessione. Contiene una serie di token che identificano le opzioni supportate dall'agente. La sua grammatica è:
ice-options = "ice-options" ":" ice-option-tag
0*(SP ice-option-tag)
ice-option-tag = 1*ice-char