{"id":11859,"date":"2025-04-12T03:04:24","date_gmt":"2025-04-11T18:04:24","guid":{"rendered":"https:\/\/chat-messenger.com\/?p=11859"},"modified":"2025-04-12T03:23:33","modified_gmt":"2025-04-11T18:23:33","slug":"webrtc-stun-turn-turns-sfu","status":"publish","type":"post","link":"https:\/\/chat-messenger.com\/fr\/blog\/webrtc-stun-turn-tourne-sfu","title":{"rendered":"Une explication et une pratique approfondies de STUN\/TURN\/TURNS\/SFU dans WebRTC"},"content":{"rendered":"<h2>Qu&#039;est-ce que WebRTC ?<\/h2>\n\n\n\n<p>WebRTC (Web Real-Time Communication) est une technologie ouverte qui permet la communication en temps r\u00e9el de la voix, de la vid\u00e9o et des donn\u00e9es entre navigateurs. Elle est en cours de standardisation par diverses entreprises, dont Google, comme m\u00e9canisme permettant la communication P2P via des API JavaScript uniquement, sans n\u00e9cessiter de plug-ins ou de logiciels suppl\u00e9mentaires.<\/p>\n\n\n\n<p>WebRTC se compose de trois composants principaux\u00a0:<\/p>\n\n\n\n<ul><li><strong>obtenirUserMedia<\/strong>:Une API pour acqu\u00e9rir de l&#039;audio et de la vid\u00e9o \u00e0 partir d&#039;appareils tels que des cam\u00e9ras et des microphones.<\/li><li><strong>RTCPeerConnection<\/strong>:Une API principale pour \u00e9tablir une communication entre pairs et \u00e9changer des m\u00e9dias et des donn\u00e9es.<\/li><li><strong>RTCDataChannel<\/strong>:Un canal de donn\u00e9es qui peut \u00eatre utilis\u00e9 pour envoyer des fichiers, discuter, etc.<\/li><\/ul>\n\n\n\n<p>Ces API permettent le d\u00e9veloppement de nombreuses applications en temps r\u00e9el telles que les appels vid\u00e9o, les conf\u00e9rences audio, le partage de fichiers, etc. Cependant, dans les communications r\u00e9elles, il existe des probl\u00e8mes avec la travers\u00e9e NAT et les pare-feu, il est donc essentiel de comprendre et de mettre en \u0153uvre des technologies de travers\u00e9e NAT telles que STUN\/TURN\/TURNS.<\/p>\n\n\n\n<h2>Diff\u00e9rences et r\u00f4les de STUN, TURN et TURNS<\/h2>\n\n\n\n<p>Pour obtenir une connexion pair \u00e0 pair stable avec WebRTC, un m\u00e9canisme de travers\u00e9e NAT est essentiel. Cet article d\u00e9taille les diff\u00e9rences techniques, les sc\u00e9narios d&#039;utilisation, ainsi que les avantages et les inconv\u00e9nients des technologies STUN, TURN et TURNS.<\/p>\n\n\n\n<p>STUN est un protocole utilis\u00e9 principalement pour d\u00e9terminer l&#039;adresse externe d&#039;un utilisateur dans un environnement NAT, tandis que TURN fait office de serveur relais lorsqu&#039;une connexion directe est impossible. TURNS, quant \u00e0 lui, chiffre ses communications avec TLS et utilise le m\u00eame num\u00e9ro de port 443 que HTTPS, ce qui permet de communiquer derri\u00e8re des pare-feu stricts, comme sur les r\u00e9seaux d&#039;entreprise.<\/p>\n\n\n\n<p>En comprenant les caract\u00e9ristiques de chacun et en les utilisant de mani\u00e8re appropri\u00e9e, vous pouvez augmenter le taux de r\u00e9ussite et la qualit\u00e9 des communications WebRTC.<\/p>\n\n\n\n<h3>R\u00f4le et fonctionnalit\u00e9s de STUN (UDP)<\/h3>\n\n\n\n<p>STUN (Session Traversal Utilities for NAT) est un protocole qui permet aux clients de<strong>Adresse IP et port externes<\/strong>Il s&#039;agit d&#039;un protocole simple permettant de conna\u00eetre l&#039;adresse IP d&#039;un PC. Par exemple, si un PC est derri\u00e8re un NAT, il ne conna\u00eet pas sa propre adresse IP globale, mais il peut obtenir \u00ab\u00a0son adresse IP\u00a0: port vu de l&#039;ext\u00e9rieur\u00a0\u00bb en interrogeant le serveur STUN.<\/p>\n\n\n\n<p>Le serveur STUN agit comme un miroir, renvoyant les informations source de la requ\u00eate re\u00e7ue telles quelles. Ainsi, le client peut conna\u00eetre sa propre adresse IP globale et le num\u00e9ro de port attribu\u00e9 par le NAT (Server Reflexive Candidate).<\/p>\n\n\n\n<p>La communication STUN s&#039;effectue g\u00e9n\u00e9ralement via UDP, le port par d\u00e9faut \u00e9tant 3478 (UDP\/3478). Comme elle n\u00e9cessite une communication UDP l\u00e9g\u00e8re et mono-coup, elle pr\u00e9sente une faible surcharge, une faible latence et une charge serveur quasi nulle. Par cons\u00e9quent, dans les environnements o\u00f9 la communication UDP est autoris\u00e9e, la travers\u00e9e NAT via STUN est tent\u00e9e en premier.<\/p>\n\n\n\n<h4><strong>Sc\u00e9narios d&#039;utilisation de STUN<\/strong><\/h4>\n\n\n\n<p>Il est efficace dans les environnements o\u00f9 la travers\u00e9e NAT est n\u00e9cessaire, mais o\u00f9 la communication UDP elle-m\u00eame n&#039;est pas bloqu\u00e9e, comme les r\u00e9seaux domestiques et les lignes mobiles. Si STUN peut obtenir l&#039;adresse IP externe de l&#039;autre appareil, les clients peuvent \u00e9tablir une communication directe (pair \u00e0 pair). Comme le chemin de communication est direct, les d\u00e9lais sont r\u00e9duits et la qualit\u00e9 est maintenue \u00e0 un niveau \u00e9lev\u00e9. De plus, comme le serveur ne participe qu&#039;\u00e0 l&#039;\u00e9change d&#039;informations IP, les co\u00fbts sont tr\u00e8s faibles. Par exemple, pour les jeux en ligne ou les appels vid\u00e9o, si les deux appareils sont dans un NAT relativement ouvert, STUN suffit \u00e0 \u00e9tablir une connexion pair \u00e0 pair.<\/p>\n\n\n\n<h4>Limites et inconv\u00e9nients du STUN<\/h4>\n\n\n\n<p>STUN est simplement un moyen de \u00ab\u00a0trouver sa propre adresse externe\u00a0\u00bb et, selon le type de NAT et les restrictions du pare-feu, il peut \u00eatre impossible de se connecter en utilisant uniquement ce moyen. En particulier, dans les environnements NAT sym\u00e9triques ou avec pare-feu strict, les paquets provenant de l&#039;autre partie peuvent ne pas atteindre l&#039;adresse obtenue par STUN, rendant la communication impossible.<\/p>\n\n\n\n<p>De plus, la communication UDP elle-m\u00eame peut \u00eatre bloqu\u00e9e sur les r\u00e9seaux d&#039;entreprise, auquel cas les requ\u00eates STUN n&#039;atteignent pas l&#039;appareil. En r\u00e9sum\u00e9, STUN est un m\u00e9canisme permettant de d\u00e9terminer si une communication directe est possible et ne fonctionne pas dans les environnements o\u00f9 elle est physiquement impossible. C&#039;est pourquoi STUN est utilis\u00e9 dans ICE (d\u00e9crit ci-dessous) pour identifier les candidats \u00e0 la premi\u00e8re \u00e9tape, et est con\u00e7u pour revenir \u00e0 TURN (d\u00e9crit ci-dessous) si STUN est insuffisant.<\/p>\n\n\n\n<h3>R\u00f4le et fonctionnalit\u00e9s de TURN (UDP)<\/h3>\n\n\n\n<p>TURN (Traversal Using Relays around NAT) est un protocole qui agit comme un relais lorsque la communication directe est impossible avec STUN. Le serveur TURN agit comme un point de relais accessible \u00e0 tous entre le partenaire de communication et l&#039;autre partie, transf\u00e9rant les paquets. Le client se connecte au serveur TURN et obtient une adresse IP et un port de relais, appel\u00e9s \u00ab\u00a0candidat relais\u00a0\u00bb. L&#039;\u00e9change de m\u00e9dias et de donn\u00e9es avec l&#039;autre partie s&#039;effectue ensuite via ce serveur TURN.<\/p>\n\n\n\n<p>TURN communique \u00e9galement normalement via UDP. Ainsi, tant que ce protocole est utilis\u00e9, il peut relayer les paquets multim\u00e9dias de mani\u00e8re similaire \u00e0 une communication directe. Par d\u00e9faut, le protocole TURN est accept\u00e9 sur le port 3478 (UDP), comme STUN. M\u00eame si le num\u00e9ro de port UDP est restreint par la politique de pare-feu, TURN peut \u00e9galement \u00eatre ex\u00e9cut\u00e9 sur un port autoris\u00e9 tel que UDP\/443. Tant que le protocole UDP est utilis\u00e9, le relais offre des performances temps r\u00e9el sup\u00e9rieures \u00e0 celles du protocole TCP.<\/p>\n\n\n\n<h4>Sc\u00e9narios d&#039;utilisation de TURN<\/h4>\n\n\n\n<p>TURN est essentiel lorsqu&#039;une connexion directe ne peut \u00eatre \u00e9tablie. Par exemple,<span class=\"swl-marker mark_blue\">C&#039;est le cas lorsque l&#039;une ou les deux parties se trouvent derri\u00e8re un pare-feu d&#039;entreprise strict, ou lorsque les deux parties ont des NAT sym\u00e9triques et que le perforation UDP \u00e9choue.<\/span>Dans un tel environnement, la communication n&#039;est pas possible sans relais via un serveur TURN, donc TURN fonctionne comme une sorte de dernier recours.<\/p>\n\n\n\n<p>WebRTC vise \u00e0 permettre \u00e0 tous les pairs de communiquer directement. M\u00eame si cela n&#039;est pas possible, la communication peut se poursuivre en utilisant TURN. En pratique, la strat\u00e9gie g\u00e9n\u00e9rale consiste \u00e0 essayer d&#039;abord de se connecter directement \u00e0 STUN, puis \u00e0 ne basculer sur le relais TURN qu&#039;en cas d&#039;\u00e9chec. Par exemple, lors d&#039;une visioconf\u00e9rence sur un r\u00e9seau interne, si les deux parties ne peuvent pas communiquer directement, la communication bascule automatiquement vers le serveur TURN, permettant \u00e0 l&#039;utilisateur de poursuivre la conversation sans m\u00eame s&#039;en rendre compte.<\/p>\n\n\n\n<h4><strong>Avantages de TURN<\/strong><\/h4>\n\n\n\n<p>Le principal avantage r\u00e9side dans la fiabilit\u00e9. Quel que soit l&#039;environnement NAT ou pare-feu utilis\u00e9, tant que la communication entre le client et le serveur TURN est \u00e9tablie, une communication pair \u00e0 pair est possible. De plus, TURN \u00e9tant une extension de STUN en termes de protocole, une impl\u00e9mentation serveur unique (comme coturn, d\u00e9crite ci-dessous) peut traiter les requ\u00eates STUN et TURN. Une fois la connexion \u00e9tablie, les m\u00e9dias suivants sont relay\u00e9s sous forme de flux, ce qui, du point de vue de l&#039;utilisateur, garantit une communication fluide, \u00e0 l&#039;exception de quelques retards.<\/p>\n\n\n\n<h4><strong>Inconv\u00e9nients de TURN<\/strong><\/h4>\n\n\n\n<p> Ses principaux inconv\u00e9nients sont la consommation de ressources et la latence. Avec TURN, toutes les donn\u00e9es audio et vid\u00e9o doivent transiter par le serveur, ce qui requiert une bande passante et une puissance de traitement consid\u00e9rables c\u00f4t\u00e9 serveur. Par exemple, si l&#039;on suppose qu&#039;un appel vid\u00e9o individuel consomme une bande passante unidirectionnelle de 1 Mbit\/s, un simple calcul permet de supposer que 1\u00a0000 utilisateurs l&#039;utilisent simultan\u00e9ment, une bande passante relais de 1 Gbit\/s est n\u00e9cessaire. Cela engendre des co\u00fbts d&#039;exploitation \u00e9lev\u00e9s pour un serveur TURN, et les services \u00e0 grande \u00e9chelle n\u00e9cessitent la pr\u00e9paration et la mise \u00e0 l&#039;\u00e9chelle de plusieurs serveurs relais TURN.<\/p>\n\n\n\n<p>De plus, plus le chemin de communication est long, plus le d\u00e9lai est important, ce qui entra\u00eene un d\u00e9calage temporel et une baisse de la qualit\u00e9 vid\u00e9o et audio. De plus, compar\u00e9e \u00e0 la communication pair-\u00e0-pair utilisant STUN, la communication via TURN n&#039;est pas strictement pair-\u00e0-pair\u00a0; elle est donc l\u00e9g\u00e8rement inf\u00e9rieure en termes de confidentialit\u00e9 (bien que les serveurs TURN ne relaient g\u00e9n\u00e9ralement que des RTP\/datagrammes non chiffr\u00e9s et n&#039;en interpr\u00e8tent pas le contenu).<\/p>\n\n\n\n<p>En g\u00e9n\u00e9ral, TURN ne doit \u00eatre utilis\u00e9 qu&#039;en cas de n\u00e9cessit\u00e9. En effet, la plupart des communications WebRTC peuvent \u00eatre connect\u00e9es directement via STUN, et les statistiques de Google montrent qu&#039;environ 861 appels TP3T au total sont \u00e9tablis sans relais (peer-to-peer). Seuls les 141 TP3T restants n\u00e9cessitent TURN, mais il est important de disposer d&#039;une infrastructure TURN pour ces 141 TP3T.<\/p>\n\n\n\n<h3>R\u00f4le et fonctionnalit\u00e9s de TURNS (TLS sur TCP\/443)<\/h3>\n\n\n\n<p>TURNS est l&#039;abr\u00e9viation de \u00ab TURN over TLS \u00bb et est un protocole qui crypte la communication relais \u00e0 l&#039;aide du protocole TURN avec TLS (Transport Layer Security).<span class=\"swl-marker mark_blue\">Communication TURN s\u00e9curis\u00e9e par TLS (HTTPS)<\/span>et sert souvent sur le port TCP 443.<span class=\"swl-marker mark_blue\">Le port 443 est le m\u00eame num\u00e9ro de port que HTTPS, il peut donc facilement traverser les pare-feu d&#039;entreprise et permet de contourner facilement les proxys et la censure.<\/span>.<\/p>\n\n\n\n<p>Par exemple, un r\u00e9seau d&#039;entreprise interne peut autoriser uniquement les communications externes sur les ports 80 et 443, mais m\u00eame dans ce cas, il existe de fortes chances que les communications puissent passer si le serveur TURN utilise les communications TLS sur le port 443. De plus, comme les communications sont crypt\u00e9es \u00e0 l&#039;aide de TLS, elles sont s\u00e9curis\u00e9es et difficiles \u00e0 intercepter pour des tiers.<\/p>\n\n\n\n<p>Dans WebRTC, les param\u00e8tres<code>&quot;urls&quot;: &quot;tours:toursserveur:443&quot;<\/code>Dans le sch\u00e9ma URI\u00a0:<code>tours:<\/code>Vous pouvez utiliser ce serveur TURN chiffr\u00e9 TLS en sp\u00e9cifiant<\/p>\n\n\n\n<h4>Sc\u00e8nes o\u00f9 TURNS est utilis\u00e9<\/h4>\n\n\n\n<p>TURNS est utile pour la communication WebRTC dans des environnements tr\u00e8s restreints, comme les r\u00e9seaux d&#039;entreprise, o\u00f9 tous les autres moyens sont bloqu\u00e9s. M\u00eame dans les environnements o\u00f9 tous les ports UDP et TCP g\u00e9n\u00e9raux sont bloqu\u00e9s, de nombreuses politiques autorisent la communication de la m\u00eame mani\u00e8re que la communication HTTPS. TURN sur le port TLS 443 constitue donc un dernier recours.<\/p>\n\n\n\n<p>Il est \u00e9galement utilis\u00e9 dans les situations o\u00f9 certains ports sont ferm\u00e9s sur les r\u00e9seaux locaux sans fil publics, ou lorsque seule la communication TLS est possible c\u00f4t\u00e9 client.<span class=\"swl-marker mark_blue\">D&#039;abord UDP, si cela ne fonctionne pas alors TCP, si cela ne fonctionne pas alors TLS vers 443<\/span>\u00ab Elle se positionne comme l\u2019\u00e9tape finale d\u2019un repli progressif.<\/p>\n\n\n\n<h4>Avantages de TURNS<\/h4>\n\n\n\n<p>Son principal avantage r\u00e9side dans sa haute r\u00e9sistance aux pare-feu. Les communications chiffr\u00e9es TLS sont difficiles \u00e0 distinguer du HTTPS standard\u00a0; elles sont donc plus susceptibles de passer \u00e0 travers des filtres stricts. En particulier, lors de l&#039;introduction d&#039;un syst\u00e8me de webconf\u00e9rence dans une entreprise, il est n\u00e9cessaire d&#039;autoriser les connexions externes depuis le r\u00e9seau interne, mais les communications TLS via TCP\/443 sont plus susceptibles d&#039;\u00eatre accept\u00e9es dans le cadre des politiques de s\u00e9curit\u00e9. De plus, gr\u00e2ce au chiffrement, la confidentialit\u00e9 des communications avec le serveur relais est assur\u00e9e (*Cependant, le contenu lui-m\u00eame, comme la vid\u00e9o, est souvent d\u00e9j\u00e0 chiffr\u00e9 au niveau de la couche WebRTC).<\/p>\n\n\n\n<h4>Inconv\u00e9nients de TURNS<\/h4>\n\n\n\n<p>Le principal inconv\u00e9nient r\u00e9side dans la baisse des performances. Outre le d\u00e9lai et la charge de TURN, il faut tenir compte de la surcharge de TLS et TCP. TCP est un transport fiable et dispose d&#039;un m\u00e9canisme de retransmission en cas de perte de paquets, mais il n&#039;est pas adapt\u00e9 aux m\u00e9dias en temps r\u00e9el. En cas de perte, la lecture vid\u00e9o et audio peut \u00eatre perturb\u00e9e.<\/p>\n\n\n\n<p>De plus, TCP est sujet au blocage en t\u00eate de ligne en raison de l&#039;ordre des paquets,<span class=\"swl-marker mark_blue\">La gigue (fluctuation) augmente \u00e9galement par rapport \u00e0 l&#039;UDP.<\/span>De plus, le traitement du chiffrement et du d\u00e9chiffrement TLS sollicite davantage le processeur. Par cons\u00e9quent, un d\u00e9lai suppl\u00e9mentaire de 50 ms ou plus a \u00e9t\u00e9 signal\u00e9, provoquant un d\u00e9calage perceptible par les utilisateurs. En particulier, lors des visioconf\u00e9rences, ce d\u00e9lai accru peut ralentir le rythme des conversations et entra\u00eener des d\u00e9calages temporels notables.<\/p>\n\n\n\n<p>De cette fa\u00e7on, TURNS peut \u00eatre consid\u00e9r\u00e9 comme une m\u00e9thode de \u00ab dernier recours \u00bb en termes de qualit\u00e9, mais c&#039;est aussi une bou\u00e9e de sauvetage fiable dans les situations o\u00f9 il n&#039;y a pas d&#039;autre option que d&#039;\u00e9tablir une communication.<\/p>\n\n\n\n<p>Ces derni\u00e8res ann\u00e9es, une nouvelle approche (TURN over QUIC) qui fonctionne sur le port UDP 443 et utilise DTLS\/QUIC au lieu de TLS a \u00e9t\u00e9 envisag\u00e9e, mais elle est toujours en cours de normalisation et n&#039;est pas couramment utilis\u00e9e.<\/p>\n\n\n\n<h2>Flux de communication lorsque UDP STUN n&#039;est pas disponible<\/h2>\n\n\n\n<p>Nous allons expliquer \u00e9tape par \u00e9tape le d\u00e9roulement du traitement ICE WebRTC lorsque STUN sur UDP n&#039;est pas disponible. Prenons l&#039;exemple d&#039;un blocage total d&#039;UDP, par exemple sur un r\u00e9seau d&#039;entreprise, et voyons comment la n\u00e9gociation ICE se r\u00e9sorbe.<\/p>\n\n\n\n<ol><li><strong>Le client envoie une requ\u00eate IP externe (UDP\/3478) au serveur STUN\u00a0:<\/strong><br>Client WebRTC (navigateur)<code>serveurs de glace<\/code>Une demande de liaison (demande de v\u00e9rification de l&#039;adresse externe) est envoy\u00e9e au serveur STUN sp\u00e9cifi\u00e9 via le port UDP 3478. Il s&#039;agit de la premi\u00e8re \u00e9tape de la collecte des candidats ICE et, en cas de succ\u00e8s, le serveur renvoie sa propre adresse IP globale et son num\u00e9ro de port, et est ajout\u00e9 \u00e0 la liste des candidats en tant que candidat r\u00e9flexif du serveur (candidat srflx).<\/li><li><strong>Les paquets UDP sont bloqu\u00e9s par le pare-feu et aucune r\u00e9ponse n&#039;est re\u00e7ue\u00a0:<\/strong><br>Dans ce cas, les param\u00e8tres du pare-feu r\u00e9seau emp\u00eachent les communications UDP d&#039;atteindre l&#039;ext\u00e9rieur. Par cons\u00e9quent, les requ\u00eates adress\u00e9es au serveur STUN n&#039;atteignent pas ce dernier, ou la r\u00e9ponse n&#039;atteint pas le client. Par cons\u00e9quent, le client<strong>R\u00e9ponse STUN non re\u00e7ue<\/strong>L&#039;adresse IP externe est inconnue. L&#039;agent ICE attend une r\u00e9ponse pendant un certain temps, puis expire. Du point de vue de l&#039;utilisateur, la connexion est toujours en cours de traitement et aucun message d&#039;erreur ne s&#039;affiche, mais en r\u00e9alit\u00e9,<strong>Impossible de rassembler les candidats<\/strong>Cela se produit actuellement.<\/li><li><strong>La v\u00e9rification de la connexion directe ICE \u00e9choue car aucun candidat Server Reflexive n&#039;est disponible\u00a0:<\/strong><br>Normalement, si STUN r\u00e9ussit, le client dispose d&#039;un serveur r\u00e9flexif (votre adresse IP globale) en plus de l&#039;h\u00f4te (votre adresse IP locale) et v\u00e9rifie la connexion en la combinant avec celle du pair distant. Cependant, en l&#039;absence d&#039;adresse IP globale candidate suite \u00e0 un \u00e9chec STUN,<strong>Les candidats aux connexions directes entre pairs sont extr\u00eamement limit\u00e9s<\/strong>Par exemple, si les deux parties ne disposent que d&#039;adresses IP priv\u00e9es, elles ne pourront pas se joindre, m\u00eame en essayant de se connecter. ICE d\u00e9terminera alors que la communication directe est impossible. Si le serveur ICE (TURN) n&#039;est pas configur\u00e9, l&#039;ensemble du syst\u00e8me ICE sera consid\u00e9r\u00e9 comme un \u00e9chec \u00e0 ce stade et la connexion WebRTC ne sera pas \u00e9tablie (la console d\u00e9veloppeur affichera<code>L&#039;ICE a \u00e9chou\u00e9<\/code>et ... et<code>\u00c9tat de la connexion ICE\u00a0: \u00e9chec<\/code>etc. seront affich\u00e9s).<\/li><li><strong>Tenter d&#039;obtenir des candidats au relais TURN (via TCP\/TLS\/443)\u00a0:<\/strong><br>M\u00eame si l\u2019acquisition directe de candidats par STUN \u00e9choue,<code>serveurs de glace<\/code>Si un serveur TURN est sp\u00e9cifi\u00e9 dans<strong>Prochaines \u00e9tapes<\/strong>Dans cet exemple, comme UDP n&#039;est pas disponible, le client essaiera de se connecter au serveur TURN en utilisant TCP ou TLS (par exemple,<code>tours:turn.example.com:443<\/code>(Si configur\u00e9, le protocole TLS d\u00e9marrera.) Heureusement, le pare-feu autorise la communication HTTPS sur TCP 443, la connexion TURN via TLS est donc r\u00e9ussie. Le client s\u00e9curise une adresse relais sur le serveur TURN.<strong>Candidat au relais<\/strong>L&#039;autre c\u00f4t\u00e9 obtiendra des candidats relais, qui sont des \u00ab\u00a0candidats virtuels pour la communication via le serveur TURN\u00a0\u00bb. Parall\u00e8lement, l&#039;autre c\u00f4t\u00e9 (le c\u00f4t\u00e9 distant) obtiendra \u00e9galement des candidats relais, ou, si le r\u00e9seau est sans probl\u00e8me, des candidats directs ou STUN. Dans tous les cas, si au moins un c\u00f4t\u00e9 poss\u00e8de des candidats relais, l&#039;autre c\u00f4t\u00e9 peut tenter de se connecter \u00e0 ce serveur TURN.<\/li><li><strong>\u00c9tablissement de la connexion ICE (ou \u00e9chec \u00e9ventuel) via relais :<\/strong><br>Une fois que les deux homologues ont des candidats disponibles (un ou les deux candidats relais dans cet exemple), ICE les utilise pour v\u00e9rifier la connexion. Une fois la communication \u00e9tablie via le serveur TURN avec le serveur, elle peut \u00eatre relay\u00e9e, de sorte que le canal multim\u00e9dia est ouvert m\u00eame si le protocole UDP ne passe pas directement entre les homologues. Cela permet aux communications vid\u00e9o et audio entre les utilisateurs de commencer. Une fois la connexion \u00e9tablie, une surcharge est g\u00e9n\u00e9r\u00e9e par TCP sur TLS, mais la conversation elle-m\u00eame est possible. \u00c0 l&#039;inverse, en cas de d\u00e9faillance (par exemple, si un proxy d&#039;entreprise d\u00e9tecte et bloque une communication TLS non HTTP, ou si l&#039;authentification du serveur TURN \u00e9choue), ICE \u00e9chouera et la connexion sera abandonn\u00e9e. L&#039;application doit d\u00e9tecter cette situation et signaler \u00e0 l&#039;utilisateur que la connexion n&#039;\u00e9tait pas possible, etc.<\/li><\/ol>\n\n\n\n<p>Voici le d\u00e9roulement de la n\u00e9gociation ICE dans les environnements difficiles o\u00f9 UDP est inutilisable. En r\u00e9sum\u00e9, les candidats sont test\u00e9s dans l&#039;ordre \u00ab\u00a0H\u00f4te \u2192 STUN \u2192 TURN\u00a0\u00bb, et en cas d&#039;\u00e9chec, la connexion \u00e9choue. Il est important que les d\u00e9veloppeurs comprennent ce comportement et incluent au minimum un serveur TURN\/TURNS dans la liste des serveurs ICE, afin que, m\u00eame dans le pire des cas, la communication puisse \u00eatre \u00e9tablie. De plus, lors des requ\u00eates des utilisateurs, un d\u00e9pannage est n\u00e9cessaire, par exemple en d\u00e9duisant un probl\u00e8me li\u00e9 \u00e0 l&#039;environnement r\u00e9seau (blocage UDP, par exemple) \u00e0 partir d&#039;informations telles que \u00ab\u00a0\u00c9chec ICE\u00a0\u00bb et en v\u00e9rifiant les param\u00e8tres de serveur TURN manquants.<\/p>\n\n\n\n<h2>Cr\u00e9ation et configuration d&#039;un serveur STUN\/TURN\/TURNS \u00e0 l&#039;aide de coturn<\/h2>\n\n\n\n<p>Si vous souhaitez configurer votre propre serveur STUN\/TURN, utilisez l&#039;impl\u00e9mentation open source. <strong><a href=\"https:\/\/github.com\/coturn\/coturn\" data-type=\"URL\" data-id=\"https:\/\/github.com\/coturn\/coturn\">tourner<\/a><\/strong>L&#039;utilisation de coturn est courante. coturn est une impl\u00e9mentation serveur prenant en charge STUN et TURN, et peut \u00e9galement prendre en charge TURNS (TLS) selon les param\u00e8tres. Cet article explique comment installer coturn sur un serveur Linux et cr\u00e9er un serveur prenant en charge STUN\/TURN\/TURNS, ainsi que les points de configuration. Il d\u00e9crit \u00e9galement le fichier de configuration standard (<code>turnserver.conf<\/code>) est \u00e9galement affich\u00e9.<\/p>\n\n\n\n<h3>Installation et configuration de base<\/h3>\n\n\n\n<h4><strong>installer<\/strong><\/h4>\n\n\n\n<p>Pour Ubuntu et Debian,<code>apte<\/code>Vous pouvez installer le paquet coturn depuis. Par exemple, utilisez la commande suivante pour l&#039;installer et le configurer pour un d\u00e9marrage automatique.<\/p>\n\n\n\n<div class=\"hcb_wrap\" data-no-translation=\"\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code># Ubuntu\/Debian\u306e\u5834\u5408\nsudo apt-get install coturn\nsudo sed -i &#39;s\/#TURNSERVER_ENABLED=1\/TURNSERVER_ENABLED=1\/&#39; \/etc\/default\/coturn\nsudo systemctl enable --now coturn<\/code><\/pre><\/div>\n\n\n\n<p>Cela d\u00e9marrera le serveur coturn en tant que d\u00e9mon. Par d\u00e9faut, le fichier de configuration sera ex\u00e9cut\u00e9. <code>\/etc\/turnserver.conf<\/code> Cela chargera le fichier, et vous pourrez ensuite le modifier (faites une sauvegarde avant de le modifier, juste pour plus de s\u00e9curit\u00e9).<\/p>\n\n\n\n<h4><strong>Param\u00e8tres de base<\/strong><\/h4>\n\n\n\n<p> <code>turnserver.conf<\/code>Maintenant, d\u00e9finissez les \u00e9l\u00e9ments suivants\u00a0:<\/p>\n\n\n\n<ul><li class=\"\"><strong>royaume et nom du serveur\u00a0:<\/strong> Il s&#039;agit du nom de domaine ou d&#039;identification du serveur TURN. Il peut \u00eatre utilis\u00e9 pour l&#039;authentification d&#039;un client WebRTC, mais il peut s&#039;agir de n&#039;importe quelle cha\u00eene. Exemple\u00a0: <code>royaume=exemple.com<\/code>,<code>nom-du-serveur=exemple.com<\/code>.<\/li><li class=\"\"><strong>port d&#039;\u00e9coute\u00a0:<\/strong> Num\u00e9ro de port UDP \u00e0 utiliser pour \u00e9couter TURN et STUN. La valeur par d\u00e9faut est 3478.<code>\u00e9coute-ip<\/code>Vous pouvez \u00e9galement vous lier \u00e0 une carte r\u00e9seau sp\u00e9cifique avec<code>0.0.0.0<\/code>Nous acceptons tout.<\/li><li class=\"\"><strong>port d&#039;\u00e9coute tls\u00a0:<\/strong> Il s&#039;agit du num\u00e9ro de port TCP \u00e0 utiliser pour l&#039;\u00e9coute TLS (TURNS). G\u00e9n\u00e9ralement, 443 ou 5349 est sp\u00e9cifi\u00e9. Exemple\u00a0: <code>tls-listening-port=443<\/code>.<\/li><li class=\"\"><strong>IP externe :<\/strong> Si le serveur lui-m\u00eame est derri\u00e8re un NAT, sp\u00e9cifiez sa propre adresse IP globale (cela permet au serveur de reconna\u00eetre le mappage entre l&#039;adresse IP interne et l&#039;adresse IP externe). Cela n&#039;est pas n\u00e9cessaire si le serveur poss\u00e8de une adresse IP globale directe.<\/li><li class=\"\"><strong>M\u00e9thode d&#039;authentification :<\/strong> WebRTC utilise des informations d&#039;identification \u00e0 long terme pour TURN, donc<code>lt-cred-mech<\/code>(M\u00e9canisme d&#039;accr\u00e9ditation \u00e0 long terme) est activ\u00e9.<code>utilisateur=nom d&#039;utilisateur:mot de passe<\/code>ou d\u00e9finissez le nom d&#039;utilisateur et le mot de passe au format<code>utiliser-auth-secret<\/code>(Cette derni\u00e8re est une authentification bas\u00e9e sur des jetons, qui est efficace pour am\u00e9liorer la s\u00e9curit\u00e9, mais nous allons ici montrer une authentification utilisateur statique simple \u00e0 titre d&#039;exemple.)<\/li><li class=\"\"><strong>Param\u00e8tres du journal\u00a0:<\/strong> Pour le d\u00e9pannage<code>fichier journal<\/code>Sp\u00e9cifiez le chemin du fichier journal dans<code>verbeux<\/code>Vous souhaiterez peut-\u00eatre activer la journalisation d\u00e9taill\u00e9e.<\/li><\/ul>\n\n\n\n<h4><strong>Param\u00e8tres du pare-feu<\/strong><\/h4>\n\n\n\n<p>C\u00f4t\u00e9 serveur, pour STUN\/TURN<strong>Port UDP 3478<\/strong>, et pour TURN\/TLS<strong>Port TCP 443<\/strong>(ou 5349) doit \u00eatre ouvert. De plus, le relais TURN utilise par d\u00e9faut la plage de ports UDP 10\u00a0000-20\u00a0000\u00a0; ouvrez donc \u00e9galement cette plage de ports sur le serveur (si n\u00e9cessaire).<code>port minimal<\/code>et<code>max-port<\/code>(La port\u00e9e peut \u00eatre modifi\u00e9e avec<\/p>\n\n\n\n<p>Vous trouverez ci-dessous un exemple qui refl\u00e8te les param\u00e8tres de base ci-dessus.<code>\/etc\/turnserver.conf<\/code>Voici un exemple :<\/p>\n\n\n\n<div class=\"hcb_wrap\" data-no-translation=\"\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code># TURN\u30b5\u30fc\u30d0\u306e\u540d\u79f0\u3068\u30ec\u30eb\u30e0\uff08\u30c9\u30e1\u30a4\u30f3\uff09\nrealm=example.com\nserver-name=example.com\n\n# \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a\nlistening-ip=0.0.0.0           # \u3059\u3079\u3066\u306eIP\u30a2\u30c9\u30ec\u30b9\u3067\u5f85\u53d7\nexternal-ip=203.0.113.10       # \u30b5\u30fc\u30d0\u306e\u30b0\u30ed\u30fc\u30d0\u30ebIP\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09\n\n# \u30dd\u30fc\u30c8\u8a2d\u5b9a\nlistening-port=3478            # STUN\/TURN\u7528 UDP\u30dd\u30fc\u30c8\ntls-listening-port=443         # TLS\u7528 TCP\u30dd\u30fc\u30c8 (443\u756a)\nmin-port=10000                 # \u4e2d\u7d99\u306b\u4f7f\u7528\u3059\u308b\u30dd\u30fc\u30c8\u7bc4\u56f2\uff08\u4e0b\u9650\uff09\nmax-port=20000                 # \u4e2d\u7d99\u306b\u4f7f\u7528\u3059\u308b\u30dd\u30fc\u30c8\u7bc4\u56f2\uff08\u4e0a\u9650\uff09\n\n# \u30ed\u30b0\u8a2d\u5b9a\nlog-file=\/var\/log\/turnserver.log\nverbose                        # \u8a73\u7d30\u30ed\u30b0\u3092\u6709\u52b9\u5316\nfingerprint                    # \u30d1\u30b1\u30c3\u30c8\u306bfingerprint\u5c5e\u6027\u3092\u4ed8\u4e0e\n\n# \u8a8d\u8a3c\u8a2d\u5b9a\uff08\u9577\u671f\u8a8d\u8a3c\u65b9\u5f0f\uff09\nlt-cred-mech                   # \u9577\u671f\u8a8d\u8a3c\u3092\u6709\u52b9\u5316\nuser=webrtcuser:secretpass123  # \u30e6\u30fc\u30b6\u540d:\u30d1\u30b9\u30ef\u30fc\u30c9 \u3092\u8a2d\u5b9a\n\n# TLS\/SSL\u8a3c\u660e\u66f8\u306e\u6307\u5b9a\ncert=\/etc\/letsencrypt\/live\/example.com\/fullchain.pem   # \u30b5\u30fc\u30d0\u8a3c\u660e\u66f8\npkey=\/etc\/letsencrypt\/live\/example.com\/privkey.pem     # \u79d8\u5bc6\u9375<\/code><\/pre><\/div>\n\n\n\n<p>Dans ce qui pr\u00e9c\u00e8de, le domaine<code>exemple.com<\/code>Nous obtenons un certificat Let&#039;s Encrypt et l&#039;utilisons pour les param\u00e8tres TLS.<code>lt-cred-mech<\/code>Activer l&#039;authentification \u00e0 long terme avec<code>utilisateur<\/code>Cela configure une authentification simple par nom d&#039;utilisateur\/mot de passe.<code>utiliser-auth-secret<\/code>et<code>secret d&#039;authentification statique<\/code>La m\u00e9thode recommand\u00e9e consiste \u00e0 utiliser une m\u00e9thode bas\u00e9e sur des jetons pour \u00e9mettre des informations d\u2019identification temporaires, mais nous n\u2019aborderons pas ce sujet ici.<\/p>\n\n\n\n<h4><strong>Pr\u00e9cautions lors de l&#039;utilisation de TLS<\/strong><\/h4>\n\n\n\n<p>Lors de l&#039;ex\u00e9cution de coturn sur le port 443, soyez vigilant quant aux permissions de port dans un environnement Linux. Les ports inf\u00e9rieurs \u00e0 1024 sont dits privil\u00e9gi\u00e9s et ne peuvent g\u00e9n\u00e9ralement pas \u00eatre ouverts sans les privil\u00e8ges root. Le paquet Ubuntu coturn utilise par d\u00e9faut<code>serveur tournant<\/code>Parce qu&#039;il est ex\u00e9cut\u00e9 par un utilisateur, il ne peut pas se lier au port 443 tel quel.<code>\/etc\/default\/coturn<\/code>Changer l&#039;utilisateur en cours d&#039;ex\u00e9cution en root, ou<code>setcap<\/code>Avec la commande<code>serveur tournant<\/code>au fichier ex\u00e9cutable<code>service de liaison cap_net<\/code>Il existe un moyen d&#039;accorder des autorisations. Par exemple, dans ce dernier cas,<code>sudo setcap cap_net_bind_service=+ep \/usr\/bin\/turnserver<\/code>En ex\u00e9cutant cette commande, m\u00eame les utilisateurs non root pourront se connecter aux ports de faible num\u00e9ro. Sp\u00e9cifiez \u00e9galement le chemin d&#039;acc\u00e8s correct au fichier de certificat (cert\/pkey) et d\u00e9finissez les permissions du fichier pour que l&#039;utilisateur coturn puisse le lire. Apr\u00e8s avoir modifi\u00e9 les param\u00e8tres,<code>sudo systemctl restart coturn<\/code>Red\u00e9marrez le service et v\u00e9rifiez les journaux pour d\u00e9tecter d\u2019\u00e9ventuelles erreurs.<\/p>\n\n\n\n<h4><strong>Contr\u00f4le de fonctionnement<\/strong><\/h4>\n\n\n\n<p>Apr\u00e8s avoir d\u00e9marr\u00e9 le serveur coturn, nous le testerons \u00e0 l&#039;aide d&#039;un client STUN pour v\u00e9rifier son fonctionnement, et essaierons \u00e9galement de nous connecter \u00e0 ICE depuis l&#039;application WebRTC dans le navigateur.<code>stunclient<\/code>commande(<code>apt-get installe stun-client<\/code>(Disponible pour l&#039;installation \u00e0<code>stunclient &lt;IP du serveur&gt; 3478<\/code>Vous pouvez essayer d&#039;obtenir votre adresse IP externe en ex\u00e9cutant la commande suivante. De plus, dans votre navigateur, les candidats ICE seront r\u00e9pertori\u00e9s dans le journal des outils de d\u00e9veloppement.<code>srflx<\/code>(Serveur R\u00e9flexif) candidats et<code>relais<\/code>V\u00e9rifiez si vous recevez un candidat. Sinon, essayez les solutions suivantes\u00a0:<\/p>\n\n\n\n<ul><li class=\"\">Les ports n\u00e9cessaires sont-ils ouverts dans les param\u00e8tres du pare-feu du serveur (iptables ou groupes de s\u00e9curit\u00e9 cloud)\u00a0?<\/li><li class=\"\">Les informations d&#039;URI, de port et d&#039;authentification correctes sont-elles d\u00e9finies dans les param\u00e8tres du serveur ICE c\u00f4t\u00e9 client (d\u00e9crits ci-dessous)\u00a0?<\/li><li class=\"\"><code>turnserver.conf<\/code>de<code>royaume<\/code>Assurez-vous que les param\u00e8tres correspondent \u00e0 l&#039;authentification du client. (Ceci ne pose g\u00e9n\u00e9ralement pas de probl\u00e8me dans la version navigateur de WebRTC, car le domaine est attribu\u00e9 automatiquement. Cependant, soyez prudent si vous avez une impl\u00e9mentation personnalis\u00e9e.)<\/li><li class=\"\">journal de bord (<code>\/var\/log\/turnserver.log<\/code>) et v\u00e9rifiez s&#039;il y a une erreur d&#039;authentification (<code>MAUVAIS UTILISATEUR<\/code>S&#039;il y a une erreur telle que celle ci-dessus, le nom d&#039;utilisateur\/mot de passe ne correspond pas.<\/li><\/ul>\n\n\n\n<p>Avec les param\u00e8tres ci-dessus en place, vous aurez votre propre serveur STUN\/TURN\/TURNS en cours d&#039;ex\u00e9cution et pourrez prendre en charge les connexions WebRTC dans divers environnements r\u00e9seau.<\/p>\n\n\n\n<h2>Exemple de param\u00e8tres du serveur ICE pour le client WebRTC (JavaScript)<\/h2>\n\n\n\n<p>Pour utiliser r\u00e9ellement le serveur STUN\/TURN que nous venons de construire sur l&#039;application WebRTC (navigateur),<strong>Param\u00e8tres des serveurs ICE<\/strong>Dans l&#039;API WebRTC de JavaScript,<code>RTCPeerConnection<\/code>Vous pouvez sp\u00e9cifier une liste de serveurs STUN\/TURN lors de la g\u00e9n\u00e9ration d&#039;un fichier . Nous allons maintenant pr\u00e9senter un exemple de code concret sp\u00e9cifiant tous les serveurs STUN\/TURN\/TURNS et expliquer sa signification.<\/p>\n\n\n\n<p>Commencez par cr\u00e9er un objet de configuration pour le serveur ICE. Saisissez le nom de domaine de votre serveur.<code>turn.example.com<\/code>(Remplacer si n\u00e9cessaire). STUN ne n\u00e9cessite pas d&#039;authentification, donc seul l&#039;URI est sp\u00e9cifi\u00e9. TURN\/TURNS n\u00e9cessite une authentification, donc le nom d&#039;utilisateur et le mot de passe sont \u00e9galement sp\u00e9cifi\u00e9s.<\/p>\n\n\n\n<div class=\"hcb_wrap\" data-no-translation=\"\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>const iceConfig = {\n  iceServers: [\n    \/\/ 1. STUN\u30b5\u30fc\u30d0\uff08UDP\/3478\uff09\n    { urls: &#39;stun:turn.example.com:3478&#39; },\n    \/\/ 2. TURN\u30b5\u30fc\u30d0\uff08UDP\/443\u7d4c\u7531\uff09\n    { urls: &#39;turn:turn.example.com:443?transport=udp&#39;, username: &#39;webrtcuser&#39;, credential: &#39;secretpass123&#39; },\n    \/\/ 3. TURN\u30b5\u30fc\u30d0\uff08TCP\/443 + TLS = TURNS\uff09\n    { urls: &#39;turns:turn.example.com:443&#39;, username: &#39;webrtcuser&#39;, credential: &#39;secretpass123&#39; }\n  ]\n};\nconst pc = new RTCPeerConnection(iceConfig);<\/code><\/pre><\/div>\n\n\n\n<p>Ci-dessus<code>serveurs de glace<\/code>Le tableau comporte trois entr\u00e9es.<\/p>\n\n\n\n<ol><li class=\"\"><strong>\u00c9TOURDIR:<\/strong> <code>\u00e9tourdir:turn.example.com:3478<\/code><br>Sp\u00e9cifie l&#039;adresse de votre propre serveur STUN (si le port est omis, le port 3478 est utilis\u00e9). STUN permet de d\u00e9terminer la travers\u00e9e NAT et d&#039;obtenir les candidats. Le navigateur interroge d&#039;abord ce serveur via UDP pour obtenir les candidats r\u00e9flexifs du serveur.<\/li><li class=\"\"><strong>TOUR (UDP) :<\/strong> <code>tour:tour.exemple.com:443?transport=udp<\/code><br>Cr\u00e9ez votre propre serveur TURN<strong>Port UDP 443<\/strong>Il s&#039;agit du param\u00e8tre \u00e0 utiliser. Le nom d&#039;utilisateur d\u00e9fini pr\u00e9c\u00e9demment dans coturn comme information d&#039;authentification.<code>utilisateur Web<\/code>et mot de passe<code>secretpass123<\/code>Le param\u00e8tre de requ\u00eate est sp\u00e9cifi\u00e9.<code>?transport=udp<\/code>(Si non sp\u00e9cifi\u00e9, le navigateur essaiera d&#039;abord UDP, et si cela \u00e9choue, essaiera \u00e9galement TCP.) Avec ce param\u00e8tre, m\u00eame si une connexion directe utilisant STUN normal \u00e9choue, vous pouvez obtenir un candidat pour le relais TURN sur le port UDP 443.<\/li><li class=\"\"><strong>TOUR (TLS\/TCP) :<\/strong> <code>tours:turn.example.com:443<\/code><br><strong>TOURNER avec TLS<\/strong>Il s&#039;agit du param\u00e8tre du serveur TURNS. Le nom d&#039;utilisateur et le mot de passe sont \u00e9galement sp\u00e9cifi\u00e9s ici. Le navigateur \u00e9tablira une connexion TLS \u00e0 cette entr\u00e9e sur le port TCP 443 pour obtenir un relais TURN candidat. Il s&#039;agit du relais candidat de dernier recours, et il est possible d&#039;\u00e9tablir une communication m\u00eame si la communication via UDP est impossible.<\/li><\/ol>\n\n\n\n<p><code>RTCPeerConnection<\/code>Lorsque l&#039;agent ICE g\u00e9n\u00e8re le serveur ICE, il tente de se connecter aux serveurs ICE sp\u00e9cifi\u00e9s dans l&#039;ordre et collecte les candidats. L&#039;agent ICE obtient d&#039;abord les candidats STUN (srflx), puis les candidats TURN (relais) en parall\u00e8le. L&#039;algorithme ICE combine ensuite ces candidats, effectue une v\u00e9rification de connexion et s\u00e9lectionne la route optimale. Les d\u00e9veloppeurs n&#039;ont pas besoin de conna\u00eetre d&#039;autres proc\u00e9dures.<\/p>\n\n\n\n<p><strong>indiquer:<\/strong> Comme mentionn\u00e9 ci-dessus<strong>Pr\u00e9parez plusieurs candidats<\/strong>est important. Par exemple,<code>\u00e9tourdir:<\/code>Si vous sp\u00e9cifiez uniquement TURN (UDP), aucun candidat ne sera trouv\u00e9 dans un environnement o\u00f9 UDP est bloqu\u00e9, et la connexion \u00e9chouera. De m\u00eame, si vous sp\u00e9cifiez uniquement TURN (UDP), la connexion \u00e9chouera dans un environnement o\u00f9 seul TCP est autoris\u00e9. Par cons\u00e9quent, si possible,<code>tourner:<\/code>et<code>tours:<\/code>En incluant les deux dans le serveur ICE, la redondance est assur\u00e9e, permettant de trouver au moins un candidat valide dans n&#039;importe quel environnement (bien entendu, le serveur TURN doit prendre en charge UDP et TCP\/TLS). Le client (navigateur) s\u00e9lectionne automatiquement un chemin disponible, l&#039;ordre de la liste n&#039;est donc pas un probl\u00e8me majeur. Si je devais dire\u00a0:<code>Politique de transport sur la glace<\/code>de<code>relais<\/code>Sauf indication contraire, le navigateur privil\u00e9giera les connexions directes. Ainsi, si vous saisissez une entr\u00e9e STUN, vous \u00e9viterez d&#039;utiliser inutilement le serveur TURN. De plus, si des serveurs non pertinents (adresses inexistantes, etc.) sont saisis dans la liste des serveurs ICE, des retards peuvent survenir en raison d&#039;un d\u00e9passement de d\u00e9lai. Il est donc pr\u00e9f\u00e9rable de ne saisir que ceux qui sont r\u00e9ellement disponibles.<\/p>\n\n\n\n<p>Enfin, ex\u00e9cutons l\u2019application WebRTC avec ce param\u00e8tre et v\u00e9rifions l\u2019\u00e9tat de la connexion.<code>peerConnection.getStats()<\/code>ou<code>chrome:\/\/webrtc-internals<\/code>Vous pouvez v\u00e9rifier le candidat ICE et l&#039;\u00e9tat de la connexion avec (Chrome). Si tout fonctionne comme pr\u00e9vu, le serveur devrait automatiquement revenir \u00e0 une connexion directe (P2P) dans un environnement o\u00f9 UDP est disponible, et \u00e0 une connexion via TURN\/TLS dans un environnement o\u00f9 cela est difficile.<\/p>\n\n\n\n<h2>Diff\u00e9rence entre SFU et TURN<\/h2>\n\n\n\n<p>Les relais WebRTC peuvent \u00eatre divis\u00e9s en deux cat\u00e9gories\u00a0: \u00ab\u00a0TURN\u00a0\u00bb et \u00ab\u00a0SFU\u00a0\u00bb, mais leurs r\u00f4les, configurations et utilisations diff\u00e8rent sensiblement. Voici un r\u00e9sum\u00e9 des diff\u00e9rences techniques.<\/p>\n\n\n\n<h3>TURN : Le relais comme alternative au peer-to-peer<\/h3>\n\n\n\n<p>TURN (Traversal Using Relays around NAT) est un serveur relais auxiliaire utilis\u00e9 dans les environnements o\u00f9 la communication P2P WebRTC est impossible. Le serveur TURN agit entre les homologues et relaie les paquets lorsque STUN ne fonctionne pas en raison de la NAT ou de pare-feu. Chaque homologue envoyant un flux \u00e0 chaque partenaire de communication individuellement, la configuration est de type maill\u00e9 et TURN se positionne comme un \u00ab\u00a0pinch hitter\u00a0\u00bb.<\/p>\n\n\n\n<ul><li><strong>composition<\/strong>: Chaque utilisateur transmet \u00e0 tous les autres utilisateurs via un relais (en fait un maillage)<\/li><li><strong>\u00c9volutivit\u00e9<\/strong>: Faible (plus il y a de monde, plus la charge est \u00e9lev\u00e9e)<\/li><li><strong>Contenus diffus\u00e9s<\/strong>:Transfert de paquets simple uniquement, aucune analyse ou optimisation des m\u00e9dias<\/li><\/ul>\n\n\n\n<h3>SFU : Relais efficace pour les appels multipartites<\/h3>\n\n\n\n<p>SFU (Selective Forwarding Unit) est un serveur relais intelligent utilis\u00e9 dans les conf\u00e9rences Web multi-participants.<span class=\"swl-marker mark_blue\">Chaque client envoie un flux \u00e0 la SFU, qui le transmet de mani\u00e8re s\u00e9lective \u00e0 d\u2019autres participants.<\/span>Il effectue \u00e9galement la d\u00e9tection des haut-parleurs, le r\u00e9glage de la qualit\u00e9 de l&#039;image et l&#039;optimisation de la latence, permettant une diffusion \u00e9volutive et hautes performances.<\/p>\n\n\n\n<ul><li><strong>composition<\/strong>: Type \u00e9toile o\u00f9 chaque client est connect\u00e9 \u00e0 une SFU<\/li><li><strong>\u00c9volutivit\u00e9<\/strong>:Cher (une seule transmission m\u00eame si le nombre de personnes augmente)<\/li><li><strong>Contenus diffus\u00e9s<\/strong>:Le contr\u00f4le de la destination du transfert et l&#039;optimisation du support sont possibles<\/li><\/ul>\n\n\n\n<h3>Tableau comparatif entre TURN et SFU<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th>Caract\u00e9ristiques<\/th><th>TOURNER<\/th><th>Universit\u00e9 Simon Fraser<\/th><\/tr><tr><td>But<\/td><td>Alternatives lorsque la travers\u00e9e NAT n&#039;est pas possible<\/td><td>Communication en temps r\u00e9el entre de nombreuses personnes<\/td><\/tr><tr><td>Configuration de la communication<\/td><td>Maillage (transmission entre eux)<\/td><td>Type \u00e9toile (une transmission)<\/td><\/tr><tr><td>Fonction relais<\/td><td>Relais simple (transparent)<\/td><td>Transfert s\u00e9lectif et optimisation disponibles<\/td><\/tr><tr><td>\u00c9volutivit\u00e9<\/td><td>faible<\/td><td>cher<\/td><\/tr><tr><td>Contr\u00f4le des m\u00e9dias<\/td><td>aucun<\/td><td>Oui (par exemple, d\u00e9tection du haut-parleur, r\u00e9glage de la r\u00e9solution)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>TURN n&#039;est qu&#039;un dernier recours lorsque la communication P2P n&#039;est pas possible, et constitue un relais qui compl\u00e8te le maillage P2P.<span class=\"swl-marker mark_blue\">SFU est une architecture de relais con\u00e7ue pour \u00eatre efficace d\u00e8s le d\u00e9part pour les appels multipartites.<\/span>\u00c9tant donn\u00e9 que les deux ont des r\u00f4les fondamentalement diff\u00e9rents, il est important de ne pas les confondre lors de la conception.<\/p>\n\n\n\n<h2>r\u00e9sum\u00e9<\/h2>\n\n\n\n<p>Cet article fournit une explication d\u00e9taill\u00e9e pour les utilisateurs WebRTC interm\u00e9diaires \u00e0 avanc\u00e9s sur les diff\u00e9rences techniques entre STUN, TURN et TURNS, ainsi que sur le moment o\u00f9 les utiliser, comment cr\u00e9er un serveur \u00e0 l&#039;aide de coturn et quelques exemples de code, et comment ICE se comporte dans des environnements r\u00e9seau difficiles.<\/p>\n\n\n\n<p><strong>\u00c9TOURDIR<\/strong>Il est l\u00e9ger et permet une communication directe dans les environnements NAT.<strong>TOURNER<\/strong>fournit une bou\u00e9e de sauvetage pour la communication dans les situations difficiles\u00a0; et<strong>TOURS<\/strong>En combinant ces \u00e9l\u00e9ments, il devient possible d\u2019utiliser WebRTC m\u00eame dans des environnements particuliers comme au sein d\u2019une entreprise.<\/p>\n\n\n\n<p>Chacune de ces m\u00e9thodes pr\u00e9sente des avantages et des inconv\u00e9nients. Il est donc pr\u00e9f\u00e9rable de se connecter directement \u00e0 STUN autant que possible et d&#039;utiliser le relais TURN uniquement en cas d&#039;absolue n\u00e9cessit\u00e9. Dans le d\u00e9veloppement d&#039;applications WebRTC, en pr\u00e9parant plusieurs routes dans les param\u00e8tres du serveur ICE, comme pr\u00e9sent\u00e9 ici, et en configurant et en utilisant correctement coturn c\u00f4t\u00e9 serveur, vous pouvez assurer des communications stables en temps r\u00e9el dans divers environnements r\u00e9seau.<\/p>\n\n\n\n<p>WebRTC est un domaine complexe qui combine les API de navigateur et les technologies r\u00e9seau, mais comprendre le fonctionnement de STUN\/TURN et ICE est essentiel pour cr\u00e9er des applications fiables.<\/p>\n\n\n\n<p>Nous esp\u00e9rons que vous utiliserez les informations de cet article pour relever le d\u00e9fi de la travers\u00e9e NAT dans vos produits. Vos utilisateurs pourront ainsi b\u00e9n\u00e9ficier de communications fluides gr\u00e2ce \u00e0 un traitement des connexions intelligemment con\u00e7u en arri\u00e8re-plan, sans m\u00eame s&#039;en rendre compte.<\/p>","protected":false},"excerpt":{"rendered":"<p>WebRTC\u3068\u306f WebRTC\uff08Web Real-Time Communication\uff09\u306f\u3001\u30d6\u30e9\u30a6\u30b6\u540c\u58eb\u3067\u30ea\u30a2 [&hellip;]<\/p>","protected":false},"author":1,"featured_media":11871,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":""},"categories":[25,9,33],"tags":[],"_links":{"self":[{"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/posts\/11859"}],"collection":[{"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/comments?post=11859"}],"version-history":[{"count":8,"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/posts\/11859\/revisions"}],"predecessor-version":[{"id":11868,"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/posts\/11859\/revisions\/11868"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/media\/11871"}],"wp:attachment":[{"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/media?parent=11859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/categories?post=11859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chat-messenger.com\/fr\/wp-json\/wp\/v2\/tags?post=11859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}