Passa al contenuto principale

17. Example (Esempio)

L'esempio si basa sulla topologia semplificata della Figura 8.

                          +-----+
| |
|STUN |
| Srvr|
+-----+
|
+---------------------+
| |
| Internet |
| |
| |
+---------------------+
| |
| |
+---------+ |
| NAT | |
+---------+ |
| |
| |
| |
+-----+ +-----+
| | | |
| L | | R |
| | | |
+-----+ +-----+

Figure 8: Example Topology

Due agenti, L e R, stanno utilizzando ICE. Entrambi sono implementazioni ICE full-mode e utilizzano la nomina aggressiva (aggressive nomination) quando stanno controllando. Entrambi gli agenti hanno un singolo indirizzo IPv4. Per l'agente L, è 10.0.1.1 nello spazio degli indirizzi privati [RFC1918] e per l'agente R, 192.0.2.1 su Internet pubblico. Entrambi sono configurati con lo stesso server STUN (mostrato in questo esempio per semplicità, sebbene in pratica gli agenti non abbiano bisogno di utilizzare lo stesso server STUN), che è in ascolto per le richieste STUN Binding a un indirizzo IP di 192.0.2.2 e porta 3478. I server TURN non sono utilizzati in questo esempio. L'agente L è dietro un NAT e l'agente R è su Internet pubblico. Il NAT ha una proprietà di mappatura indipendente dall'endpoint e una proprietà di filtraggio dipendente dall'indirizzo. Il lato pubblico del NAT ha un indirizzo IP di 192.0.2.3.

Per facilitare la comprensione, gli indirizzi di trasporto sono elencati utilizzando variabili che hanno nomi mnemonici. Il formato del nome è entity-type-seqno, dove entity si riferisce all'entità su cui si trova l'indirizzo IP dell'indirizzo di trasporto ed è uno tra "L", "R", "STUN" o "NAT". Il tipo è "PUB" per gli indirizzi di trasporto pubblici e "PRIV" per gli indirizzi di trasporto privati. Infine, seq-no è un numero di sequenza diverso per ogni indirizzo di trasporto dello stesso tipo su una particolare entità. Ogni variabile ha un indirizzo IP e una porta, indicati rispettivamente da varname.IP e varname.PORT, dove varname è il nome della variabile.

Il server STUN ha pubblicizzato l'indirizzo di trasporto STUN-PUB-1 (che è 192.0.2.2:3478).

Nel flusso di chiamata stesso, i messaggi STUN sono annotati con diversi attributi. L'attributo "S=" indica l'indirizzo di trasporto di origine del messaggio. L'attributo "D=" indica l'indirizzo di trasporto di destinazione del messaggio. L'attributo "MA=" viene utilizzato nei messaggi di risposta STUN Binding e si riferisce all'indirizzo mappato. "USE-CAND" implica la presenza dell'attributo USE-CANDIDATE.

Gli esempi di flusso di chiamata omettono le operazioni di autenticazione STUN e RTCP e si concentrano su RTP per un singolo flusso multimediale tra due implementazioni complete.

          L             NAT           STUN             R
|RTP STUN alloc. | |
|(1) STUN Req | | |
|S=$L-PRIV-1 | | |
|D=$STUN-PUB-1 | | |
|------------->| | |
| |(2) STUN Req | |
| |S=$NAT-PUB-1 | |
| |D=$STUN-PUB-1 | |
| |------------->| |
| |(3) STUN Res | |
| |S=$STUN-PUB-1 | |
| |D=$NAT-PUB-1 | |
| |MA=$NAT-PUB-1 | |
| |<-------------| |
|(4) STUN Res | | |
|S=$STUN-PUB-1 | | |
|D=$L-PRIV-1 | | |
|MA=$NAT-PUB-1 | | |
|<-------------| | |
|(5) Offer | | |
|------------------------------------------->|
| | | |RTP STUN
alloc.
| | |(6) STUN Req |
| | |S=$R-PUB-1 |
| | |D=$STUN-PUB-1 |
| | |<-------------|
| | |(7) STUN Res |
| | |S=$STUN-PUB-1 |
| | |D=$R-PUB-1 |
| |MA=$R-PUB-1 | |
| | |------------->|
|(8) answer | | |
|<-------------------------------------------|
| |(9) Bind Req | |Begin
| |S=$R-PUB-1 | |Connectivity
| |D=L-PRIV-1 | |Checks
| |<----------------------------|
| |Dropped | |
|(10) Bind Req | | |
|S=$L-PRIV-1 | | |
|D=$R-PUB-1 | | |
|USE-CAND | | |
|------------->| | |
| |(11) Bind Req | |
| |S=$NAT-PUB-1 | |
| |D=$R-PUB-1 | |
| |USE-CAND | |
| |---------------------------->|
| |(12) Bind Res | |
| |S=$R-PUB-1 | |
| |D=$NAT-PUB-1 | |
| |MA=$NAT-PUB-1 | |
| |<----------------------------|
|(13) Bind Res | | |
|S=$R-PUB-1 | | |
|D=$L-PRIV-1 | | |
|MA=$NAT-PUB-1 | | |
|<-------------| | |
|RTP flows | | |
| |(14) Bind Req | |
| |S=$R-PUB-1 | |
| |D=$NAT-PUB-1 | |
| |<----------------------------|
|(15) Bind Req | | |
|S=$R-PUB-1 | | |
|D=$L-PRIV-1 | | |
|<-------------| | |
|(16) Bind Res | | |
|S=$L-PRIV-1 | | |
|D=$R-PUB-1 | | |
|MA=$R-PUB-1 | | |
|------------->| | |
| |(17) Bind Res | |
| |S=$NAT-PUB-1 | |
| |D=$R-PUB-1 | |
| |MA=$R-PUB-1 | |
| |---------------------------->|
| | | |RTP flows

Figure 9: Example Flow

Innanzitutto, l'agente L ottiene un candidato host dal suo indirizzo IP locale (non mostrato) e, da quello, invia una richiesta STUN Binding al server STUN per ottenere un candidato server reflexive (messaggi 1-4). Ricordiamo che il NAT ha la proprietà di mappatura indipendente dall'indirizzo e dalla porta. Qui, crea un'associazione di NAT-PUB-1 per questa richiesta UDP e questo diventa il candidato server reflexive per RTP.

L'agente L imposta una preferenza di tipo di 126 per il candidato host e 100 per il server reflexive. La preferenza locale è 65535. Sulla base di ciò, la priorità del candidato host è 2130706431 e per il candidato server reflexive è 1694498815. Al candidato host viene assegnata una foundation di 1 e al server reflexive una foundation di 2. Sceglie il suo candidato server reflexive come candidato predefinito e lo codifica nelle righe m e c. L'offerta risultante (messaggio 5) è simile a (righe piegate per chiarezza):

    v=0
o=jdoe 2890844526 2890842807 IN IP4 $L-PRIV-1.IP
s=
c=IN IP4 $NAT-PUB-1.IP
t=0 0
a=ice-pwd:asd88fgpdd777uzjYhagZg
a=ice-ufrag:8hhY
m=audio $NAT-PUB-1.PORT RTP/AVP 0
b=RS:0
b=RR:0
a=rtpmap:0 PCMU/8000
a=candidate:1 1 UDP 2130706431 $L-PRIV-1.IP $L-PRIV-1.PORT typ
host
a=candidate:2 1 UDP 1694498815 $NAT-PUB-1.IP $NAT-PUB-1.PORT typ
srflx raddr $L-PRIV-1.IP rport $L-PRIV-1.PORT

L'offerta, con le variabili sostituite dai loro valori, sarà simile a (righe piegate per chiarezza):

    v=0
o=jdoe 2890844526 2890842807 IN IP4 10.0.1.1
s=
c=IN IP4 192.0.2.3
t=0 0
a=ice-pwd:asd88fgpdd777uzjYhagZg
a=ice-ufrag:8hhY
m=audio 45664 RTP/AVP 0
b=RS:0
b=RR:0
a=rtpmap:0 PCMU/8000
a=candidate:1 1 UDP 2130706431 10.0.1.1 8998 typ host
a=candidate:2 1 UDP 1694498815 192.0.2.3 45664 typ srflx raddr
10.0.1.1 rport 8998

Questa offerta viene ricevuta all'agente R. L'agente R otterrà un candidato host e, da esso, otterrà un candidato server reflexive (messaggi 6-7). Poiché R non è dietro un NAT, questo candidato è identico al suo candidato host e condividono la stessa base. Pertanto scarta questo candidato ridondante e finisce con un singolo candidato host. Con tipo e preferenze locali identici a L, la priorità per questo candidato è 2130706431. Sceglie una foundation di 1 per il suo singolo candidato. La sua risposta risultante è simile a:

    v=0
o=bob 2808844564 2808844564 IN IP4 $R-PUB-1.IP
s=
c=IN IP4 $R-PUB-1.IP
t=0 0
a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh
a=ice-ufrag:9uB6
m=audio $R-PUB-1.PORT RTP/AVP 0
b=RS:0
b=RR:0
a=rtpmap:0 PCMU/8000
a=candidate:1 1 UDP 2130706431 $R-PUB-1.IP $R-PUB-1.PORT typ host

Con le variabili inserite:

    v=0
o=bob 2808844564 2808844564 IN IP4 192.0.2.1
s=
c=IN IP4 192.0.2.1
t=0 0
a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh
a=ice-ufrag:9uB6
m=audio 3478 RTP/AVP 0
b=RS:0
b=RR:0
a=rtpmap:0 PCMU/8000
a=candidate:1 1 UDP 2130706431 192.0.2.1 3478 typ host

Poiché nessuna delle parti ha indicato di essere lite, l'agente che ha inviato l'offerta che ha iniziato l'elaborazione ICE (agente L) diventa l'agente di controllo.

Gli agenti L e R accoppiano entrambi i candidati. Entrambi inizialmente hanno due coppie. Tuttavia, l'agente L eliminerà la coppia contenente il suo candidato server reflexive, risultando in una sola. All'agente L, questa coppia ha un candidato locale di $L_PRIV_1 e un candidato remoto di $R_PUB_1 e ha una priorità della coppia di candidati di 4,57566E+18 (si noti che un'implementazione rappresenterebbe questo come un numero intero a 64 bit in modo da non perdere precisione). All'agente R, ci sono due coppie. La priorità più alta ha un candidato locale di $R_PUB_1 e un candidato remoto di $L_PRIV_1 e ha una priorità di 4,57566E+18, e la seconda ha un candidato locale di $R_PUB_1 e un candidato remoto di $NAT_PUB_1 e una priorità di 3,63891E+18.

L'agente R inizia il suo controllo di connettività (messaggio 9) per la prima coppia (tra i due candidati host). Poiché R è l'agente controllato per questa sessione, il controllo omette l'attributo USE-CANDIDATE. Il candidato host dall'agente L è privato e dietro un NAT, e quindi questo controllo non avrà successo, perché il pacchetto non può essere instradato da R a L.

Quando l'agente L ottiene la risposta, esegue il suo unico controllo di connettività (messaggi 10-13). Implementa l'algoritmo di nomina aggressiva e quindi include un attributo USE-CANDIDATE in questo controllo. Poiché il controllo ha successo, l'agente L crea una nuova coppia, il cui candidato locale proviene dall'indirizzo mappato nella risposta Binding (NAT-PUB-1 dal messaggio 13) e il cui candidato remoto è la destinazione della richiesta (R-PUB-1 dal messaggio 10). Questo viene aggiunto all'elenco valido (Valid list). Inoltre, è contrassegnato come selezionato (selected) poiché la richiesta Binding conteneva l'attributo USE-CANDIDATE. Poiché esiste un candidato selezionato nell'elenco valido per l'unico componente di questo flusso multimediale, l'elaborazione ICE per questo flusso passa allo stato Completato (Completed). L'agente L può ora inviare media se lo desidera.

Poco dopo aver ricevuto la richiesta STUN Binding dall'agente L (messaggio 11), l'agente R genererà il suo controllo attivato. Questo controllo capita di corrispondere a quello successivo nel suo elenco di controllo: dal suo candidato host al candidato server reflexive dell'agente L. Questo controllo (messaggi 14-17) avrà successo. Di conseguenza, l'agente R costruisce una nuova coppia di candidati utilizzando l'indirizzo mappato dalla risposta come candidato locale (R-PUB-1) e la destinazione della richiesta (NAT-PUB-1) come candidato remoto. Questa coppia viene aggiunta all'elenco valido per quel flusso multimediale. Poiché il controllo è stato generato nella direzione inversa di un controllo che conteneva l'attributo USE-CANDIDATE, la coppia di candidati è contrassegnata come selezionata. Di conseguenza, l'elaborazione per questo flusso passa allo stato Completato e anche l'agente R può inviare media.