2014-04-25 17 views
17

Ho problemi con NAT traversal e WebRTC. Videostreaming funziona con alcune persone, ma non con qualcuno che si trova dietro un router dormitorio studentesco.WebRTC - Quanti server STUN/TURN devo specificare?

Penso che questo dovrebbe essere risolto utilizzando un server TURN. L'ho fatto, non funziona ancora, e ora mi chiedo se il server TURN funziona affatto. Di conseguenza mi chiedo se posso o dovrei impostare diversi server TURN, e se sì, come.

Ho trovato this list of STUN/TURN servers in another thread. In questo momento li sto impostando come questo

var STUN = { 
    'url': 'stun:stun.l.google.com:19302', 
}; 

var TURN = { 
    url: 'turn:[email protected]:80', 
    credential: 'homeo' 
}; 

var iceServers = 
{ 
    iceServers: [STUN, TURN] 
}; 

var pc = new RTCPeerConnection(iceServers); 

Quindi la mia domanda è fondamentalmente: E 'possibile impostare diversi server STUN/turno? Dovrei farlo se possibile, e come sarebbe il codice?

+0

Ho aggiornato la tua risposta perché ho pensato che fosse utile poiché mi hai mostrato come costruire l'array per impostare diversi server STUN o TURN. Ma sapevo già che STUN e che cos'è un server TURN. Quello che volevo sapere è se è utile impostare diversi server TURN, o diversi server STUN (per ragioni di prestazioni, forse, il mio programma sceglierà il server con la latenza più bassa, sarà in grado di dire quando un server TURN è offline e selezionare il prossimo, se sì, quanto tempo ci vuole ..). La mancanza di questa informazione era il motivo per cui non ho accettato. Forse la mia domanda era semplicemente troppo aspecifica. – spacecoyote

+0

queste sono le credenziali effettive che hai postato, non sono sicuro di quanto male possa farti, ma dovresti aggiornarlo: P –

risposta

12
A STUN server is used to get an external network address. 
TURN servers are used to relay traffic if direct (peer to peer) connection fails. 

URL per STUN e/o girare server sono (opzionalmente) specificati da un app WebRTC nell'oggetto configurazione iceServers che è il primo argomento del costruttore RTCPeerConnection.

esempio di utilizzo di più server:

var ICE_config= { 
    'iceServers': [ 
    { 
     'url': 'stun:stun.l.google.com:19302' 
    }, 
    { 
     'url': 'turn:192.158.29.39:3478?transport=udp', 
     'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=', 
     'username': '28224511:1379330808' 
    }, 
    { 
     'url': 'turn:192.158.29.39:3478?transport=tcp', 
     'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=', 
     'username': '28224511:1379330808' 
    } 
    ] 
} 
pc = new RTCPeerConnection(ICE_config); 

volta RTCPeerConnection dispone che l'informazione, la magia ICE avviene automaticamente: RTCPeerConnection utilizza il framework ICE di elaborare il percorso migliore tra coetanei, lavorando con STUN e girare i server come necessario.

STUN: server STUN in diretta su Internet pubblico e hanno un compito semplice: controllare l'IP: indirizzo della porta di una richiesta in ingresso (da un'applicazione in esecuzione dietro un NAT) e inviare l'indirizzo di nuovo come una risposta. In altre parole, l'applicazione utilizza un server STUN per scoprire il suo IP: port da una prospettiva pubblica. Questo processo consente a un peer WebRTC di ottenere un indirizzo pubblicamente accessibile per se stesso, e quindi passarlo a un altro peer tramite un meccanismo di segnalazione, al fine di impostare un collegamento diretto. (In pratica, diversi NATs lavorano in modi diversi, e ci possono essere molteplici strati NAT, ma il principio è sempre lo stesso.)

TURNO: TURNO RTCPeerConnection cerca di impostare la comunicazione diretta tra coetanei oltre UDP. Se ciò non riesce, RTCPeerConnection ricorre a TCP. Se ciò non riesce, i server TURN possono essere usati come fallback, inoltrando i dati tra gli endpoint.

Just to reiterate: TURN viene utilizzato per ritrasmettere lo streaming audio/video/dati tra peer, non i dati di segnalazione!

I server TURN hanno indirizzi pubblici, quindi possono essere contattati dai colleghi anche se i peer sono protetti da firewall o proxy. I server TURN hanno un compito concettualmente semplice - per inoltrare un flusso - ma, a differenza dei server STUN, consumano intrinsecamente molta larghezza di banda. In altre parole, i server TURN devono essere più muscolosi.

vedere this

+1

Grazie. Quella costruzione di array con i vari server di turno era esattamente quello che stavo cercando. È utile impostarne diversi? – spacecoyote

+0

@spacecoyote Un server STUN viene utilizzato per ottenere un indirizzo di rete esterno. I server TURN vengono utilizzati per inoltrare il traffico se la connessione diretta (peer-to-peer) non riesce. sì è utile. ognuno utilizzato per uno scopo – Muath

+3

@Muath che non risponde direttamente alla domanda di spacecoyote che ritengo sia valida: quali sono i meriti di specificare più di un server TURN e in che modo l'implementazione WebRTC determinerà quale utilizzare? – Ternary

5

Riguardo STUN, WebRTC invierà le richieste vincolanti per tutti, ed i risultati vengono uniti. (Si noti che nelle versioni precedenti del codice WebRTC sembra essere utilizzato solo il primo server STUN)

Si consiglia di utilizzare più di un server STUN, poiché si riduce in media il tempo di connessione. Il numero esatto dipende dall'affidabilità dei tuoi server STUN.Generalmente 2 sono sufficienti.

Per quanto riguarda TURNO il problema è più complesso, perché questi server smistano il traffico quando le connessioni P2P non sono possibili. Se si hanno molti client, un singolo server TURN raggiungerà probabilmente la sua larghezza di banda massima. In questo caso, l'impostazione di più server TURN aiuterà.

Come? Durante la connettività che controlla la fase, WebRTC sceglierà il relè TURN con il tempo di andata e ritorno più basso. Pertanto, l'impostazione di più server TURN consente all'applicazione di scalare in termini di larghezza di banda e numero di utenti.

Se non si sta sviluppando un'applicazione su larga scala, i server 1 o 2 TURN sono in genere sufficienti.

È possibile sfogliare il codice WebRTC in https://chromium.googlesource.com/external/webrtc/+/master

vi consiglio di guardare dentro: WebRTC/p2p/client/basicportallocator.cc, WebRTC/p2p/base/stunport.cc e WebRTC/p2p/base/turnport.cc

+0

Per controllare Controllo funzionante dei server ICE: https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ – Devaroop

Problemi correlati