J'ai des problèmes avec NAT traversal
et WebRTC
. Le streaming vidéo fonctionne avec certaines personnes, mais pas avec quelqu'un qui se trouve derrière un routeur de dortoir étudiant.
Je pense que cela devrait être résolu en utilisant un serveur TURN. Je l'ai fait, cela ne fonctionne toujours pas, et maintenant je me demande si le serveur TURN fonctionne du tout. En conséquence, je me demande si je peux ou dois configurer plusieurs serveurs TURN, et si oui, comment.
J'ai trouvé cette liste de serveurs STUN/TURN dans un autre thread . En ce moment je les mets comme ça
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);
Ma question est donc essentiellement: est-il possible de configurer plusieurs serveurs STUN/TURN? Dois-je le faire si possible, et à quoi ressemblerait ce code?
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.
Les URL des serveurs STUN et/ou TURN sont (facultativement) spécifiées par une application WebRTC dans l'objet de configuration iceServers qui est le premier argument du constructeur RTCPeerConnection.
exemple d'utilisation de plus de ce serveur:
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);
Une fois que RTCPeerConnection dispose de ces informations, la magie ICE se produit automatiquement: RTCPeerConnection utilise le cadre ICE pour déterminer le meilleur chemin entre les pairs, en travaillant avec les serveurs STUN et TURN si nécessaire.
[~ # ~] stun [~ # ~] : les serveurs STUN vivent sur Internet public et ont une tâche simple: vérifier l'IP: l'adresse du port de une demande entrante (à partir d'une application exécutée derrière un NAT) et renvoyez cette adresse en réponse. En d'autres termes, l'application utilise un serveur STUN pour découvrir son port IP: d'un point de vue public. Ce processus permet à un homologue WebRTC d'obtenir une adresse accessible au public pour lui-même, puis de la transmettre à un autre homologue via un mécanisme de signalisation, afin d'établir une liaison directe. (En pratique, différents NAT fonctionnent de différentes manières, et il peut y avoir plusieurs NAT couches, mais le principe est toujours le même.)
[~ # ~] tournez [~ # ~] : TURN RTCPeerConnection essaie d'établir une communication directe entre pairs via UDP. Si cela échoue, RTCPeerConnection a recours à TCP. En cas d'échec, les serveurs TURN peuvent être utilisés comme solution de rechange, relayant les données entre les points de terminaison.
Juste pour réitérer: TURN est utilisé pour relayer le streaming audio/vidéo/données entre pairs, pas pour signaler des données!
Les serveurs TURN ont des adresses publiques, ils peuvent donc être contactés par des pairs même si les pairs sont derrière des pare-feu ou des proxys. Les serveurs TURN ont une tâche conceptuellement simple - relayer un flux - mais, contrairement aux serveurs STUN, ils consomment intrinsèquement beaucoup de bande passante. En d'autres termes, les serveurs TURN doivent être plus robustes.
voir ceci
Concernant STUN , WebRTC enverra des requêtes de liaison à tous et les résultats seront fusionnés. (Notez que dans les anciennes versions du code WebRTC, seul le premier serveur STUN semble être utilisé)
Je recommanderais d'utiliser plus d'un serveur STUN, car vous réduirez votre temps de connexion, en moyenne. Le nombre exact dépend de la fiabilité de vos serveurs STUN. En général, 2 suffisent.
Concernant TURN , le problème est plus complexe car ces serveurs relaient votre trafic lorsque les connexions P2P ne sont pas possibles. Si vous avez plusieurs clients, un seul serveur TURN atteindra probablement sa bande passante maximale. Dans ce cas, la configuration de plusieurs serveurs TURN sera utile.
Comment? Pendant la phase de vérification de la connectivité , WebRTC choisira le relais TURN avec le temps d'aller-retour le plus bas. Ainsi, la configuration de plusieurs serveurs TURN permet à votre application d'évoluer en termes de bande passante et de nombre d'utilisateurs.
Si vous ne développez pas une application à grande échelle, 1 ou 2 serveurs TURN sont généralement suffisants .
Vous pouvez parcourir le code WebRTC à https://chromium.googlesource.com/external/webrtc/+/master
Je recommande de regarder à l'intérieur: webrtc/p2p/client/basicportallocator.cc, webrtc/p2p/base/stunport.cc et webrtc/p2p/base/turnport.cc
Le problème est probable que le pare-feu des universités bloque le port 19302. Les pare-feu wifi publics autorisent généralement le trafic uniquement sur les ports 80 et 443. En d'autres termes, n'utilisez pas le serveur STUN de Google car il essaie d'utiliser le port 19302 et ce port est bloqué par le pare-feu des écoles.