Vers QUIC: ce qui sous-tend HTTP / 3

Une nouvelle Ă©tape importante dans l'histoire d'Internet commence sous nos yeux: nous pouvons supposer que HTTP / 3 a dĂ©jĂ  Ă©tĂ© annoncĂ©. Fin octobre, Mark Nottingham de l'IETF a suggĂ©rĂ© de dĂ©jĂ  dĂ©cider d'un nom pour le nouveau protocole sur lequel l'IETF s'est construit depuis 2015. Ainsi, au lieu de noms de type QUIC, un fort HTTP / 3 est apparu. Les publications occidentales ont dĂ©jĂ  Ă©crit Ă  ce sujet et plus d'une fois . L'histoire de QUIC a commencĂ© dans les entrailles de Good Corporation en 2012, car seuls les serveurs de Google prenaient en charge les connexions HTTP sur QUIC, mais le temps passe et Facebook a dĂ©jĂ  commencĂ© Ă  mettre en Ɠuvre cette technologie (le 7 novembre, Facebook et LiteSpeed ​​ont fait la premiĂšre interaction via HTTP / 3 ); Actuellement, la part des sites prenant en charge QUIC est de 1,2%. Enfin, le groupe de travail WebRTC se tourne Ă©galement vers QUIC (plus voir l' API QUIC ), donc dans un avenir prĂ©visible, la vidĂ©o / audio en temps rĂ©el passera par QUIC au lieu de RTP / RTCP. Par consĂ©quent, nous avons dĂ©cidĂ© qu'il serait formidable de rĂ©vĂ©ler les dĂ©tails de l'IETF QUIC: spĂ©cialement pour Habr, nous avons prĂ©parĂ© une traduction du longread dotting i. Profitez-en!

QUIC (Quick UDP Internet Connections) est un nouveau protocole de couche de transport par défaut chiffré qui comporte de nombreuses améliorations HTTP: à la fois pour accélérer le trafic et augmenter la sécurité. QUIC a également un objectif à long terme: remplacer éventuellement TCP et TLS. Dans cet article, nous examinerons à la fois les puces QUIC clés et les raisons pour lesquelles le Web en bénéficiera, ainsi que les problÚmes de prise en charge de ce tout nouveau protocole.

En fait, il existe deux protocoles du mĂȘme nom: Google QUIC (gQUIC), le protocole original dĂ©veloppĂ© par les ingĂ©nieurs de Google il y a plusieurs annĂ©es, qui, aprĂšs une sĂ©rie d'expĂ©riences, a Ă©tĂ© adoptĂ© par l'Internet Engineering Task Force (IETF) pour la normalisation.

IETF QUIC (ci-aprĂšs simplement QUIC) prĂ©sente dĂ©jĂ  des diffĂ©rences si fortes avec gQUIC qu'il peut ĂȘtre considĂ©rĂ© comme un protocole distinct. Du format de package Ă  la prise de contact et au mappage HTTP, QUIC a amĂ©liorĂ© l'architecture gQUIC d'origine en collaborant avec de nombreuses organisations et dĂ©veloppeurs qui ont un objectif commun: rendre Internet plus rapide et plus sĂ©curisĂ©.

Alors, quelles améliorations offre QUIC?

Sécurité intégrée (et performances)


L'une des diffĂ©rences les plus notables entre QUIC et TCP vĂ©nĂ©rable est l'objectif dĂ©clarĂ© Ă  l'origine d'ĂȘtre un protocole de transport sĂ©curisĂ© par dĂ©faut . QUIC y parvient en utilisant l'authentification et le chiffrement, qui se produisent gĂ©nĂ©ralement Ă  un niveau supĂ©rieur (par exemple, dans TLS), et non dans le protocole de transport lui-mĂȘme.

La prise de contact QUIC originale combine la communication Ă  trois voies habituelle sur TCP avec la prise de contact TLS 1.3, qui fournit l'authentification des participants, ainsi que la coordination des paramĂštres cryptographiques. Pour ceux qui connaissent TLS: QUIC remplace le niveau d'enregistrement TLS par son propre format de trame, mais utilise en mĂȘme temps des poignĂ©es de main TLS.

Cela permet non seulement Ă  la connexion d'ĂȘtre toujours cryptĂ©e et authentifiĂ©e, mais aussi plus rapidement pour Ă©tablir la connexion initiale: une poignĂ©e de main QUIC ordinaire effectue l'Ă©change entre le client et le serveur en une seule passe, tandis que TCP + TLS 1.3 effectue deux passes.


Cependant, QUIC va plus loin et crypte Ă©galement les mĂ©tadonnĂ©es de connexion qui peuvent ĂȘtre facilement compromises par un tiers. Par exemple, les attaquants peuvent utiliser des numĂ©ros de paquets pour diriger les utilisateurs sur plusieurs chemins rĂ©seau lorsque la migration de connexion est utilisĂ©e (voir ci-dessous). QUIC chiffre les numĂ©ros de paquets, de sorte qu'ils ne peuvent ĂȘtre corrigĂ©s par personne d'autre que les vrais participants Ă  la connexion.

Le chiffrement peut Ă©galement ĂȘtre efficace contre la «stagnation» - un phĂ©nomĂšne qui ne permet pas d'utiliser la flexibilitĂ© du protocole en raison d'hypothĂšses incorrectes dans les implĂ©mentations (ossification - c'est pourquoi TLS 1.3 a Ă©tĂ© prĂ©sentĂ© pendant longtemps . Nous ne l'avons publiĂ© qu'aprĂšs quelques modifications qui empĂȘcher les blocs indĂ©sirables pour les nouvelles rĂ©visions TLS).

Blocage du dĂ©but de la file d'attente (blocage en tĂȘte de ligne)


L'une des principales amĂ©liorations apportĂ©es par HTTP / 2 est la possibilitĂ© de combiner diffĂ©rentes requĂȘtes HTTP dans une seule connexion TCP. Cela permet aux applications HTTP / 2 de traiter les demandes en parallĂšle et de mieux utiliser le canal rĂ©seau.

Bien sĂ»r, ce fut un pas en avant significatif. Parce que les applications antĂ©rieures devaient initier de nombreuses connexions TCP + TLS si elles voulaient traiter plusieurs requĂȘtes HTTP en mĂȘme temps (par exemple, lorsque le navigateur doit recevoir Ă  la fois CSS et JavaScript pour afficher la page). La crĂ©ation de nouvelles connexions nĂ©cessite plusieurs prises de contact, ainsi que l'initialisation de la fenĂȘtre de surcharge: cela signifie ralentir le rendu de la page. Les requĂȘtes HTTP combinĂ©es Ă©vitent cela.



Cependant, il y a un inconvĂ©nient: puisque plusieurs requĂȘtes / rĂ©ponses sont transmises sur la mĂȘme connexion TCP, elles dĂ©pendent toutes Ă©galement de la perte de paquets, mĂȘme si les donnĂ©es perdues ne concernent qu'une seule des requĂȘtes. Cela s'appelle "bloquer le dĂ©but de la file d'attente".

QUIC va plus loin et fournit un support de premiĂšre classe pour combiner les demandes, par exemple, diffĂ©rentes demandes HTTP peuvent ĂȘtre considĂ©rĂ©es comme des demandes QUIC de transport diffĂ©rentes, mais en mĂȘme temps, elles utiliseront toutes la mĂȘme connexion QUIC - c'est-Ă -dire que des poignĂ©es de main supplĂ©mentaires ne sont pas nĂ©cessaires, il y en a une Ă©tat d'encombrement, les demandes QUIC sont dĂ©livrĂ©es indĂ©pendamment - par consĂ©quent, dans la plupart des cas, la perte de paquets affecte une seule demande.

Ainsi, il est possible de réduire considérablement le temps, par exemple, pour le rendu complet d'une page Web (CSS, JavaScript, images et autres ressources), en particulier dans le cas d'un réseau surchargé avec une perte de paquets élevée.

Si simple, hein?


Pour tenir sa promesse, le protocole QUIC doit surmonter certaines des hypothĂšses que de nombreuses applications rĂ©seau tiennent pour acquises. Cela peut compliquer la mise en Ɠuvre et la mise en Ɠuvre de QUIC.

QUIC est conçu pour ĂȘtre livrĂ© sur des datagrammes UDP afin de faciliter le dĂ©veloppement et d'Ă©viter les problĂšmes avec les pĂ©riphĂ©riques rĂ©seau qui abandonnent les paquets de protocoles inconnus (car la plupart des pĂ©riphĂ©riques prennent en charge UDP). Il permet Ă©galement Ă  QUIC de vivre dans l'espace utilisateur. Ainsi, par exemple, les navigateurs pourront implĂ©menter de nouvelles fonctionnalitĂ©s de protocole et les transmettre aux utilisateurs finaux, sans attendre les mises Ă  jour du systĂšme d'exploitation.

Cependant, le bon objectif de réduire les problÚmes de réseau rend plus difficile la protection des paquets et leur acheminement correct.

Un NAT pour se réunir tous ensemble et s'unir avec une seule volonté noire


En rÚgle générale, les routeurs NAT fonctionnent avec des connexions TCP en utilisant un tuple de 4 valeurs (IP source et port plus IP et port de destination), ainsi que la surveillance des paquets TCP SYN, ACK et FIN transmis sur le réseau; les routeurs peuvent déterminer quand une nouvelle connexion est établie et quand elle s'est terminée. Par conséquent, une gestion précise des liaisons NAT (communications entre IP et ports internes et externes) est possible.

Dans le cas de QUIC, ce n'est pas encore possible, car les routeurs NAT modernes ne connaissent pas encore QUIC, donc ils rétrogradent généralement vers un traitement UDP par défaut et moins précis, ce qui signifie des délais d'expiration arbitraires (parfois courts) , ce qui peut affecter les connexions à long terme.

Lorsqu'une nouvelle liaison se produit (par exemple, en raison d'un délai d'attente), le périphérique en dehors du périmÚtre NAT commence à recevoir des paquets d'une autre source, ce qui rend impossible de maintenir la connexion en utilisant uniquement un tuple de 4 valeurs.


Et ce n'est pas seulement NAT! Une fonctionnalité QUIC est appelée migration de connexion et permet aux appareils de transférer des connexions vers d'autres adresses / chemins IP à leur discrétion. Par exemple, un client mobile pourra transférer une connexion QUIC d'un réseau mobile vers un réseau WiFi déjà connu (l'utilisateur a entré un café préféré, etc.).

QUIC essaie de rĂ©soudre ce problĂšme avec le concept d'ID de connexion: une information de longueur arbitraire, transmise en paquets QUIC et permettant d'identifier la connexion. Les appareils d'extrĂ©mitĂ© peuvent utiliser cet ID pour suivre leurs connexions sans se rĂ©concilier avec le tuple. En pratique, il devrait y avoir de nombreux ID pointant vers la mĂȘme connexion, par exemple, pour Ă©viter de connecter des chemins diffĂ©rents lorsque la connexion est migrĂ©e, car l'ensemble du processus est contrĂŽlĂ© uniquement par les pĂ©riphĂ©riques finaux et non par les boĂźtiers de mĂ©diation.

Cependant, il peut y avoir un problĂšme pour les opĂ©rateurs de tĂ©lĂ©communications qui utilisent anycast et le routage ECMP, oĂč une adresse IP peut potentiellement identifier des centaines ou des milliers de serveurs. Étant donnĂ© que les routeurs frontaliers de ces rĂ©seaux ne savent pas encore comment traiter le trafic QUIC, il peut arriver que des paquets UDP provenant de la mĂȘme connexion QUIC, mais avec des tuples diffĂ©rents, soient envoyĂ©s Ă  diffĂ©rents serveurs, ce qui signifie une dĂ©connexion.



Pour Ă©viter cela, les opĂ©rateurs peuvent avoir besoin d'implĂ©menter un Ă©quilibreur de niveau plus intelligent. Cela peut ĂȘtre rĂ©alisĂ© par programme sans affecter les routeurs frontaliers eux-mĂȘmes (par exemple, voir le projet Katran de Facebook).

Qpack


Une autre fonctionnalitĂ© utile de HTTP / 2 Ă©tait la compression d'en-tĂȘte (HPACK) , qui permet aux terminaux de rĂ©duire la taille des donnĂ©es envoyĂ©es en supprimant les demandes et rĂ©ponses inutiles.

En particulier, entre autres techniques, HPACK utilise des tables dynamiques avec des en-tĂȘtes qui ont dĂ©jĂ  Ă©tĂ© envoyĂ©s / reçus Ă  partir de demandes / rĂ©ponses HTTP prĂ©cĂ©dentes, ce qui permet aux appareils de se rĂ©fĂ©rer dans de nouvelles demandes / rĂ©ponses aux en-tĂȘtes rencontrĂ©s prĂ©cĂ©demment (au lieu de les renvoyer) .

Les tables HPACK doivent ĂȘtre synchronisĂ©es entre l'encodeur (la partie qui envoie la demande / la rĂ©ponse) et le dĂ©codeur (le cĂŽtĂ© rĂ©cepteur), sinon le dĂ©codeur ne peut tout simplement pas dĂ©coder ce qu'il reçoit.

Dans le cas de HTTP / 2 sur TCP, cette synchronisation est transparente car la couche de transport (TCP) dĂ©livre les requĂȘtes / rĂ©ponses dans le mĂȘme ordre dans lequel elles ont Ă©tĂ© envoyĂ©es. Autrement dit, vous pouvez envoyer des instructions au dĂ©codeur pour mettre Ă  jour les tables dans une simple demande / rĂ©ponse. Mais avec QUIC, les choses sont beaucoup plus compliquĂ©es.

QUIC peut livrer plusieurs requĂȘtes / rĂ©ponses HTTP dans diffĂ©rentes directions en mĂȘme temps, ce qui signifie que QUIC garantit l'ordre de livraison dans une direction, alors qu'il n'y a pas de telle garantie dans le cas de plusieurs directions.

Par exemple, si un client envoie une demande HTTP A dans le flux QUIC A, ainsi qu'une demande B dans le flux B, alors en raison de la permutation de paquets ou de pertes de rĂ©seau, le serveur recevra la demande B avant la demande A. Et si la demande B a Ă©tĂ© codĂ©e comme a Ă©tĂ© indiquĂ© dans l'en-tĂȘte de la demande A, le serveur ne pourra tout simplement pas dĂ©coder la demande B, car il n'a pas encore vu la demande A.

Le protocole gQUIC a rĂ©solu ce problĂšme en rendant simplement tous les en-tĂȘtes (mais pas les corps) des requĂȘtes / rĂ©ponses HTTP sĂ©quentielles dans un seul flux gQUIC. Cela garantit que tous les en-tĂȘtes sont dans le bon ordre, quoi qu'il arrive. Il s'agit d'un schĂ©ma trĂšs simple, avec son aide, les solutions existantes peuvent continuer Ă  utiliser du code affinĂ© sous HTTP / 2; d'autre part, cela augmente la probabilitĂ© de bloquer le dĂ©but de la file d'attente, ce que QUIC est conçu pour rĂ©duire. Par consĂ©quent, le groupe de travail IETF QUIC a dĂ©veloppĂ© un nouveau mappage entre HTTP et QUIC (HTTP / QUIC), ainsi qu'un nouveau principe de compression d'en-tĂȘte, QPACK.

Dans la version finale des spécifications HTTP / QUIC et QPACK, chaque échange de demande / réponse HTTP utilise son propre flux QUIC bidirectionnel, donc le blocage du début de la file d'attente ne se produit pas. De plus, afin de prendre en charge QPACK, chaque participant crée deux flux QUIC unidirectionnels supplémentaires, l'un pour envoyer les mises à jour de table, l'autre pour confirmer leur réception. Ainsi, le codeur QPACK ne peut utiliser le lien vers la table dynamique qu'aprÚs que le décodeur a confirmé sa réception.

Réflexion réfringente


Un problÚme commun avec les protocoles basés sur UDP est leur sensibilité aux attaques par réflexion, lorsque l'attaquant force un serveur à envoyer une énorme quantité de données à la victime. L'attaquant usurpe son adresse IP afin que le serveur pense que la demande de données provient de l'adresse de la victime.


Ce type d'attaque peut ĂȘtre trĂšs efficace lorsque la rĂ©ponse du serveur est incomparablement plus grande que la demande. Dans ce cas, ils parlent de «gain».

TCP n'est gĂ©nĂ©ralement pas utilisĂ© pour de telles attaques, car les paquets de la poignĂ©e de main d'origine (SYN, SYN + ACK, ...) ont la mĂȘme longueur, donc ils n'ont pas de potentiel "d'amplification".

En revanche, la prise de contact QUIC est trĂšs asymĂ©trique: comme dans TLS, le serveur QUIC envoie d'abord sa chaĂźne de certificats, qui peut ĂȘtre assez grande, malgrĂ© le fait que le client ne doit envoyer que quelques octets (le message du client ClientHello TLS est intĂ©grĂ© au package QUIC ) Pour cette raison, l'emballage d'origine QUIC doit ĂȘtre augmentĂ© jusqu'Ă  une certaine longueur minimale, mĂȘme si le contenu de l'emballage est beaucoup plus petit. Quoi qu'il en soit, cette mesure n'est toujours pas trĂšs efficace, car une rĂ©ponse de serveur typique contient plusieurs paquets et peut donc ĂȘtre plus qu'un package client Ă©largi.

Le protocole QUIC définit également un mécanisme de vérification de source explicite: le serveur, au lieu de donner une réponse importante, envoie uniquement un paquet de nouvelle tentative avec un jeton unique, que le client envoie ensuite au serveur dans un nouveau paquet. Ainsi, le serveur a plus confiance que le client n'a pas d'adresse IP de remplacement et vous pouvez mettre fin à la prise de contact. Moins de la décision - le temps de la poignée de main augmente, au lieu d'une passe, deux sont déjà nécessaires.

Une autre solution consiste Ă  rĂ©duire la rĂ©ponse du serveur Ă  une taille oĂč l'attaque par rĂ©flexion devient moins efficace - par exemple, en utilisant des certificats ECDSA (gĂ©nĂ©ralement ils sont beaucoup plus petits que RSA). Nous avons Ă©galement expĂ©rimentĂ© un mĂ©canisme de compression de certificat TLS utilisant des algorithmes de compression standard tels que zlib et brotli; il s'agit d'une fonctionnalitĂ© qui est apparue pour la premiĂšre fois dans gQUIC mais qui n'est actuellement pas prise en charge dans TLS.

Performances UDP


L'un des problÚmes constants de QUIC est le matériel et les logiciels existants qui ne peuvent pas fonctionner avec QUIC. Nous avons déjà examiné comment QUIC essaie de gérer les boßtiers de médiation réseau comme les routeurs, mais un autre domaine potentiellement problématique est la performance d'envoi / réception de données entre les périphériques QUIC via UDP. Depuis de nombreuses années, des efforts ont été faits pour optimiser autant que possible les implémentations TCP, y compris les capacités de déchargement intégrées dans les logiciels (par exemple, les systÚmes d'exploitation) et dans le matériel (interfaces réseau), mais rien de tout cela ne concerne UDP.

Cependant, ce n'est qu'une question de temps avant que les implĂ©mentations QUIC dĂ©passent ces amĂ©liorations et avantages. Jetez un Ɠil aux efforts rĂ©cents pour implĂ©menter le dĂ©chargement UDP sur Linux , qui permettrait aux applications de combiner et de transmettre plusieurs segments UDP entre l'espace utilisateur et la pile rĂ©seau de l'espace noyau au prix d'environ un segment; un autre exemple est la prise en charge de la zĂ©rocopie pour les sockets sous Linux , grĂące Ă  laquelle les applications pourraient Ă©viter le coĂ»t de la copie de la mĂ©moire de l'espace utilisateur vers l'espace noyau.

Conclusion


Comme HTTP / 2 et TLS 1.3, le protocole QUIC devrait apporter une tonne de nouvelles fonctionnalités qui amélioreront les performances et la sécurité des sites Web et des autres participants à l'infrastructure Internet. Le groupe de travail de l'IETF a l'intention de déployer la premiÚre version des spécifications QUIC d'ici la fin de l'année, il est donc temps de réfléchir à la façon dont nous pouvons tirer le meilleur parti des avantages de QUIC.

Source: https://habr.com/ru/post/fr430436/


All Articles