HTTP/2 on IIS (HTTP/2 auf IIS)

von David So

Kompatibilität

Version Hinweise
IIS 10.0 HTTP/2-Unterstützung wurde in IIS 10.0 eingeführt
IIS 8.5 und früher HTTP/2 wurde vor IIS 10.0 nicht unterstützt

Was ist HTTP/2?

HTTP/2 ist eine Überarbeitung der Funktionsweise der HTTP-Semantik über TCP-Verbindungen, und die HTTP/2-Unterstützung ist in Windows 10 und Windows Server 2016 vorhanden. HTTP/2 ist ein großes Upgrade nach fast zwei Jahrzehnten HTTP/1.1-Verwendung und reduziert die Auswirkungen von Latenz und Verbindungslast auf Webservern.

Der wichtigste Fortschritt von HTTP/1.1 war die Verwendung persistenter Verbindungen zur Bedienung mehrerer Anforderungen hintereinander. In HTTP/2 kann eine dauerhafte Verbindung verwendet werden, um mehrere gleichzeitige Anforderungen zu verarbeiten. Im Prozess führt HTTP/2 mehrere zusätzliche Features ein, die die Effizienz von HTTP überall im Netzwerk verbessern.

Eine Verbindung für mehrere Anforderungen

Für jede TCP-Verbindung ist eine Roundtrip-Einrichtung erforderlich. Wenn Sie Verschlüsselung verwenden, nimmt der TLS-Handshake weitere 1 bis 2 Roundtrips an. All dies geschieht, bevor das erste Byte der ersten Antwort gesendet werden kann. Wenn Sie eine vorhandene Verbindung wiederverwenden, anstatt eine neue einzurichten, kann dieser Mehraufwand von vielen Anforderungen gemeinsam genutzt werden. Durch HTTP/2 wird die Notwendigkeit, dass eine Anforderung warten muss, während eine neue Verbindung hergestellt wird oder bis eine vorhandene Verbindung im Leerlauf ist, drastisch reduziert. Da eine einzelne Verbindung zwischen vielen Anforderungen gemuxt wird, kann die Anforderung in der Regel sofort gesendet werden, ohne auf den Abschluss anderer Anforderungen zu warten.

Headerkomprimierung mit HPACK

HTTP hat die Komprimierung von Daten schon ewig unterstützt. Header werden jedoch als unkomprimierter Text mit viel Redundanz zwischen Anforderungen gesendet. (Viele der längsten Header werden bei jeder Anforderung mit genau demselben Wert gesendet!) HTTP/2 führt HPACK ein, ein Komprimierungsschema für HTTP-Header, das die Redundanz zwischen Anforderungen reduziert.

Komprimierung hilft beim Multiplexing, da Anforderungen kleiner sind. Auf diese Weise können Clients viele Anforderungen in ihren ersten Paketen für eine Verbindung vornehmen, während die TCP-Flusssteuerungsfenster noch klein sind.

Server-Push

Anforderungen gehen in Mustern ein. Wenn ein Client nach einer Ressource fragt, kann der Server häufig vorhersagen, dass er weitere Ressourcen benötigt, auf die auf der Seite verwiesen wird. In HTTP/1.1 wurde Inlining verwendet, um diese Ressourcen als Teil der ersten Antwort an Clients zu übermitteln. Inlining hat seine Nachteile. Vor allem, dass die Inline-Ressource nicht für die Verwendung auf anderen Seiten zwischengespeichert werden kann, auf denen ebenfalls auf sie verwiesen werden kann.

HTTP/2 führt das Konzept „Push“ ein. Der Server antwortet dabei auf Anforderungen, die der Client noch nicht vorgenommen hat, die der Server jedoch prognostiziert. Auf diese Weise können Server weiterhin die Latenzvorteile von Inlining bieten, aber in einer Form, die der Client zwischenspeichern und auf anderen Seiten wiederverwenden kann.

Wie verwende ich HTTP/2?

Möglicherweise tun Sie das bereits! Fast alle Browser unterstützen HTTP/2 in ihrer aktuellsten Version bereits, und aktuelle Daten zeigen, dass mehr als 50 % der Benutzer bereits HTTP/2-fähige Browser verwenden.

Auf dem Server unterstützt IIS unter Windows 10 oder Windows Server 2016 HTTP/2.

IIS unterstützt HTTP/2 derzeit nur über TLS. Wenn eine HTTPS-Verbindung mit einem Webserver hergestellt wird, auf dem IIS unter Windows 10 ausgeführt wird, wird HTTP/2 verwendet, wenn der Client und der Server es unterstützen. In IIS haben wir HTTP/2 so transparent wie möglich implementiert. Sie sollten nichts in Ihrer Anwendung ändern müssen, damit HTTP/2 funktioniert. Bestimmte HTTP/1.1-Optimierungen (Sharding von Domains, Inlining usw.) werden in HTTP/2 jedoch nicht mehr empfohlen, daher sollten Sie diese in Zukunft entfernen.

Was ist mit Push?

Da Server-Push ein neues Feature in HTTP/2 ist, gibt es neue APIs, die Sie aufrufen müssen, um es zu nutzen. Wenn Sie die PushPromise-API in ASP.NET oder die API HttpDeclarePush aus einem IIS-nativen Modul aufrufen, stellen Sie die URL und optionale Anforderungsheader für die Anforderung bereit, die Sie vom Client erwarten. Wenn Push von der zugrunde liegenden Verbindung unterstützt wird, passieren zwei Dinge:

  • Ein PUSH_PROMISE wird an den Client gesendet, sodass der Client überprüfen kann, ob die Ressource bereits im Cache vorhanden ist
  • Eine neue Anforderung wird der Anforderungswarteschlange für die Push-Ressource hinzugefügt

Wenn die zugrunde liegende Verbindung Push nicht unterstützt (Client-deaktiviertes Push oder HTTP/1.1-Client), führt der Aufruf nichts aus und gibt erfolgreich zurück, sodass Sie die API sicher aufrufen können, ohne sich Gedanken darüber zu machen, ob Push zulässig ist.

IIS-Einstellungen

Es gibt keine neuen für HTTP/2 spezifischen IIS-Konfigurationseinstellungen.

Im Windows Server 2016 Tech-Preview wurde die Einstellung eines Registrierungsschlüssels „DuoEnabled“ erwähnt. Diese ist nicht mehr erforderlich. Wie oben erwähnt: Unterstützt die Client- und Serverkonfiguration HTTP/2, dann nutzt IIS HHTP/2 (oder es gibt ein Fallback auf HTTP/1.1, falls nicht möglich).

Protokollversion der Protokollierung

Die IIS-Protokollierung weist ein Feld „Protokollversion“ auf, das standardmäßig deaktiviert ist. Das Aktivieren dieses Felds ist nützlich, wenn Sie nachverfolgen möchten, welche Anforderungen über HTTP/2, HTTP/1.1 usw. gesendet werden.

Auf der Benutzeroberfläche des Internetdienste-Managers finden Sie dies unter Protokollierung über Felder auswählen.

Image of I I S Logging page displaying Select Fields drop down with Protocol Version C S dash Version selected from the W 3 C Logging Fields menu.

Klicken Sie nach dem Vornehmen der Änderungen ganz rechts auf Anwenden im Aktionsbereich.

Nachfolgend sehen Sie eine Beispielprotokolldateiausgabe mit aktivierten Feld „Protokollversion“:

#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2015-08-13 18:46:11
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2015-08-13 18:46:11 ::1 GET / - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko - 200 0 0 391
2015-08-13 18:46:11 ::1 GET /iisstart.png - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko https://localhost/ 200 0 0 100

Demo-Durchlauf für IIS mit HTTP/2

  1. Wenn Sie Windows 10 ausführen, finden Sie dies über Programme und Funktionen, dann Windows-Funktionen aktivieren oder deaktivieren. Aktivieren Sie dann das Kontrollkästchen Internetinformationsdienste. Wenn Sie Windows Server 2016 ausführen, starten Sie Server-Manager, dann im Dashboard Rollen und Funktionen hinzufügen. Wählen Sie dann Webserver (IIS) aus der Liste aus.

    Image of Turn Windows features on or off page with Internet Information Services selected and highlighted.

  2. Starten Sie nach Abschluss der Installation den Internetdienste-Manager und erstellen Sie ein selbstsigniertes Zertifikat, indem Sie die Option Serverzertifikate in der Ansicht Funktionen des Servers auswählen. Beachten Sie, dass die Verwendung eines selbstsignierten Zertifikats in diesem Beispiel nur zu Demo-/Testzwecken dient (nicht zum Schutz Ihrer Produktionswebsites empfohlen).

    Image of Server Features view in Internet Service Manager page with Server Certificates highlighted.

    Image of dialog for Self Signed Certificate displaying Name box with Create Self Signed Certificate option highlighted.

  3. Wechseln Sie zu Ihrer Standardwebsite und erstellen Sie unter Bindungeneine neue TLS-Bindung mit dem selbstsignierten Zertifikat, das Sie soeben erstellt haben.

    Screenshot of dialog box for Add Site Binding with Type of I P Address highlighted and Local I I S Server selected from the drop down.

  4. Starten Sie Ihren Browser von Ihrem Windows 10- oder Windows Server 2016-Computer und drücken Sie F12 (oder wechseln Sie zu Einstellungen und aktivieren Sie F12-Entwicklungstools). Wechseln Sie dann zur Registerkarte Netzwerk. Navigieren Sie zu https://localhost und schon haben Sie HTTP/2!

    Screenshot of Local Host dash F 12 Developer Tools with Network tab displayed and H T T P 2 selected.

Wann wird HTTP/2 nicht unterstützt?

In einigen wenigen Fällen kann HTTP/2 nicht in Kombination mit anderen Features verwendet werden. In solchen Situationen fällt Windows auf HTTP/1.1 zurück, und die Transaktion wird fortgesetzt. Dies kann die Aushandlung von HTTP/1.1 während des Handshakes oder das Senden eines Fehlercodes an den Client umfassen, der sie anweist, eine HTTP/1.1-Verbindung erneut zu versuchen.

  • Windows-Authentifizierung (NTLM/Kerberos/Negotiate) wird mit HTTP/2 nicht unterstützt. In diesem Fall fällt IIS auf HTTP/1.1 zurück.
  • Klartext: Wie oben erwähnt, unterstützt IIS HTTP/2 derzeit nur über TLS. Auch hier fällt IIS auf HTTP/1.1 zurück.
  • Bandbreiteneinschränkung: IIS verfügt über ein Feature zum Einschränken der Bandbreite (in Inetmgr Site auswählen, „Limits“ unter „Konfigurieren“ im Aktionsbereich). Dies gilt für HTTP/1.1, wird jedoch nicht für HTTP/2 erzwungen (wird ohne Fehler oder Bandbreiteneinschränkung fortgesetzt).

Weitere Informationen

Im Build 2015 werden unter „HTTP/2 in Windows 10: Browser, Apps und Webserver“ HTTP/2 und die Client- und Serverimplementierungen in Windows ausführlicher besprochen.

Autoren: Mike Bishop, David So (mit Beiträgen von Rob Trace, Baris Caglar, Nazim Lala; vielen Dank dafür)