How Fb is bringing QUIC to billions

Wir ersetzen das De-facto-Protokoll, mit dem das Internet seit Jahrzehnten arbeitet QUICDies ist der neueste und radikalste Schritt, den wir unternommen haben, um unsere Netzwerkprotokolle zu optimieren und den Nutzern unserer Dienste eine bessere Erfahrung zu bieten. Heute verwenden mehr als 75 Prozent unseres Internetverkehrs QUIC und HTTP / 3 (wir bezeichnen QUIC und HTTP / 3 zusammen als QUIC). QUIC hat signifikante Verbesserungen bei verschiedenen Metriken gezeigt, einschließlich Anforderungsfehlern, Endlatenz, Größe des Antwortheaders und zahlreichen anderen, die die Erfahrung der Benutzer unserer Apps erheblich beeinflussen.

Die Internet Engineering Task Force (IETF) ist derzeit entwickelt sowohl QUIC als auch HTTP / 3 zur Standardisierung.

Was sind QUIC und HTTP / 3?

Im Großen und Ganzen ist QUIC ein Ersatz für das Transmission Control Protocol (TCP), eines der Hauptprotokolle für die Internetkommunikation. QUIC wurde ursprünglich intern von Google als Google QUIC oder gQUIC entwickelt und der IETF 2015 vorgestellt. Seitdem wurde es von der breiteren IETF-Community neu gestaltet und verbessert und bildet ein neues Protokoll, das wir jetzt QUIC nennen. HTTP / 3 ist die nächste Iteration von HTTP, dem Standardprotokoll für webbasierte Anwendungen und Server. Zusammen stellen QUIC und HTTP / 3 die neuesten und besten internetorientierten Protokolle dar, die Jahrzehnte umfassen Best Practices und Lehren, die wir, Google und die IETF-Community durch das Ausführen von Protokollen im Internet gezogen haben.

QUIC und HTTP / 3 übertreffen im Allgemeinen TCP und HTTP / 2, was wiederum TCP und HTTP / 1.1 übertrifft. TCP und HTTP / 2 führten zunächst das Konzept ein, einer einzelnen Netzwerkverbindung die Unterstützung mehrerer Datenströme in einem als Stream-Multiplexing bezeichneten Prozess zu ermöglichen. QUIC und HTTP / 3 gehen noch einen Schritt weiter, indem sie Streams wirklich unabhängig machen, indem sie die gefürchtete Blockierung des Head-of-Line-Bereichs von TCP vermeiden, bei der verlorene Pakete blockieren und alle Streams einer Verbindung verlangsamen.

QUIC verwendet eine hochmoderne Verlustwiederherstellung, die es ermöglicht, unter schlechten Netzwerkbedingungen eine bessere Leistung als die meisten TCP-Implementierungen zu erzielen. TCP ist auch anfällig für Ossifikation, wo das Upgrade des Protokolls schwierig wird, da Netzwerk-Middleboxen wie Firewalls Annahmen über das Format der Pakete treffen. QUIC vermeidet dieses Problem, indem es vollständig verschlüsselt ist, die Erweiterbarkeit des Protokolls zu einem erstklassigen Bürger macht und garantiert, dass zukünftige Verbesserungen vorgenommen werden können. QUIC ermöglicht auch neue Möglichkeiten, das Transportverhalten zu instrumentieren, zu beobachten und zu visualisieren QLOG, ein JSON-basiertes Ablaufverfolgungsformat, das speziell für QUIC entwickelt wurde.

Erfahrungsorientierte Protokollentwicklung

Wir haben unsere eigene Implementierung von QUIC entwickelt, genannt mvfst, um QUIC schnell auf unseren eigenen Systemen zu testen und bereitzustellen. Wir haben in der Vergangenheit eigene Protokollimplementierungen geschrieben und bereitgestellt, zunächst mit unserer HTTP-Client / Server-Bibliothek. Sauerstoffund danach mit dem Nullprotokoll und dann Fizz, unsere TLS 1.3-Implementierung. Facebook-Apps verwenden sowohl Fizz als auch Proxygen, um über mit unseren Servern zu kommunizieren Proxygen Mobile. Wir haben auch zwei Sicherheitslösungen für TLS entwickelt, eine Erweiterung namens delegierte Anmeldeinformationen zur Sicherung von Zertifikaten und DNS über TLS, zum Verschlüsseln und Authentifizieren des Webverkehrs über TLS.

Entwicklung und Bereitstellung eines neuen Transportprotokolls von Grund auf neu

Wir wollten, dass unser neues Protokoll nahtlos in unsere vorhandene Software integriert wird und unsere Entwickler schnell arbeiten können. Als Testgelände haben wir uns entschlossen, QUIC für eine große Teilmenge des Facebook-Netzwerkverkehrs bereitzustellen, insbesondere für den internen Netzwerkverkehr, zu dem auch der öffentliche Proxy-Verkehr für Facebook gehört. Wenn QUIC für den internen Datenverkehr nicht gut funktioniert, wissen wir, dass es im größeren Internet wahrscheinlich auch nicht gut funktioniert.

Mit dieser Strategie können wir nicht nur Fehler und andere problematische Verhaltensweisen ausschütteln, sondern auch eine Methode entwickeln, die unsere Netzwerklastenausgleich tief QUIC-bewusst und pflegt unsere Die Zero-Downtime-Version von Load Balancer garantiert.

Mit dieser soliden Grundlage haben wir uns dazu entschlossen, QUIC für Menschen im Internet bereitzustellen. Aufgrund des Designs von mvfst konnten wir die QUIC-Unterstützung problemlos in Proxygen Mobile integrieren.

Die Facebook App

Die Facebook-App war unser erstes Ziel für die Nutzung von QUIC im Internet. Facebook verfügt über eine ausgereifte Infrastruktur, mit der wir Änderungen an Apps in begrenztem Umfang sicher einführen können, bevor wir sie für Milliarden von Menschen freigeben. Wir haben mit einem Experiment begonnen, bei dem wir QUIC für die Dynamik aktiviert haben GraphQL Anfragen in der Facebook App. Hierbei handelt es sich um Anforderungen, deren Antwort keinen statischen Inhalt wie Bilder und Videos enthält.

Unsere Tests haben gezeigt, dass QUIC Verbesserungen bei mehreren Metriken bietet. Facebook-Nutzer konnten eine Reduzierung der Anforderungsfehler um 6 Prozent, eine Reduzierung der Tail-Latenz um 20 Prozent und eine Reduzierung der Größe des Antwortheaders um 5 Prozent im Vergleich zu HTTP / 2 feststellen. Dies hatte auch kaskadierende Auswirkungen auf andere Metriken, was darauf hinweist, dass die Erfahrung der Menschen durch QUIC erheblich verbessert wurde.

Es gab jedoch Rückschritte. Am rätselhaftesten war, dass wir, obwohl QUIC nur für dynamische Anforderungen aktiviert war, erhöhte Fehlerraten für statische Inhalte beobachteten, die mit TCP heruntergeladen wurden. Die Hauptursache hierfür wäre ein häufiges Thema, auf das wir beim Übergang des Datenverkehrs zu QUIC gestoßen sind: Die App-Logik hat die Art und Menge der Anforderungen für bestimmte Inhaltstypen basierend auf der Geschwindigkeit und Zuverlässigkeit der Anforderungen für andere Inhaltstypen geändert. Die Verbesserung einer Art von Anfrage kann sich daher nachteilig auf andere ausgewirkt haben.

Beispielsweise wurde eine Heuristik, die anpasste, wie aggressiv die App neuen statischen Inhalt vom Server anforderte, so optimiert, dass Probleme mit QUIC auftraten. Wenn die App beispielsweise den Textinhalt eines Newsfeeds lädt, wartet sie darauf, wie lange diese Anfrage dauert, und bestimmt dann, wie viele Bild- / Videoanfragen von dort aus gestellt werden sollen. Wir haben festgestellt, dass die Heuristik mit beliebigen Schwellenwerten abgestimmt wurde, was für TCP wahrscheinlich in Ordnung war. Als wir jedoch zu QUIC wechselten, waren diese Schwellenwerte ungenau, und die App versuchte, zu viel auf einmal anzufordern, was letztendlich dazu führte, dass das Laden des Newsfeeds länger dauerte.

Skalieren lassen

Der nächste Schritt war die Bereitstellung von QUIC für statische Inhalte (z. B. Bilder und Videos) in den Facebook-Apps. Zuvor mussten wir uns jedoch mit zwei Hauptproblemen befassen: der CPU-Effizienz von mvfst und der Effektivität unserer Implementierung der primären Überlastungskontrolle. BBR.

Bis zu diesem Zeitpunkt wurde mvfst entwickelt, um Entwicklern dabei zu helfen, schnell voranzukommen und mit den sich ständig ändernden Entwürfen von QUIC Schritt zu halten. Dynamische Anforderungen, deren Antworten im Vergleich zu statischen Anforderungen relativ klein sind, erfordern weder eine erhebliche CPU-Auslastung noch stellen sie einen Überlastungscontroller auf Herz und Nieren.

Um diese Bedenken auszuräumen, haben wir Leistungstest-Tools entwickelt, mit denen wir die CPU-Auslastung und die effektive Nutzung der Netzwerkressourcen durch unseren Überlastungscontroller beurteilen können. Wir haben diese Tools und synthetischen Lasttests von QUIC in unserem Load Balancer verwendet, um verschiedene Verbesserungen vorzunehmen. Ein wichtiger Bereich war beispielsweise die Optimierung des Tempos von UDP-Paketen, um eine reibungslosere Datenübertragung zu ermöglichen. Um die CPU-Auslastung zu verbessern, haben wir eine Reihe von Techniken eingesetzt: einschließlich der Verwendung von generischem Segmentierungs-Offload (GSO) um Stapel von UDP-Paketen gleichzeitig effizient zu senden. Wir haben auch die Datenstrukturen und Algorithmen optimiert, die nicht bestätigte QUIC-Daten verarbeiten.

QUIC für alle Inhalte

Bevor wir QUIC für alle Inhalte in der Facebook-App aktivieren, haben wir uns mit mehreren Stakeholdern zusammengetan, einschließlich unserer Videoingenieure. Sie haben ein tiefes Verständnis für die wichtigen Produktmetriken und haben uns geholfen, die experimentellen Ergebnisse in der Facebook-App zu analysieren, als wir QUIC aktiviert haben.

Die Experimente zeigten, dass QUIC einen transformativen Effekt auf Videometriken in der Facebook-App hatte. Die mittlere Zeit zwischen dem erneuten Puffern (MTBR), ein Maß für die Zeit zwischen dem Puffern, verbesserte sich je nach Plattform insgesamt um bis zu 22 Prozent. Die Gesamtzahl der Fehler bei Videoanfragen wurde um 8 Prozent reduziert. Die Rate der Videostände wurde um 20 Prozent reduziert. Einige andere Metriken, einschließlich Metametriken, wurden unter Berücksichtigung einer Vielzahl von Faktoren und insbesondere Ausreißerbedingungen ebenfalls erheblich verbessert. QUIC verbesserte das Videoerlebnis mit übergroßen Auswirkungen auf Netzwerke mit relativ schlechteren Bedingungen, insbesondere in Schwellenländern.

Der Weg zu diesen Ergebnissen war jedoch mit eigenen Straßensperren verbunden. Ähnlich wie bei unserer Erfahrung mit dynamischen Inhalten stießen wir in der App auf Heuristiken, die auf das Verhalten von TCP abgestimmt waren. Beispielsweise verfügten die Apps unter iOS und Android über unterschiedliche Mechanismen zur Schätzung der verfügbaren Download-Bandbreite. Diese Schätzer haben manchmal die verfügbare Bandbreite bei Verwendung von QUIC überschätzt, was dazu führte, dass die App ein Video mit höherer Qualität abspielte, als das Netzwerk unterstützen könnte, und zu Verzögerungen führte.

Wir mussten auch die Flusssteuerungsparameter optimieren und iterieren. Die Flusskontrolle begrenzt die Datenmenge, die ein Empfänger bereit ist, vom Absender zu puffern. Die Facebook-App hatte eine statisch definierte Flusskontrollgrenze für HTTP / 2, die implizit auf TCP abgestimmt war und mit QUIC keine gute Leistung erbrachte. Es dauerte einige experimentelle Iterationen, bis wir den neuen optimalen Flusskontrollwert gefunden hatten.

Individuelle Perzentilunterschiede zwischen den Videoladezeiten für QUIC und TCP.

Instagram und darüber hinaus

Die Leistung von QUIC in der Facebook-App ist ein Beweis für die Fähigkeit von QUIC, die Erfahrung der Menschen im Internet zu verbessern, selbst in umfangreichen und komplexen Anwendungen wie Facebook. In Zukunft planen wir, weitere vorhandene Funktionen von QUIC wie die Verbindungsmigration und den echten 0-RTT-Verbindungsaufbau weiter zu nutzen und in Verbesserungen der Überlastungskontrolle und der Wiederherstellung von Verlusten zu investieren.

Wir haben QUIC auch für die Instagram-Apps bereitgestellt. Dabei haben wir dieselben Strategien wie bei unserer Facebook-Bereitstellung angewendet. Wir haben es auf einen kleinen Prozentsatz des Instagram-Datenverkehrs getestet und dann skaliert. Heute wird QUIC auf Instagram für iOS und Instagram für Android bereitgestellt. Beide Versionen von Instagram haben Metriken gesehen, die mit denen der Facebook-App vergleichbar oder besser sind. Facebook und Instagram im Web haben auch QUIC aktiviert, sodass mehr Webbrowser die Unterstützung für QUIC aktivieren, z Google hat kürzlich für Chrome getan und Apple hat für Safari Beta getanNoch mehr Menschen werden von den Verbesserungen profitieren. Über Instagram hinaus glauben wir, dass wir die Vorteile von QUIC für jede Erfahrung in unserer App-Familie nutzen können, wobei QUIC letztendlich nicht nur die Mehrheit, sondern den gesamten Internetverkehr von Facebook darstellt.

Die IETF ist auf dem besten Weg, das QUIC-Protokoll irgendwann im Jahr 2021 als RFC-Dokument (Request for Comments) fertigzustellen. Sobald dies geschieht, werden noch mehr Websites, Anwendungen und Netzwerkbibliotheken QUIC für den allgemeinen Gebrauch anbieten. In naher Zukunft werden neue Protokolle wie QUIC unerlässlich sein, um innovative Internetanwendungen freizuschalten. Für uns ist QUIC ein Ausgangspunkt, von dem aus wir das Facebook-Erlebnis der Menschen weiter verbessern können.

Es gibt so viele Menschen innerhalb und außerhalb von Facebook, die diese Bereitstellung ermöglicht haben. Wir möchten uns bei allen bedanken, die in den letzten Jahren an der IETF QUIC-Arbeitsgruppe teilgenommen haben und unermüdlich über QUIC debattiert und es gestaltet haben. Die Arbeitsgruppe besteht aus einer Vielzahl von Personen mit unterschiedlichem Hintergrund, die in relativ kurzer Zeit ein wirklich bemerkenswertes Protokoll erstellt haben.

Comments are closed.