Les premiÚres émissions en direct de la scÚne sont apparues en Russie il y a prÚs de 70 ans et ont été diffusées à partir d'une station de télévision mobile (PTS), qui ressemblait à un trolleybus et permettait de diffuser depuis l'extérieur du studio. Et il y a seulement trois ans, Periscope a autorisé l'utilisation d'un téléphone mobile au lieu d'un «trolleybus».
Mais cette application présentait un certain nombre de problÚmes liés, par exemple, aux retards de diffusion, à l'incapacité de regarder des émissions en haute qualité, etc.

Six mois plus tard, à l'été 2016, Odnoklassniki a lancé son application mobile de streaming OK Live, dans laquelle ils ont essayé de résoudre ces problÚmes.
Alexander Tobol est responsable de la partie technique de la vidĂ©o Ă Odnoklassniki et Ă Highload ++ 2017, il a expliquĂ© comment Ă©crire votre protocole UDP et pourquoi cela pourrait ĂȘtre nĂ©cessaire.
à partir de la transcription de son rapport, vous apprendrez tout sur les autres protocoles de streaming vidéo, quelles sont les nuances et quelles astuces sont parfois nécessaires.
Ils disent que nous devrions toujours commencer par l'architecture et les savoirs traditionnels - c'est soi-disant impossible sans cela! Alors faisons-le.
Architecture et savoirs traditionnels
Sur la diapositive ci-dessous se trouve le schéma d'architecture de tout service de streaming: la
vidĂ©o est envoyĂ©e Ă l'entrĂ©e, convertie et transmise Ă la sortie . Nous avons ajoutĂ© un peu plus d'exigences Ă cette architecture: la vidĂ©o doit ĂȘtre fournie par les ordinateurs de bureau et les tĂ©lĂ©phones mobiles, et la sortie doit aller aux mĂȘmes ordinateurs de bureau, tĂ©lĂ©phones mobiles, smartTV, Chromcast, AppleTV et autres appareils - tout ce que la vidĂ©o peut ĂȘtre lu.

Ensuite, nous passons au mandat. Si vous avez un client, vous avez des savoirs traditionnels. Si vous ĂȘtes un rĂ©seau social, vous n'avez pas de savoirs traditionnels. Comment le maquiller?
Vous pouvez bien sûr interroger les utilisateurs et découvrir tout ce qu'ils veulent. Mais ce sera tout un tas de désirs qui ne correspondent pas à ce dont les gens ont vraiment besoin.
Nous avons décidé d'aller dans le sens inverse et avons vu ce que les utilisateurs ne voulaient PAS voir du service de diffusion.
- La premiÚre chose que l'utilisateur ne veut pas est de voir le retard au début de la diffusion .
- L'utilisateur ne souhaite pas voir une image de flux de faible qualité .
- Si la diffusion est interactive lorsque l'utilisateur communique avec son public (retransmissions en direct, appels, etc.), il ne veut pas voir le délai entre le streamer et le spectateur .
Voici Ă quoi ressemble un service de streaming normal. Voyons ce qui peut ĂȘtre fait pour faire un service de streaming rĂ©gulier au lieu de celui habituel.

Vous pouvez commencer par regarder tous les protocoles de streaming, sélectionner les plus intéressants et les comparer. Mais nous l'avons fait différemment.
Qu'ont les concurrents?
Nous avons commencé par explorer les services aux concurrents.
Open Periscope - qu'est-ce qu'ils ont?Comme toujours, l'essentiel est l'architecture.

Sara Hyder, l'ingénieur principal de Periscope, écrit qu'ils utilisent Wowza pour le backend. Si nous lisons un peu plus d'articles, nous verrons ce qu'ils diffusent en utilisant le protocole
RTMP et le distribuerons soit en RTMP soit en HLS. Voyons ce que sont ces protocoles et comment ils fonctionnent.
Nous testons Periscope sur nos trois exigences principales.

Ils ont une
vitesse de démarrage acceptable (moins d'une seconde sur de bons réseaux), une
qualité constante
d' environ 600 px (pas HD), et en mĂȘme temps des
retards pouvant aller jusqu'Ă 12 secondes .
Au fait, comment mesurer le retard dans la diffusion?

Il s'agit d'une photographie d'une mesure de retard. Il y a un téléphone portable avec une minuterie. Nous activons la diffusion et voyons l'image de ce téléphone sur l'écran. Pendant 0,15 milliseconde, l'image est tombée sur le capteur de l'appareil photo et a été supprimée de la mémoire vidéo sur l'écran du téléphone. AprÚs cela, nous activons le navigateur et regardons la diffusion.
AĂŻe! Elle est un peu en retard - environ 12 secondes.
Pour trouver les raisons du retard, nous profilons le streaming vidéo.

Donc, il y a un tĂ©lĂ©phone portable, la vidĂ©o sort de la camĂ©ra et entre dans le buffer vidĂ©o. Ici, les retards sont minimes (â0,15 ms). Ensuite, l'encodeur code le signal, l'emballe dans un paquet et l'envoie au tampon de socket. Tout vole sur le Web. De plus, la mĂȘme chose se produit sur l'appareil rĂ©cepteur.
Fondamentalement, il y a deux principaux points difficiles à considérer:
- encodage / décodage vidéo;
- protocoles réseau .
Encodage / décodage vidéo
Je vais parler un peu du codage. Vous le rencontrerez de toute façon si vous effectuez un streaming en direct à faible latence.

Qu'est-ce qu'une vidéo? Il s'agit d'un ensemble de cadres, mais pas tout à fait simple. Les cadres sont de trois types: cadres I, P et B:
- I-frame est juste jpg. En fait, c'est un cadre de référence, il ne dépend de personne et contient une image claire.
- La trame P dépend uniquement des trames précédentes.
- La trame B dĂ©licate peut dĂ©pendre de l'avenir. Cela signifie que pour calculer l'image b, il est nĂ©cessaire que les images futures proviennent Ă©galement de la camĂ©ra. Ce n'est qu'alors qu'une trame b peut ĂȘtre dĂ©codĂ©e avec un certain retard.
Cela montre que les
trames B sont nuisibles . Essayons de les supprimer.
- Si vous diffusez à partir d'un appareil mobile, vous pouvez essayer d'activer le profil de base . Cela désactivera le cadre B.
- Vous pouvez essayer de configurer le codec et de réduire le délai pour les futures trames afin que les trames arrivent plus rapidement.
- Une autre chose importante dans le réglage du codec est l' inclusion de CBR (débit binaire constant).

Le fonctionnement des codecs est illustré dans la diapositive ci-dessus. Dans cet exemple, la vidéo est une image statique, son encodage économise de l'espace disque, car presque rien n'y change et le débit vidéo est faible. Des changements sont en cours - l'entropie augmente, le débit vidéo augmente - c'est génial de stocker sur le disque.
Mais au moment oĂč les changements actifs ont commencĂ© et que le dĂ©bit binaire a augmentĂ©, toutes les donnĂ©es ne se glisseraient probablement pas dans le rĂ©seau. C'est exactement ce qui se passe lorsque vous passez un appel vidĂ©o et commencez Ă tourner, et votre abonnĂ© ralentit l'image. Cela est dĂ» au fait que le rĂ©seau n'a pas le temps de s'adapter Ă l'Ă©volution du dĂ©bit binaire.
Il faut inclure CBR . Tous les codecs Android ne le prendront pas correctement en charge, mais ils s'efforceront de le faire. Autrement dit, vous devez comprendre qu'avec CBR, vous n'obtiendrez pas l'image parfaite du monde, comme dans l'image du bas, mais cela vaut la peine de l'activer.
4. Et sur le backend, vous devez ajouter le codec de
zérolatence à H264 - cela vous permettra de ne pas faire de dépendances dans les frames pour le futur.
Protocoles de transfert vidéo
Tenez compte des protocoles de streaming proposés par l'industrie. Je les ai conditionnellement divisés en deux types:
- protocoles de streaming;
- protocoles de segment.
Les protocoles de streaming sont des protocoles issus du monde des appels p2p:
RTMP, webRTC, RTSP / RTP . Ils diffÚrent en ce que les utilisateurs conviennent du canal dont ils disposent, sélectionnez le débit binaire du codec en fonction du canal. Et ils ont aussi des équipes supplémentaires de ce genre, comme «donnez-moi un coup de référence». Si vous avez perdu une trame, dans ces protocoles, vous pouvez la demander à nouveau.
La différence entre les
protocoles de segment est que personne ne négocie avec personne. Ils coupent la vidéo en segments, stockent chaque segment dans différentes qualités, et le client peut choisir le segment à regarder. Chaque segment commence par un cadre de référence.
Examinez les protocoles plus en détail. Commençons par les protocoles de streaming et voyons quels problÚmes nous pouvons rencontrer si nous utilisons des protocoles de streaming pour le streaming de diffusion.
Protocoles de streaming
Periscope utilise RTMP. Ce protocole est apparu en 2009, et au début Adobe ne l'a pas entiÚrement spécifié. Il a ensuite eu une certaine difficulté avec le fait qu'Adobe voulait vendre exclusivement son serveur. Autrement dit, RTMP développé assez difficile. Son principal problÚme est
qu'il utilise TCP , mais pour une raison quelconque, Periscope l'a choisi.

Si vous lisez en détail, il s'avÚre que Periscope utilise RTMP pour diffuser avec un petit nombre de téléspectateurs. De telles émissions, si votre chaßne est insuffisante, vous ne pourrez probablement pas la regarder.

Prenons un exemple spĂ©cifique. Il y a un utilisateur avec un canal de communication Ă©troit qui regarde votre Ă©mission. Vous ĂȘtes d'accord avec lui sur RTMP sur le faible dĂ©bit binaire et commencez Ă diffuser pour lui personnellement.
Un utilisateur avec un internet cool vient à vous, vous avez aussi un internet cool, mais vous avez déjà convenu d'une mauvaise qualité avec quelqu'un, et il s'avÚre que ce troisiÚme avec internet cool regarde un flux de mauvaise qualité, malgré le fait qu'il puisse bien paraßtre.
Nous avons dĂ©cidĂ© de rĂ©soudre ce problĂšme. Nous avons permis Ă RTMP d'ĂȘtre tronquĂ© individuellement pour chaque client, c'est-Ă -dire que les streamers nĂ©gocient avec le serveur, diffusent Ă la qualitĂ© la plus Ă©levĂ©e possible et chaque client reçoit la qualitĂ© que le rĂ©seau lui permet.
Ouah!
Mais encore, nous avons RTMP sur TCP, et personne ne nous a assuré de bloquer le début de la file d'attente.

Ceci est illustrĂ© dans la figure: nous recevons des trames audio et vidĂ©o, RTMP les emballe, peut-ĂȘtre les mĂ©langent-ils d'une maniĂšre ou d'une autre et s'envolent vers le rĂ©seau.
Mais supposons que nous perdions un paquet. Il est possible que le mĂȘme paquet jaune perdu - il s'agit gĂ©nĂ©ralement d'une trame P de certains prĂ©cĂ©dents - ait pu ĂȘtre supprimĂ©. Peut-ĂȘtre, au minimum, on pourrait lire de l'audio. Mais TCP ne nous donnera pas le reste des paquets, car il
garantit la livraison et la séquence des paquets . Nous devons en quelque sorte y faire face.

Il y a un autre problĂšme avec l'utilisation du protocole TCP en streaming.
Disons que nous avons un tampon et une bande passante rĂ©seau Ă©levĂ©e. Nous y gĂ©nĂ©rons des paquets haute rĂ©solution Ă partir de notre codec. Alors - op! - le rĂ©seau a commencĂ© Ă mal fonctionner. Au niveau du codec, nous avons dĂ©jĂ indiquĂ© que le dĂ©bit doit ĂȘtre abaissĂ©, mais des paquets prĂȘts Ă l'emploi sont dĂ©jĂ dans la file d'attente et
vous ne pouvez en aucun cas les supprimer de là . TCP est désespéré de pousser les paquets HD à travers notre 3G.
Nous n'avons pas de gestion de tampon, pas de priorisation, donc
TCP est extrĂȘmement inappropriĂ© pour la diffusion en continu .

Jetons maintenant un Ćil aux rĂ©seaux mobiles. Cela peut ĂȘtre surprenant pour les rĂ©sidents des capitales, mais notre rĂ©seau mobile moyen ressemble Ă ceci:
- 1,1 Mbps de trafic;
- Perte de paquets de 0,1%;
- RTT moyen de 300 ms.
Et si vous regardez certaines régions et certains opérateurs spécifiques, ils ont un
pourcentage de perte de paquets quotidien moyen de plus de 3% , et le RTT Ă partir de 600 ms est normal.
TCP est, d'une part, un protocole génial - il est trÚs difficile d'apprendre à une voiture à conduire tout de suite sur les autoroutes et hors route. Mais lui apprendre alors aussi à survoler les réseaux sans fil était trÚs difficile.

Perdre mĂȘme 0,001% des paquets entraĂźne une rĂ©duction de 30% du dĂ©bit. Autrement dit, notre utilisateur n'utilise pas le canal de 30% en raison de l'inefficacitĂ© du protocole TCP dans les rĂ©seaux avec perte de paquets alĂ©atoire.
Dans certaines régions, la perte de paquets atteint 1%, puis l'utilisateur dispose d'environ 10% de la bande passante.
Par conséquent,
nous ne ferons pas TCP .
Voyons ce qu'il y a d'autre dans le monde du streaming depuis UDP.
Le protocole WebRTC a trÚs bien fonctionné pour les appels p2p. Sur des sites trÚs populaires, ils écrivent que l'utiliser pour les appels est trÚs cool, mais pour diffuser des vidéos et de la musique, ce n'est pas bon.
Son principal problĂšme est qu'il
néglige les pertes . Avec toutes les situations étranges, il tombe juste.
Il y a toujours un problĂšme dans son attachement aux appels, le fait est qu'il crypte tout. Par consĂ©quent, si vous diffusez des Ă©missions, et qu'il n'est pas nĂ©cessaire de crypter l'intĂ©gralitĂ© du flux audio / vidĂ©o en dĂ©marrant WebRTC, vous aurez quand mĂȘme une tension sur votre processeur. Vous n'en aurez peut-ĂȘtre pas besoin.
Le streaming RTP est le protocole de base pour la transmission de donnĂ©es via UDP. Ci-dessous sur la diapositive Ă droite se trouve un ensemble d'extensions et de RFC qui ont dĂ» ĂȘtre implĂ©mentĂ©es dans WebRTC afin d'adapter ce protocole pour les appels. En principe, vous pouvez essayer de faire quelque chose comme ça - composer un ensemble d'extensions Ă RTP et obtenir le streaming UDP.
Mais c'est trĂšs difficile .
Le deuxiĂšme problĂšme est que si l'un de vos clients ne prend en charge aucune extension, le protocole ne fonctionnera pas.

Protocoles de segment
MPEG-Dash est un bon exemple de protocole vidéo segmenté. Il se compose d'un fichier manifeste que vous publiez sur votre portail. Il contient des liens vers des fichiers de différentes qualités, au début du fichier, il y a un index qui indique à quel endroit du fichier quel segment commence.

La vidéo entiÚre est divisée en segments, par exemple, pendant 3 secondes, chaque segment commence par une image de référence. Si vous regardez une telle vidéo et que votre débit change, alors du cÎté client, vous commencez à prendre le segment de la qualité dont vous avez besoin.
Un autre exemple de streaming segmenté est
HLS .
MPEG-Dash est une solution de Google, elle fonctionne bien sous Android, et la solution Apple est plus ancienne, elle présente un certain nombre d'inconvénients.

Le premier d'entre eux est que le manifeste principal contient des liens vers des manifestes secondaires, les manifestes secondaires pour chaque qualité spécifique contiennent des liens vers chaque segment individuel, et chaque segment individuel est représenté par un fichier distinct.
Si vous regardez encore plus en détail, alors à l'intérieur de chaque segment se trouve MPEG2-TS. Ce protocole a également été conçu pour le satellite; sa taille de paquet est de
188 octets . Il est trĂšs gĂȘnant dâemballer des vidĂ©os de cette taille, en particulier parce que vous les fournissez tout le temps avec un petit en-tĂȘte.
En fait, cela est difficile non seulement pour les serveurs qui, pour traiter 40 Go de trafic, doivent collecter
26 millions de paquets , mais cela est Ă©galement difficile pour le client. Par consĂ©quent, lorsque nous avons réécrit le lecteur iOS sur MPEG-Dash, nous avons mĂȘme constatĂ© des gains de performances.

Mais Apple ne reste pas immobile. En 2016, ils ont finalement annoncé qu'ils avaient la possibilité de pousser un fragment de MPEG4 dans HLS. Ensuite, ils ont promis de l'ajouter uniquement aux développeurs, mais il semble que le support de macOS et iOS devrait maintenant apparaßtre.
Autrement dit, il semblerait que le streaming de fragments soit pratique - venez, prenez le fragment souhaité, commencez par le cadre de référence - cela fonctionne.
Moins: il est clair que le cadre de référence à partir duquel vous avez commencé n'est pas le cadre que celui qui diffuse maintenant le possÚde. Par conséquent,
il y a toujours un retard .
En général, il est possible de terminer HLS à des retards de l'ordre de 5 secondes, quelqu'un dit qu'il a réussi à en obtenir 4, mais en principe, la
décision d'utiliser le streaming de fragments pour la traduction n'est pas trÚs bonne .

Difficulté vs retard
Examinons tous les protocoles disponibles et trions-les selon deux paramĂštres:
- la latence qu'ils donnent entre l'émission et le spectateur;
- complexité
Plus le délai garanti par le protocole est court, plus il est complexe.

Que voulons-nous?
Nous voulons faire un protocole UDP pour le streaming de 1 à N avec un retard comparable à la communication p2p, avec l'option de cryptage optionnel des paquets selon qu'il s'agit d'une diffusion privée ou publique.
Quelles sont les autres options? Vous pouvez attendre, par exemple, lorsque Google publie son QUIC.
Je vais vous dire un peu ce que c'est. Google positionne Google QUIC en remplacement de TCP - une sorte de TCP 2.0. Il a été développé depuis 2013, maintenant il n'a pas de spécification, mais il est entiÚrement disponible dans Google Chrome, et il me semble qu'ils l'activent parfois pour certains utilisateurs afin de voir comment cela fonctionne. En principe, vous pouvez accéder aux paramÚtres, activer QUIC, accéder à n'importe quel site Google et obtenir cette ressource via UDP.
Nous avons décidé de ne pas attendre qu'ils le précisent tous et de déposer notre décision.
Exigences du protocole:
- Le multithreading , c'est-à -dire que nous avons plusieurs flux - contrÎle, vidéo, audio.
- Une garantie de livraison facultative - le flux de contrÎle est garanti à 100%, la vidéo dont nous avons le moins besoin - nous pouvons y déposer l'image, nous aimerions toujours l'audio.
- Hiérarchisation des flux - pour que l'audio avance, et le gestionnaire a généralement volé.
- Cryptage optionnel : soit toutes les donnĂ©es, soit uniquement les en-tĂȘtes et les donnĂ©es critiques.

Il s'agit d'un triangle standard: si un bon réseau, alors haute qualité et faible latence. DÚs qu'un réseau instable apparaßt, les paquets commencent à disparaßtre, on équilibre entre qualité et délai. Nous avons le choix: soit attendre que le réseau s'améliore et envoyer tout ce qui s'est accumulé, soit abandonner et vivre avec.
Si vous triez les protocoles selon ce principe, il est clair que
plus le temps d'attente est court, plus la qualité est mauvaise - une conclusion assez simple.
Nous voulons coincer notre protocole dans la zone oĂč les retards sont proches de WebRTC, mais en mĂȘme temps pouvoir pousser un peu, car aprĂšs tout nous n'avons pas d'appels, mais des Ă©missions. L'utilisateur souhaite finalement recevoir un flux de qualitĂ©.
Développement
Commençons à écrire le protocole UDP, mais regardons d'abord les statistiques.

Ce sont nos statistiques sur les réseaux mobiles. On peut voir que l'Internet moyen est légÚrement plus que mégabits, une perte de paquets d'environ 1% est normale, et RTT dans la région de 600 ms - sur 3G, ce ne sont que des valeurs moyennes.
Nous nous concentrerons sur cela lors de la rédaction du protocole - allons-y!
Protocole UDP
On ouvre le socket UDP, on retire les données, on emballe, on envoie. Nous prenons le deuxiÚme pack du codec, nous envoyons toujours. Tout semble super!

Mais nous obtenons l'image suivante: si nous commençons Ă envoyer au hasard des paquets UDP Ă la socket, selon les statistiques, au 21e paquet, la probabilitĂ© qu'il atteindra ne sera que de 85%. Autrement dit, la perte de paquets sera dĂ©jĂ de 15%, ce qui n'est pas bon. Cela doit ĂȘtre corrigĂ©.

Ceci est fixé en standard. L'illustration illustre la vie sans Pacer et la vie avec
Pacer .
Pacer est une chose qui répartit les paquets dans le temps et contrÎle leur perte; Il regarde ce qu'est la perte de paquets maintenant, en fonction de cela, il s'adapte à la vitesse du canal.
Comme nous nous en souvenons, pour les réseaux mobiles, la perte de paquets de 1 à 3% est la norme. En conséquence, nous devons en quelque sorte travailler avec cela. Et si nous perdons des colis?
Retransmettre

En TCP, comme vous le savez, il existe un algorithme de retransmission rapide: nous envoyons un paquet, le second, si le paquet est perdu, puis aprĂšs un certain temps (pĂ©riode de retransmission), nous envoyons le mĂȘme paquet.
Quels en sont les avantages? Pas de problĂšmes, pas de redondance, mais il y a un moins - une certaine
période de retransmission .

Cela semble trĂšs simple: aprĂšs un certain temps, vous devez rĂ©pĂ©ter le colis si vous n'avez pas reçu de confirmation Ă ce sujet. Logiquement, cela peut ĂȘtre un temps Ă©gal au temps de ping. ping â , RTT time , , .
, , , , jitter: ping-. , , 46 . jitter â 50.

. RTT , , acknowledge . , RFC6298, TCP , .
jitter. jitter ping 15%. , retransmit period , , 20% , RTT.

retransmit. acknowledge . , , . retransmit period, . , .
, retransmit . , , packet loss 5%, 400 , 400 1 packet-drop, , retransmit period , .
, . , , acknowledge . , â , , speculative retransmit .
retransmit, .
. ,
Forward Error Correction ? , , XOR. , , .

Ouah! round trip, .
, , ? XOR â , Reed-Solomon, Fountain codes .. : K , N , N .
!
, , , Forward Error Correction negative acknowledgement.
NACK

, parity protection ( ) , .
NACK:
- , negative acknowledgement, .
- FEC.
, :
- , FEC + NACK;
- , Fast retransmit.
, .

, , ( ). , , 11 , 60-80 . , , .
6 .

, , . , . , Wi-Fi 22 5 , 3G 34 8 .

: , 90% packet loss 10 , gap 25 , â FEC + NACK Fast retransmit?
, , , Google, QUIC 2013 , Forward Error Correction , , . 2015 .
FEC + NACK, .
, .

, , c :
- 1 / ;
- 1% packet loss;
- 300 RTT;
- 1 000 â ;
- 1 000 .
10 . packet loss 1% 1 000 10. â 100 1 â , 2 , .
, . 500- , 10 .
:
- 500 Forward Error Correction. , .
- NACK, , .
- Fast Retransmit, .
Forward Error Correction , â gap 200-300 .
Fast Retransmit
: , 10 , , , retransmit period , .

, retransmit period 350 , packet gap â 25-30 , 100. , , retransmit , .
, .
Lorsque vous écrivez votre protocole sur UDP et que vous avez la possibilité d'envoyer des paquets, vous obtenez des chignons supplémentaires.
Il y a un tampon d'envoi, il contient une trame de référence, des trames p / b. Ils vont réguliÚrement en ligne. Ensuite, ils ont cessé d'aller sur le réseau, et à leur tour, d'autres paquets sont arrivés.Vous comprenez qu'en fait, tous les packages qui sont dans la file d'attente ne sont plus intéressants pour le client, car, par exemple, plus de 0,5 s se sont écoulés et il vous suffit de coller l'écart sur le client et de continuer à vivre.Vous pouvez, ayant des informations sur ce qui est stocké dans ces packages, nettoyer non seulement le cadre de référence, mais aussi tous les p / b qui en dépendent, et ne laisser que les données nécessaires et complÚtes dont le client peut alors avoir besoin.MTU
Puisque nous Ă©crivons le protocole nous-mĂȘmes, nous devrons faire face Ă la fragmentation IP. Je pense que beaucoup de gens le savent, mais juste au cas oĂč, je vous le dirai briĂšvement.

Nous avons un serveur, il envoie des paquets au réseau, ils arrivent au routeur et à son niveau le MTU (unité de transmission maximale) devient inférieur à la taille du paquet qui est arrivé. Il divise le paquet en grand et petit (ici 1100 et 400 octets) et envoie.
En principe, il n'y a pas de problĂšme, tout se rassemblera sur le client et fonctionnera. Mais si nous perdons 1 paquet, nous supprimons tous les paquets, et nous obtenons des coĂ»ts supplĂ©mentaires pour les en-tĂȘtes de paquets. Par consĂ©quent, si vous Ă©crivez votre protocole, il est idĂ©al de travailler avec la quantitĂ© de MTU.
Comment le compter?En fait, Google ne dérange pas, met environ 1200 octets dans son QUIC et ne le sélectionne pas, car alors la fragmentation IP collectera tous les paquets.

Nous faisons exactement la mĂȘme chose - d'abord nous dĂ©finissons une taille par dĂ©faut et commençons Ă envoyer des paquets - laissez-les les fragmenter.
En parallÚle, exécutez un thread séparé et créez un socket avec l'indicateur d'interdiction de fragmentation pour tous les paquets. Si le routeur rencontre un tel paquet et ne peut pas fragmenter ces données, il abandonnera le paquet et vous enverra éventuellement via ICMP qu'il y a des problÚmes, mais trÚs probablement, ICMP sera fermé et cela ne se produira pas. Par conséquent, nous essayons simplement, par exemple, trois fois d'envoyer un paquet d'une certaine taille à un certain intervalle. S'il n'atteint pas, nous pensons que le MTU est dépassé et le réduisons encore.
Ainsi, ayant le MTU de l'interface Internet qui se trouve sur l'appareil et un minimum de MTU, nous sélectionnons simplement le MTU correct par une recherche unidimensionnelle. AprÚs cela, nous ajustons la taille du paquet dans le protocole.
En fait, cela change parfois. Nous avons Ă©tĂ© surpris, mais en train de changer de Wi-Fi, etc. MTU est en train de changer. Il est prĂ©fĂ©rable de ne pas arrĂȘter ce processus parallĂšle et de corriger MTU de temps en temps.

Distribution MTU plus élevée dans le monde. Nous avons obtenu environ 1100 octets sur le portail.
Cryptage
Nous avons dit que nous voulions Ă©ventuellement gĂ©rer le chiffrement. Nous faisons l'option la plus simple - Diffie-Hellman sur les courbes elliptiques. Nous le faisons facultativement - nous chiffrons uniquement les paquets de contrĂŽle et les en-tĂȘtes afin que l'homme du milieu ne puisse pas recevoir la clĂ© de diffusion, l'intercepter, etc.

Si la diffusion est privée, nous pouvons également ajouter le cryptage de toutes les données.
Les paquets sont chiffrés avec AES-256 indépendamment, de sorte que la suppression de paquets n'affecte pas le chiffrement ultérieur des paquets.
Priorisation
Rappelez-vous, nous voulions plus de priorisation du protocole.

Nous avons des métadonnées, des trames audio et vidéo, nous les envoyons avec succÚs sur le réseau. Ensuite, notre réseau brûle en enfer et pendant longtemps ne fonctionne pas - nous comprenons que nous devons abandonner les paquets.
Nous supprimons principalement les paquets vidéo, puis essayons de supprimer l'audio et de ne jamais toucher aux paquets de contrÎle, car des données telles que les changements de résolution et d'autres problÚmes importants peuvent les traverser.
Chignon supplémentaire sur UDP
Si vous écrivez votre protocole UDP, par exemple, avec une communication bidirectionnelle, vous devez comprendre qu'il existe une dissociation NAT et la possibilité que vous ne puissiez pas retrouver le client à partir du serveur.

Sur la diapositive, il est parfois impossible d'atteindre le client depuis le serveur via UDP.
De nombreux sceptiques affirment que les routeurs sont conçus de telle maniÚre que NAT Unbinding évince principalement les routes UDP. Mais ce qui précÚde montre que si Keep-Alive ou ping est inférieur à 30 secondes, alors avec une probabilité de 99%, il sera possible d'atteindre le client.
Disponibilité UDP sur les appareils mobiles dans le monde

Google indique 6%, mais il s'est avéré que
7% des utilisateurs mobiles ne peuvent pas utiliser UDP . Dans ce cas, nous laissons notre beau protocole avec priorisation, chiffrement et tout, uniquement sur TCP.
Sur UDP, VOIP fonctionne désormais sur WebRTC, Google QUIC et de nombreux jeux fonctionnent sur UDP. Par conséquent, je ne pense pas que UDP sera fermé sur les appareils mobiles.
En conséquence, nous:
- Réduction du délai entre le streamer et l'observateur à 1 s.
- Nous nous sommes débarrassés de l'effet cumulatif dans les tampons, c'est-à -dire que la diffusion n'est pas en retard.
- Le nombre de stands dans le public a diminué .
- Ils ont pu prendre en charge le streaming sur les appareils mobiles FullHD.

- Le délai dans notre application mobile OK Live est de 25 ms à 10 ms plus long que le scanner de la caméra fonctionne, mais ce n'est pas si effrayant.
- La diffusion sur le Web montre un retard de seulement 690 ms - espace!
Quoi d'autre peut diffuser sur Odnoklassniki

- Accepte notre protocole OKMP Ă partir d'appareils mobiles;
- peut accepter RTMP et WebRTC;
- distribue HLS, MPEG-Dash, etc.
Si vous avez fait attention, vous avez remarqué que j'ai dit que nous pouvons prendre, par exemple, WebRTC de l'utilisateur et le convertir en RTMP.

Il y a une nuance. En fait, WebRTC est un protocole orienté paquets et utilise le codec audio OPUS. Vous ne pouvez pas utiliser OPUS dans RTMP.
Sur les serveurs principaux, nous utilisons RTMP partout. Par conséquent, nous avons dû apporter quelques correctifs supplémentaires dans FF MPEG, ce qui nous permet de pousser OPUS en RTMP, de le convertir en AAC et de le donner aux utilisateurs déjà en HLS ou autre chose.
à quoi ça ressemble en nous?

- Les utilisateurs utilisant l'un des protocoles téléchargent la vidéo originale sur notre serveur de téléchargement.
- Là , nous déployons le protocole.
- Nous envoyons RTMP à l'un des serveurs de transformation vidéo.
- L'original est toujours stocké dans un stockage distribué afin que rien ne soit perdu.
- AprÚs cela, toutes les vidéos vont au serveur de distribution.
Pour le fer, nous avons les éléments suivants:

Je vais vous en dire un peu plus sur la tolérance aux pannes:
- Les serveurs de téléchargement sont distribués dans différents centres de données, se tiennent derriÚre différentes IP.
- Les utilisateurs viennent, reçoivent IP sur DNS.
- Upload-server envoie la vidéo aux serveurs de découpage, ils coupent et donnent aux serveurs de distribution.
- Pour les diffusions plus populaires, nous commençons à ajouter un plus grand nombre de serveurs de distribution.
- Nous sauvegardons tout ce qui vient de l'utilisateur dans le référentiel, afin que plus tard, nous puissions créer une archive de diffusion et ne rien perdre.
- Stockage tolérant aux pannes réparti sur trois centres de données.
Pour déterminer quel serveur est actuellement responsable de la traduction, nous utilisons
ZooKeeper . Pour chaque traduction, nous stockons un nĆud et crĂ©ons des nĆuds Ă©phĂ©mĂšres pour chaque serveur. En fait, c'est une telle chose qui permet Ă un flux de crĂ©er une file d'attente de serveurs Ă traiter. Le leader actuel de cette ligne est toujours engagĂ© dans le traitement des flux.
Nous testerons rapidement la tolérance aux pannes. Nous commençons immédiatement par la disparition de l'intégralité du datacenter.
Que va-t-il se passer?- L'utilisateur DNS prendra la prochaine IP d'un autre serveur de téléchargement.
- à ce moment, ZooKeeper comprendra que le serveur de ce centre de données est mort et sélectionnera le serveur de découpage pour un autre.
- Les serveurs de téléchargement sauront qui est désormais responsable de la transformation de ce flux et le distribueront.
En principe, tout cela se produira avec un minimum de retards.
Utilisation du protocole dans le produit
Nous avons créé l'application mobile de streaming OK Live. Il est entiÚrement intégré au portail. Les utilisateurs peuvent communiquer, effectuer des diffusions en direct, il existe une carte des diffusions, une liste des diffusions populaires - en général, tout ce que vous pouvez souhaiter.

Nous avons également ajouté la possibilité de diffuser en FullHD. Vous pouvez connecter une caméra d'action sur Android à un appareil Android.

Nous avons maintenant un mécanisme qui permet des diffusions en direct. Par exemple, nous avons établi une ligne directe avec le président via OK Live et l'avons diffusée
dans tout le pays . Les utilisateurs regardaient et Ă travers le flux venant en sens inverse pouvaient se mettre en ondes et poser leurs questions.
En fait, deux flux entrants avec un délai minimum fournissent un certain format de conférence publique.
En fait, nous nous sommes rencontrés quelque part en 2 secondes - une seconde là -bas et une seconde de retour. Rappelez-vous ce «chariot» dont j'ai parlé au début de l'article - il ressemble maintenant à 2 énormes camions. Pour la diffusion télévisée, retirer de l'appareil photo et simplement tout mélanger avec un retard d'environ 1 à 2 s est tout à fait normal.
En fait, nous avons réussi à reproduire quelque chose de comparable avec le TCP moderne actuel.

Les émissions en direct sont la tendance actuelle. Depuis un an et demi sur le portail OK, ils ont triplé (non sans l'aide de l'application OK Live).

Toutes les émissions sont enregistrées par défaut. Nous avons environ 50 000 flux par jour, ce qui génÚre environ 17 téraoctets de trafic par jour, mais en général, toute la vidéo sur le portail génÚre environ un pétaoctet de données par mois.

Qu'avons-nous obtenu:
- Pourrait garantir la durée du délai entre le streamer et le public.
- Nous avons créé la premiÚre application FullHD mobile pour le streaming sur un canal Internet mobile à évolution dynamique.
- Nous avons eu la possibilitĂ© de perdre des centres de donnĂ©es et en mĂȘme temps de ne pas interrompre la diffusion
Qu'avez-vous appris:
- Qu'est-ce qu'une vidéo et comment la diffuser?
- Que vous pouvez écrire votre protocole UDP si vous savez avec certitude que vous avez une tùche trÚs spécifique et des utilisateurs spécifiques.
- à propos de l'architecture de tout service de streaming - la vidéo entre en entrée, convertit et quitte.
Chez Highload ++ Siberia, Alexander Tobol promet de parler du service d'appel OK, il sera intĂ©ressant de savoir ce qui a rĂ©ussi Ă ĂȘtre appliquĂ© Ă partir de ce qui a Ă©tĂ© discutĂ© dans cet article, et ce qui a dĂ» ĂȘtre mis en Ćuvre complĂštement Ă nouveau.
Dans la mĂȘme section, des rapports sont prĂ©vus sur des sujets hautement spĂ©cialisĂ©s:
- Eugene Rossinsky (ivi) sur le systĂšme de collecte de statistiques dĂ©taillĂ©es sur le fonctionnement des nĆuds CDN.
- Anton Rusakova (Badoo) sur l'intégration des systÚmes de paiement sans utiliser leur propre facturation.