Du point de vue de l'utilisateur, les services d'appel semblent assez simples: vous allez à la page d'un autre utilisateur, vous appelez, il décroche, vous lui parlez. Dehors, il semble que tout soit simple, mais peu savent faire un tel service. Mais Alexander Tobol (
alatobol ) sait non seulement, mais partage aussi volontiers son expérience.

Poursuivez la version texte du rapport sur la Sibérie HighLoad ++, à partir de laquelle vous apprendrez:
- comment les services d'appels vidéo fonctionnent sous le capot;
- combien il est beau de percer le NAT - cela sera intéressant pour les spécialistes du jeu qui ont besoin d'une connexion peer-to-peer;
- comment WebRTC fonctionne, quels protocoles il inclut;
- comment puis-je régler WebRTC via BigData.
à propos de l'orateur: Alexander Tobol dirige le développement des plates-formes vidéo et bande sur ok.ru.
Historique des appels vidéo
Le premier appareil d'appel vidĂ©o est apparu en 1960, il s'appelait un picherphone, utilisait des rĂ©seaux dĂ©diĂ©s et Ă©tait extrĂȘmement cher. En 2006, Skype a ajoutĂ© des appels vidĂ©o Ă son application. En 2010, Flash a pris en charge le protocole RTMFP et nous, Ă Odnoklassniki, avons lancĂ© des appels vidĂ©o Flash. En 2016, Chrome a cessĂ© de prendre en charge Flash, et en aoĂ»t 2017, nous avons redĂ©marrĂ© les appels avec la nouvelle technologie, dont je parlerai aujourd'hui. AprĂšs avoir finalisĂ© le service, nous avons reçu pendant six mois une augmentation significative du nombre d'appels terminĂ©s avec succĂšs. RĂ©cemment, nous avons Ă©galement des masques dans les appels.

Architecture et savoirs traditionnels
Puisque nous travaillons dans un réseau social, nous n'avons pas de tùches techniques et nous ne savons pas ce que sont les savoirs traditionnels. Habituellement, l'idée entiÚre tient sur une seule page et ressemble à ceci.

L'utilisateur souhaite appeler d'autres utilisateurs à l'aide d'une application Web ou iOS / Android. Un autre utilisateur peut avoir plusieurs appareils. L'appel arrive sur tous les appareils, l'utilisateur décroche le téléphone sur l'un d'eux, il parle. Tout est simple.
Spécifications techniques
Afin de faire un service d'appel de qualité, nous devons comprendre quelles caractéristiques nous voulons suivre. Nous avons décidé de commencer par chercher ce qui agaçait le plus l'utilisateur.
L'utilisateur est vraiment ennuyé s'il décroche le téléphone et est obligé d'attendre que la connexion soit établie.

L'utilisateur est ennuyé si la qualité de l'appel est mauvaise - quelque chose est interrompu, la vidéo est dispersée, le son bouillonne.

Mais surtout l'utilisateur est agacé par le retard des appels. La latence est l'une des caractéristiques importantes des appels. Avec une latence dans une conversation de l'ordre de 5 secondes, il est absolument impossible de mener un dialogue.

Nous avons dĂ©terminĂ© pour nous-mĂȘmes des caractĂ©ristiques acceptables:
- Démarrer - nous avons décidé qu'il était bon de commencer l'appel dans une seconde. C'est-à -dire la connexion aprÚs que l'utilisateur a répondu, ne devrait pas prendre plus d'une seconde.
- La qualité est un indicateur trÚs subjectif. Vous pouvez mesurer, par exemple, le rapport signal / bruit (SNR), mais il manque encore des trames et autres artefacts. Nous avons mesuré la qualité de maniÚre plutÎt subjective et évalué le bonheur des utilisateurs.
- La latence doit ĂȘtre infĂ©rieure Ă 0,5 seconde. Si la latence est supĂ©rieure Ă 0,5 seconde, vous entendez dĂ©jĂ des retards et commencez Ă vous interrompre.

Polycom est un systÚme de conférence installé dans nos bureaux. Nous avons des latences moyennes de polycom de l'ordre de 1,3 seconde. Avec un tel retard, vous ne vous comprenez pas toujours. Si le délai augmente à 2 secondes, le dialogue ne sera pas possible.

Comme nous avions déjà lancé la plateforme, nous nous attendions à peu prÚs à un million d'appels par jour. C'est mille appels en parallÚle. Si tous les appels sont lancés via le serveur, il y aura mille appels mégabits par appel. C'est seulement 1 gigabit / sec un seul serveur de fer sera suffisant.
Internet vs TTX
Qu'est-ce qui peut vous empĂȘcher d'obtenir de telles fonctionnalitĂ©s intĂ©ressantes? Internet!

Sur Internet, il y a des choses comme le temps d'aller-retour (RTT), qui ne peuvent pas ĂȘtre surmontĂ©es, il y a une bande passante variable, il y a le NAT.
Auparavant, nous mesurions la vitesse de transmission dans les réseaux de nos utilisateurs.

Nous l'avons ventilé par type de connexion, avons examiné le RTT moyen, la perte de paquets, la vitesse et avons décidé de tester les appels sur les valeurs moyennes de chacun de ces réseaux.

Il existe d'autres problĂšmes sur Internet:
- Perte de paquets - nous avons mesuré 0,6% de perte de paquets aléatoire (nous ne prenons pas en compte la perte de paquets de congestion avec un nombre excessif de paquets).
- RĂ©organisation - vous envoyez des paquets dans le mĂȘme ordre et le rĂ©seau les trie Ă nouveau.
- Jitter - envoie un flux vidéo ou audio à un certain intervalle, et les paquets se regroupent du cÎté client en paquets, par exemple, en raison de la mise en mémoire tampon sur les périphériques réseau.
- NAT - il s'est avéré que plus de 97% des utilisateurs sont derriÚre NAT. Nous parlerons pourquoi, quoi et comment.

Considérez les paramÚtres réseau répertoriés ci-dessus avec un exemple simple.
J'ai paginĂ© le site Web de l'UniversitĂ© d'Ătat de Novossibirsk depuis mon bureau et j'ai reçu un ping si Ă©trange.

La gigue moyenne dans cet exemple est de 30 ms, c'est-Ă -dire que l'intervalle moyen entre les temps de ping adjacents est d'environ 30 ms et le ping moyen est de 105 ms.
Qu'est-ce qui est important dans les appels, pourquoi allons-nous nous battre pour le P2P?

Ăvidemment, si nous parvenons Ă Ă©tablir une connexion p2p entre nos utilisateurs qui essaient de se parler Ă Saint-PĂ©tersbourg, plutĂŽt que via un serveur situĂ© Ă Novossibirsk, nous Ă©conomiserons environ 100 ms aller-retour et du trafic vers ce service.
Par conséquent, la majeure partie de l'article est consacrée à la fabrication de bons p2p.
Histoire ou héritage
Comme je l'ai dit, nous avons un service d'appel depuis 2010 et nous l'avons redémarré.

En 2006, lorsque Skype a commencĂ©, Flash a achetĂ© Amicima, qui a fabriquĂ© RTMFP. Flash avait dĂ©jĂ RTMP, qui peut en principe ĂȘtre utilisĂ© pour les appels, et il est souvent utilisĂ© pour le streaming. Flash a ensuite ouvert la spĂ©cification RTMP. Je me demande pourquoi ils avaient besoin de RTMFP? En 2010, nous avons utilisĂ© RTMFP.
Comparez les exigences des protocoles d'appel et des protocoles de streaming rĂ©els et voyez oĂč se trouve cette frontiĂšre.
RTMP est plus un protocole de streaming vidéo. Il utilise TCP, il a un retard cumulé. Si vous disposez d'une bonne connexion Internet, les appels vers RTMP fonctionneront.
Le protocole RTMFP , malgrĂ© la diffĂ©rence en une seule lettre, est le protocole UDP. Il est exempt de problĂšmes de mise en mĂ©moire tampon - ceux qui sont sur TCP; Il est privĂ© de blocage en tĂȘte de ligne - c'est lorsque vous avez perdu un paquet, et TCP ne renvoie pas les paquets suivants jusqu'Ă ce qu'il soit temps d'envoyer Ă nouveau le perdu. RTMFP Ă©tait capable de gĂ©rer NAT et connaissait un changement dans l'adresse IP des clients. Par consĂ©quent, nous avons lancĂ© le Web sur RTMFP en 2010.

Ce n'est qu'en 2011 que le projet initial de WebRTC est apparu, qui n'était pas encore pleinement opérationnel. En 2012, nous avons commencé à prendre en charge les appels sur iOS / Android, puis quelque chose d'autre s'est produit, et en 2016, Chrome a cessé de prendre en charge Flash. Nous devions faire quelque chose.

Nous avons regardé tous les protocoles VoIP: comme toujours, pour faire quelque chose, nous commençons par regarder les concurrents.
Concurrents ou par oĂč commencer
Nous avons choisi les concurrents les plus populaires: Skype, WhatsApp, Google Duo (similaire Ă Hangouts) et ICQ.
Pour commencer, nous avons mesuré le retard.

C'est facile Ă faire. Ci-dessus, une photographie dans laquelle:
- ChronomÚtre (voir téléphone en haut à gauche), qui indique l'heure (03:08).
- Le tĂ©lĂ©phone Ă proximitĂ© passe un appel et prend le premier tĂ©lĂ©phone sous forme de vidĂ©o. Ă partir du moment oĂč l'image est entrĂ©e dans l'appareil photo du tĂ©lĂ©phone et que vous l'avez vue, cela a pris environ 100 ms.
- Un appel vers un autre téléphone (blanc) et une fois de plus. Ici, le retard est d'environ 310 ms avec Google Duo.
Je ne révélerai pas encore toutes les cartes, mais nous nous sommes assurés que ces appareils ne pouvaient pas établir de connexions p2p. Bien sûr, les mesures ont été effectuées dans différents réseaux, et ce n'est qu'un exemple.

Skype interrompt encore un peu. Il s'est avĂ©rĂ© qu'avec Skype, au cas oĂč il ne parviendrait pas Ă connecter p2p, le dĂ©lai est de 1,1 s.
Notre environnement de test était compliqué. Nous avons testé dans différentes conditions (EDGE, 3G, LTE, WiFi), pris en compte que les canaux sont asymétriques, et je donne les valeurs moyennes de toutes les mesures.

Afin d'estimer la consommation de la batterie, la charge du processeur et tout le reste, nous avons dĂ©cidĂ© que vous pouvez simplement mesurer la tempĂ©rature du tĂ©lĂ©phone avec un pyromĂštre et supposer qu'il s'agit d'une charge moyenne sur le GPU du tĂ©lĂ©phone par processeur, batterie. En principe, il est trĂšs dĂ©sagrĂ©able de porter un tĂ©lĂ©phone chaud Ă votre oreille, et mĂȘme de le tenir entre vos mains. Il semble Ă l'utilisateur que l'application va maintenant utiliser toute sa batterie.

Le résultat est:
- Les plus lents dans le retard étaient ICQ et Skype, et les plus rapides - Telegram. Ce n'est pas une comparaison complÚtement correcte, car Telegram n'a pas d'appels vidéo, mais leur latence audio est minimale. WhatsApp (environ 200 ms) et Hangouts - 390 ms fonctionnent trÚs bien.
- Par température, Telegram mange le moins sans vidéo et Skype le plus.
- En termes de temps de réponse , Telegram établit la connexion pour la durée la plus longue et la plus rapide WhatsApp et Google Duo.
Génial, nous avons obtenu quelques métriques!

Nous avons testé la qualité de la vidéo et de la voix sur différents réseaux, avec différentes gouttes et tout le reste. En conséquence, nous sommes arrivés à la conclusion que la
vidéo de la
plus haute qualité se trouve sur Google Duo et que la voix est sur Skype , mais cela se trouve dans les «mauvais» réseaux lorsqu'il y a déjà une distorsion. En général, tout le monde travaille approximativement médiocre. WhatsApp a l'image la plus floue.
Voyons voir sur quoi tout cela est implémenté.

Skype a son propre protocole propriétaire, et tout le monde utilise soit une modification de WebRTC, soit généralement directement WebRTC. Hangouts, Google Duo, WhatsApp, Facebook Messenger peuvent fonctionner avec le Web, et ils ont tous WebRTC sous le capot. Ils sont tous tellement différents, avec des caractéristiques différentes, et ils ont tous un WebRTC! Il faut donc pouvoir le cuisiner correctement. De plus, il y a Telegram, dont certaines parties de WebRTC sont responsables de la partie audio, il y a ICQ, qui a longtemps forgé WebRTC et a continué à développer sa propre voie.
WebRTC L'architecture

WebRTC implique la présence d'un serveur de signalisation, un intermédiaire entre les clients, qui est utilisé pour échanger des messages lors de l'établissement d'une connexion p2p entre eux. AprÚs avoir établi une connexion directe, les clients commencent à échanger des données multimédias entre eux.
WebRTC Démo
Commençons par une démo simple. Il existe 5 étapes simples pour établir une connexion WebRTC.
Exemple de code détaillé Il dit ceci:
- Prenez une vidéo et établissez une connexion entre pairs, transférez une sorte de iceServers (ce n'est pas immédiatement clair de quoi il s'agit).
- Créez une offre SDP et envoyez-la à la signalisation, et la signalisation WebRTC ne l'implémentera en aucune façon.
- Ensuite, vous devez créer un wrapper pour celui provenant de la signalisation, et cela ne fait pas non plus partie de WebRTC.
- Ăchangez encore quelques candidats.
- Obtenez enfin le flux vidéo à distance.
Voyons ce qui se passe lĂ -bas et ce dont nous avons besoin pour nous mettre en Ćuvre.

Nous regardons l'image de bas en haut. Il existe une bibliothĂšque WebRTC dĂ©jĂ intĂ©grĂ©e au navigateur, prise en charge par Chrome, Firefox, etc. Vous pouvez la crĂ©er sous Android / iOS et communiquer avec elle via l'API et SDP (Session Description Protocol), qui dĂ©crit la session elle-mĂȘme. Ci-dessous, je vais vous dire ce qui y est inclus. Pour utiliser cette bibliothĂšque dans votre application, vous devez Ă©tablir une connexion entre les abonnĂ©s via la signalisation. La signalisation est aussi votre service que vous devez Ă©crire vous-mĂȘme, WebRTC ne le fournit pas.
Plus loin dans l'article, nous discuterons du réseau dans l'ordre, puis de la vidéo / audio, et à la fin, nous écrirons notre signalisation.
Réseau WebRTC ou p2p (en fait c2s2c)
La configuration d'une connexion p2p semble ĂȘtre assez simple.

Nous avons Alice et Bob qui veulent Ă©tablir une connexion p2p. Ils prennent leurs adresses IP, ils ont un serveur de signalisation auquel ils sont tous les deux connectĂ©s, et par lequel ils peuvent Ă©changer ces adresses. Ils Ă©changent des adresses, et oh! Ils ont les mĂȘmes adresses, quelque chose s'est mal passĂ©!

En fait, les deux utilisateurs sont trÚs probablement assis derriÚre des routeurs Wi-Fi et ce sont leurs adresses IP grises locales. Le routeur leur fournit une fonctionnalité telle que la traduction d'adresses réseau (NAT). Comment fonctionne-t-elle?

Vous avez un sous-réseau gris et une adresse IP externe. Vous envoyez un paquet à Internet à partir de votre adresse grise, NAT remplace votre adresse grise par du blanc et se souvient du mappage: quel port il a envoyé, à quel utilisateur et à quel port il correspond. Lorsque le paquet de retour arrive, il se résout par ce mappage et l'envoie à l'expéditeur. Tout est simple.
Vous trouverez ci-dessous une illustration de l'apparence de ma place.

Il s'agit de mon adresse IP interne et de l'adresse du routeur (d'ailleurs, également grise). Si vous tracez et voyez l'itinéraire, nous verrons mon routeur Wi-Fi: un paquet d'adresses de fournisseur gris et une IP blanche externe. Ainsi, en fait, j'aurai deux NATs: l'un sur lequel je suis en Wi-Fi, et l'autre autre chez le fournisseur, à moins, bien sûr, de m'acheter une adresse IP externe dédiée.
NAT est si populaire parce que:- de nombreux IPv4 sont toujours manquants et il n'y a pas suffisamment d'adresses;
- NAT semble protéger le réseau;
- c'est une fonction standard du routeur: connectez-vous au Wi-Fi, il y a du NAT là , ça fonctionne.
Par conséquent, seulement 3% des utilisateurs sont assis avec une adresse IP externe, tandis que tous les autres passent par NAT.
NAT vous permet d'accĂ©der en toute sĂ©curitĂ© Ă toutes les adresses blanches. Mais si vous n'ĂȘtes allĂ© nulle part, personne ne peut venir Ă vous.

Ătablir une connexion p2p est un problĂšme. En fait, Alice et Bob ne peuvent pas sâenvoyer de paquets sâils sont tous deux derriĂšre NAT.
WebRTC dispose d'
un protocole STUN pour résoudre ce problÚme. Il est proposé de déployer un serveur STUN. Puis Alice se connecte au serveur STUN, obtient son adresse IP, l'envoie à Bob via la signalisation. Bob obtient également son adresse IP et l'envoie à Alice. Ils s'envoient des paquets et traversent ainsi le NAT.
Question : Alice a un port spécifique ouvert, NAT / Firewall a déjà été rompu à ce port et Bob est ouvert. Ils connaissent leurs adresses respectives. Alice essaie d'envoyer le paquet à Bob; il envoie le paquet à Alice. Pensez-vous qu'ils peuvent parler ou non?
En fait, vous avez raison dans tous les cas, le résultat dépend du type de paire NAT que les utilisateurs ont.

Traduction d'adresses réseau
Il existe 4 types de NAT:
- NAT Ă cĂŽne plein;
- NAT Ă cĂŽne restreint;
- Port Ă cĂŽne restreint NAT;
- NAT symétrique
Dans la version de base, Alice envoie un paquet au serveur STUN, elle ouvre un port. Bob découvre en quelque sorte son port et envoie un paquet de retour. S'il s'agit d'un
NAT à cÎne complet - le plus simple qui mappe simplement le port externe au port interne, alors Bob sera en mesure d'envoyer immédiatement un paquet à Alice, d'établir une connexion et ils parleront.

Voici le schĂ©ma d'interaction: Alice d'un port envoie un paquet au port STUN, STUN lui rĂ©pond avec son adresse externe. STUN peut rĂ©pondre Ă partir de n'importe quelle adresse, s'il s'agit d'un NAT Ă cĂŽne complet, il passera toujours par NAT, et Bob peut rĂ©pondre Ă la mĂȘme adresse.

Dans le cas du
NAT Ă cĂŽne restreint, les choses sont un peu plus compliquĂ©es. Il se souvient non seulement du port Ă partir duquel vous devez mapper vers l'adresse interne, mais Ă©galement de l'adresse externe vers laquelle vous ĂȘtes allĂ©. Autrement dit, si vous avez Ă©tabli une connexion uniquement avec le serveur IP STUN, personne d'autre sur le rĂ©seau ne pourra vous rĂ©pondre et le paquet de Bob n'atteindra pas.

Comment ce problÚme est-il résolu? Dans un schéma simple (voir l'illustration ci-dessous) comme celui-ci: Alice envoie un paquet à STUN, il lui répond avec son IP. STUN peut y répondre depuis n'importe quel port tant qu'il est NAT à cÎne restreint. Bob ne peut pas répondre à Alice car il a une adresse différente. Alice répond avec un paquet, connaissant l'adresse IP de Bob. Elle ouvre NAT à Bob, Bob lui répond. Hourra, ils ont parlé.

Une option légÚrement plus compliquée est le
NAT à cÎne restreint au port . Néanmoins, seul STUN doit répondre exactement à partir du port auquel il a été accédé. Tout fonctionnera aussi.
La chose la plus nuisible est le
NAT symétrique .

Au dĂ©but, tout fonctionne exactement de la mĂȘme maniĂšre - Alice envoie le paquet au serveur STUN, il rĂ©pond depuis le mĂȘme port. Bob ne peut pas rĂ©pondre Ă Alice, mais elle envoie le paquet Ă Bob. Et ici, malgrĂ© le fait qu'Alice envoie un paquet au port 4444, le mappage lui alloue un nouveau port. Le NAT symĂ©trique diffĂšre en ce que chaque fois qu'une nouvelle connexion est Ă©tablie, chaque fois qu'elle Ă©met un nouveau port sur le routeur. En consĂ©quence, Bob bat dans le port Ă partir duquel Alice est allĂ©e Ă STUN, et ils ne peuvent pas se connecter.
Dans le sens opposé, si Bob a une adresse IP ouverte, Alice peut simplement venir le voir et établir une connexion.
Toutes les options sont rassemblées dans un tableau ci-dessous.

Cela montre que presque tout est possible, sauf lorsque nous essayons d'établir des connexions via NAT symétrique avec NAT à cÎne restreint de port ou NAT symétrique à l'autre extrémité.

Comme nous l'avons dĂ©couvert, p2p n'a pas de prix pour nous en termes de latence, mais s'il n'a pas Ă©tĂ© possible de l'installer, WebRTC nous propose un serveur TURN. Lorsque nous avons rĂ©alisĂ© que p2p ne s'installera pas, nous pouvons simplement nous connecter Ă TURN, qui va proxy tout le trafic. Cependant, en mĂȘme temps, vous paierez pour le trafic et les utilisateurs peuvent avoir des retards supplĂ©mentaires.
Pratique
Google dispose de serveurs STUN gratuits. Vous pouvez les mettre dans la bibliothĂšque, cela fonctionnera.
Les serveurs TURN ont des informations d'identification (identifiant et mot de passe). TrÚs probablement, vous devrez élever le vÎtre, il est plutÎt difficile de le trouver gratuitement.
Exemples de serveurs STUN gratuits de Google:
- étourdissement: stun.l.google.com: 19302
- étourdissement: stun1.l.google.com: 19302
- étourdissement: stun2.l.google.com: 19302
- étourdissement: stun3.l.google.com: 19302
Et un serveur TURN gratuit avec des mots de passe: url: 'turn: 192.158.29.39: 3478? Transport = udp', identifiant: 'JZEOEt2V3Qb0y27GRntt2u2PAYA =', nom d'utilisateur: '28224511: 1379330808 âČ.
Nous utilisons
coturn .

En conséquence, 34% du trafic passe par la connexion p2p, tout le reste est mandaté via le serveur TURN.
Quoi d'autre est intéressant dans le protocole STUN?
STUN vous permet de déterminer le type de NAT.
Lien de diapositiveLors de l'envoi d'un paquet, vous pouvez indiquer que vous souhaitez recevoir une rĂ©ponse du mĂȘme port ou demander Ă STUN de rĂ©pondre Ă partir d'un port diffĂ©rent, d'une IP diffĂ©rente, ou mĂȘme d'une IP et d'un port diffĂ©rents. Ainsi,
pour 4 requĂȘtes au serveur STUN, vous pouvez dĂ©terminer le type de NAT .

Nous avons compté les types de NAT et nous avons constaté que presque tous les utilisateurs ont soit NAT symétrique soit NAT à cÎne restreint de port. Par conséquent, il s'avÚre que seul un tiers des utilisateurs peuvent établir une connexion p2p.
Vous pouvez vous demander pourquoi je vous dis tout cela si vous pouviez simplement prendre le STUN de Google, le mettre dans WebRTC, et il semble que tout fonctionnera.
Parce que vous pouvez dĂ©terminer vous-mĂȘme le type de NAT.

Il s'agit d'un
lien vers une application Java qui ne fait rien de compliquĂ©: il envoie simplement un ping Ă diffĂ©rents ports et diffĂ©rents serveurs STUN, et regarde quel port il voit Ă la fin. Si vous avez Open Full cone NAT, le serveur STUN aura le mĂȘme port. Avec le NAT Ă cĂŽne restreint, vous aurez diffĂ©rents ports pour chaque demande STUN.

Avec Symmetric NAT, ça se passe comme ça dans mon bureau. Il existe des ports complÚtement différents.
Mais parfois, il existe un modÚle intéressant: pour chaque connexion, le numéro de port augmente d'une unité.

Autrement dit, de nombreux NAT sont configurĂ©s de maniĂšre Ă augmenter ou diminuer le port d'une constante. Cette constante peut ĂȘtre trouvĂ©e et ainsi traverser le NAT symĂ©trique.

Ainsi, nous traversons le NAT - nous allons à un serveur STUN, à un autre, regardons la différence, comparons et essayons à nouveau de donner notre port déjà avec cet incrément ou décrément. Autrement dit, Alice essaie de donner à Bob son port, déjà ajusté pour une constante, sachant que la prochaine fois, ce sera juste cela.

Nous avons donc réussi à souder
12% d'égal à égal .
En fait, parfois, les routeurs externes avec la mĂȘme IP se comportent de la mĂȘme maniĂšre. Par consĂ©quent, si des statistiques sont collectĂ©es et si le NAT symĂ©trique est une caractĂ©ristique du fournisseur, et non une caractĂ©ristique du routeur Wi-Fi de l'utilisateur, alors le delta peut ĂȘtre prĂ©dit, l'envoyer immĂ©diatement Ă l'utilisateur afin qu'il l'utilise et ne passe pas trop de temps Ă le dĂ©terminer.
Relais CDN ou que faire si vous ne parvenez pas à établir une connexion P2P
Si nous utilisons toujours le serveur TURN et ne travaillons pas en p2p, mais en mode rĂ©el, en passant tout le trafic via le serveur, nous pouvons toujours ajouter un CDN. Ă moins, bien sĂ»r, que vous ayez une aire de jeux. Nous avons nos propres sites CDN, donc pour nous, c'Ă©tait assez simple. Mais il fallait dĂ©terminer oĂč il valait mieux envoyer une personne: sur un site CDN ou, disons, sur une chaĂźne vers Moscou. Ce n'est pas une tĂąche trĂšs triviale, nous l'avons donc fait:
- Accidentellement délivré à certains utilisateurs du site de Moscou, certains - à distance.
- Nous avons collecté des statistiques sur l'IP de l'utilisateur, sur les serveurs et sur les caractéristiques du réseau.
- Par maxMind, nous avons regroupé les sous-réseaux, regardé les statistiques et avons pu comprendre par IP quel utilisateur avait le serveur TURN le plus proche pour la connexion.

Il y a un CDN Ă Novossibirsk. Si tout fonctionne pour vous via Moscou, le 99e centile de RTT est de 1,3 seconde. GrĂące Ă CDN, tout fonctionne beaucoup plus rapidement (0,4 seconde).
Est-il toujours préférable d'utiliser une connexion p2p et de ne pas utiliser de serveur? Un exemple intéressant est les deux fournisseurs de Krasnoyarsk Optibyte et Mobra (les noms peuvent avoir changé). Pour une raison quelconque, la connexion entre eux sur p2p est bien pire que via MSK. Ils ne sont probablement pas amis entre eux.

Nous avons analysĂ© tous ces cas, envoyant des utilisateurs au hasard vers p2p ou via MSK, collectĂ© des statistiques et construit des prĂ©dictions. Nous savons que les statistiques doivent ĂȘtre mises Ă jour, donc pour certains utilisateurs, nous Ă©tablissons spĂ©cialement diffĂ©rentes connexions pour vĂ©rifier si quelque chose a changĂ© dans les rĂ©seaux.
Nous avons mesuré des caractéristiques aussi simples que le temps d'arrondi, la perte de paquets, la bande passante - il reste à apprendre à les comparer correctement.

Comment comprendre ce qui est le mieux: Internet à 2 Mbit / s, RTT 400 ms et perte de paquets de 5% ou 100 Kbit / s, délai de 100 ms et perte de paquets insuffisante?
Il n'y a pas de réponse exacte, l'évaluation de la qualité des appels vidéo est trÚs subjective. Par conséquent, aprÚs la fin de l'appel, nous avons demandé aux utilisateurs d'évaluer la qualité des astérisques et de définir les constantes en fonction des résultats. Il s'est avéré que, par exemple, RTT est inférieur à 300 ms - cela n'a plus d'importance, le débit binaire est plus important.
Notes d'utilisateurs plus élevées sur Android et iOS. On voit que les utilisateurs iOS sont plus susceptibles de mettre une unité et plus souvent cinq. Je ne sais pas pourquoi, probablement, les spécificités de la plateforme. Mais nous avons tiré les constantes le long de celles-ci, de sorte que nous avions, comme il nous semble, du bien.
Revenons à notre aperçu de l'article, nous discutons toujours du réseau.
Ă quoi ressemble la configuration de la connexion?
Nous envoyons des serveurs STUN et TURN à PeerConnection (), une connexion est établie. Alice découvre son IP, l'envoie à la signalisation; Bob apprend l'IP d'Alice. Alice obtient l'IP de Bob. Ils échangent des paquets, peuvent traverser le NAT, définir TURN et communiquer.

Dans les 5 Ă©tapes de l'Ă©tablissement de la connexion dont nous avons discutĂ© prĂ©cĂ©demment, nous avons dĂ©terminĂ© les serveurs, dĂ©terminĂ© oĂč les obtenir et les candidats ICE sont des adresses IP externes que nous Ă©changeons via la signalisation. Les adresses IP internes des clients, si elles se trouvent dans la plage d'un rĂ©seau Wi-Fi, peuvent Ă©galement ĂȘtre tentĂ©es de percer.
Passons à la partie de la vidéo.
Vidéo et audio
WebRTC prend en charge un certain ensemble de codecs vidéo et audio, mais vous pouvez y ajouter votre propre codec. Fondamentalement pris en charge par
H.264 et VP8 pour la vidéo . VP8 est un codec logiciel, il consomme donc beaucoup de batterie. H.264 n'est pas disponible sur tous les appareils (il est généralement natif), la priorité par défaut est donc sur VP8.
Ă l'intĂ©rieur du SDP (Session Description Protocol), il y a nĂ©gociation de codec: lorsqu'un client envoie une liste de ses codecs, l'autre envoie la sienne en prioritĂ©, et ils conviennent des codecs Ă utiliser pour la communication. Si vous le souhaitez, vous pouvez modifier la prioritĂ© des codecs VP8 et H.264, et pour cette raison, vous pouvez Ă©conomiser la batterie sur certains appareils, oĂč 264 est natif. Voici
un exemple de la façon dont cela peut ĂȘtre fait. Nous l'avons fait, il nous a semblĂ© que les utilisateurs ne se plaignaient pas de la qualitĂ©, mais en mĂȘme temps la charge de la batterie Ă©tait beaucoup moins consommĂ©e.
Pour l'audio, WebRTC a
OPUS ou G711 , gĂ©nĂ©ralement tous les OPUS fonctionnent toujours, rien n'a besoin d'ĂȘtre fait avec.
Voici les mesures de température aprÚs 10 minutes d'utilisation.

Il est clair que nous avons testé différents appareils. Ceci est un exemple d'iPhone, et sur celui-ci, l'application OK utilise le moins la batterie, car la température de l'appareil est la moins élevée.
La deuxiĂšme chose que vous pouvez activer si vous utilisez WebRTC est de
désactiver automatiquement la vidéo lorsque la connexion est trÚs mauvaise .

Si vous avez moins de 40 Kbps, la vidĂ©o se dĂ©sactivera. Il vous suffit de cocher la case lors de la crĂ©ation de la connexion, la valeur seuil peut ĂȘtre configurĂ©e via l'interface. Vous pouvez Ă©galement dĂ©finir le dĂ©bit binaire de dĂ©marrage minimal et maximal.

C'est une chose trĂšs utile. Si lorsque vous Ă©tablissez une connexion, vous savez Ă l'avance le dĂ©bit que vous attendez, vous pouvez le transfĂ©rer, l'appel commencera Ă partir de celui-ci et vous n'aurez pas besoin d'adapter le dĂ©bit. De plus, si vous savez que vous avez souvent des pertes de paquets ou des baisses de bande passante sur votre canal, la valeur maximale peut Ă©galement ĂȘtre limitĂ©e.
WhatsApp fonctionne avec des vidéos trÚs savonneuses, mais avec de petits retards, car il comprime agressivement le débit binaire d'en haut.
Nous avons collecté des statistiques à l'aide de MaxMind et l'avons cartographié.

Il s'agit d'une qualité de départ approximative que nous utilisons pour les appels dans différentes régions de la Russie.
Signalisation
Vous devrez trÚs probablement écrire cette partie si vous souhaitez passer des appels. Il y a toutes sortes d'embûches. Rappelez-vous à quoi ça ressemble.

Il existe une application avec signalisation qui se connecte et échange avec SDP, et le SDP ci-dessous est l'interface avec WebRTC.
Voici Ă quoi ressemble une signalisation simple:

Alice appelle Bob. Il se connecte, par exemple, via une connexion Web-socket. Bob reçoit une poussĂ©e sur son tĂ©lĂ©phone portable ou son navigateur, ou dans une sorte de connexion ouverte, se connecte via une prise Web et aprĂšs cela, le tĂ©lĂ©phone commence Ă sonner dans sa poche. Bob dĂ©croche le tĂ©lĂ©phone, Alice lui envoie ses codecs et autres fonctionnalitĂ©s WebRTC qu'elle prend en charge. Bob lui rĂ©pond de la mĂȘme façon, et aprĂšs cela, ils Ă©changent les candidats qu'ils ont vus. Hourra, appelle!
Tout semble assez long. Tout dâabord, tant que vous nâĂ©tablissez pas de connexion Web, jusquâĂ ce que la poussĂ©e arrive et tout le reste, le tĂ©lĂ©phone de Bob ne sonne pas dans sa poche. Alice attendra tout le temps, pensera oĂč est Bob, pourquoi il ne dĂ©croche pas le tĂ©lĂ©phone. AprĂšs confirmation, tout cela prend quelques secondes, et mĂȘme sur de bonnes connexions, il peut ĂȘtre de 3 Ă 5 secondes, et sur de mauvaises connexions, les 10.
Nous devons y faire quelque chose! Vous me direz que tout peut ĂȘtre fait trĂšs simplement.

Si vous avez déjà une connexion ouverte pour votre application, vous pouvez immédiatement envoyer un push pour établir une connexion, vous connecter au serveur de signalisation souhaité et commencer immédiatement à passer des appels.
Puis une autre optimisation. MĂȘme si le tĂ©lĂ©phone sonne toujours dans votre poche et que vous ne l'avez pas dĂ©crochĂ©, vous pouvez en fait Ă©changer des informations sur les codecs pris en charge, les adresses IP externes, commencer Ă envoyer des paquets vidĂ©o vides et, en gĂ©nĂ©ral, tout sera rĂ©chauffĂ©. Une fois que vous aurez dĂ©crochĂ© le tĂ©lĂ©phone, tout ira bien.
Nous l'avons fait, et il semblait que tout était cool. Mais non.

Le premier problÚme est que les utilisateurs annulent souvent l'appel. Ils cliquent sur «Appeler» et annulent immédiatement. En conséquence, la poussée va à l'appel et l'utilisateur disparaßt (il a perdu Internet ou autre chose). Pendant ce temps, le téléphone de quelqu'un sonne, il décroche et on ne l'attend pas là -bas. Par conséquent, notre optimisation primitive afin de commencer à appeler le plus rapidement possible ne fonctionne pas vraiment.

Avec une annulation d'appel rapide, il y a une deuxiÚme chose nuisible. Si vous générez l'ID de votre conversation sur le serveur, vous devez attendre une réponse. C'est-à -dire que vous créez un appel, obtenez un ID et seulement aprÚs cela, vous pouvez faire ce que vous voulez: envoyer des paquets, échanger, y compris annuler l'appel. C'est une trÚs mauvaise histoire, car il s'avÚre que tant que la réponse n'est pas arrivée, vous ne pouvez en fait rien annuler du client. Par conséquent, il est préférable de générer une sorte d'ID sur le client tel qu'un GUID et de dire que vous avez démarré l'appel. Les gens font souvent cela: ils ont appelé, annulé et rappelé immédiatement. Pour éviter que cela ne soit gùché, faites un GUID et soumettez-le.

Cela ne semble rien, mais il y a un autre problÚme. Si Bob a deux téléphones, ou ailleurs, le navigateur reste ouvert, alors tout notre schéma magique pour échanger des paquets, établir une connexion ne fonctionne pas s'il a soudainement répondu à partir d'un autre appareil.
Que faire? Revenons à notre schéma de base de signalisation lente simple et optimisons-le, envoyons le push un peu plus tÎt. L'utilisateur commencera à se connecter plus rapidement, mais cela économisera quelques sous.

Que faire de la partie la plus longue aprÚs avoir décroché le téléphone et commencé l'échange?

Vous pouvez effectuer les opĂ©rations suivantes. Il est clair quâAlice connaĂźt dĂ©jĂ tous ses codecs et peut les envoyer aux deux tĂ©lĂ©phones de Bob. Elle peut rĂ©soudre toutes ses adresses IP et Ă©galement les envoyer Ă la signalisation, ce qui les gardera dans sa file d'attente, mais n'enverra Ă aucun des clients afin qu'ils commencent Ă Ă©tablir une connexion avec elle Ă l'avance.
Que peut faire Bob? offer, , , , , , . , codec negotiation, signaling , , . Candidates signaling.
, signaling . , , .
. Google Duo WhatsApp.

, - . , signaling, , , , , , . .
?
: , . , , â signaling , , - , , , .

, , , . . , , , , . , .
, 24/7, -, .

web-socket - load balancer, signaling- -, . Zookeeper Leader Election, signaling, conversation. conversation, .
,
NewSQL Cassandra . , . , signaling, , signaling, - , Leader Election Zookeeper, , , .
:
- - , , IP signaling
- Signaling , .
- , , , , .
- .
, .
Cassandra, (
).
, :- iceServers ;
- Session Description Protocol;
- ;
- signaling WebRTC , IP ;
- !
:Ouah!

Security. Man in the middle attack for WebRTC
man in the middle attack for WebRTC. , WebRTC , RTP, 1996 , SDP 1998 SIP.

â RFC RTP, RTP WebRTC.
RFC â audio level, , audio level , . , SDP, , . congestion, -.
WebRTC . 2011 , 2013 Firefox, iOS/Android, 2014 Opera. , - , .

signaling, , DTLS Handshake . , signaling, «» , , , .

, , , HTTPS, WSS .. â ZRTP, , , Telegram.
Telegram , , . , , , , p2p .
Comment ça marche?

â . , , . . K, , , .
, , K
1 K
2 . . . K
1 K
2 , . K
1 K
2 : , â , â , . , , - , , .
- «» NAT type symmetric NAT.
- , : 2 relay, , CDN; .
- , .
- signaling.

, RTMFP, , WebRTC, , . ! 4 .
, :
, .
HighLoad++ 4-.
, . , 19 (10 9 -) , - . , , .