HTTP/2 sur IIS
par David So
Compatibilité
Version | Notes |
---|---|
IIS 10.0 | La prise en charge de HTTP/2 a été introduite dans IIS 10.0 |
IIS 8.5 et versions antérieures | HTTP/2 n'était pas pris en charge avant IIS 10.0 |
Qu'est-ce que HTTP/2 ?
HTTP/2 est une refonte de la façon dont la sémantique HTTP circule sur les connexions TCP, et le support HTTP/2 est présent dans Windows 10 et Windows Server 2016. HTTP/2 est une évolution majeure après près de deux décennies d'utilisation de HTTP/1.1 et réduit l'impact de la latence et de la charge de connexion sur les serveurs web.
La principale avancée du protocole HTTP/1.1 a été l'utilisation de connexions persistantes pour traiter plusieurs demandes à la suite. Dans HTTP/2, une connexion persistante peut être utilisée pour traiter plusieurs requêtes simultanées. Ce faisant, HTTP/2 introduit plusieurs fonctionnalités supplémentaires qui améliorent l'efficacité du protocole HTTP sur le réseau.
Une connexion pour plusieurs requêtes
Chaque connexion TCP nécessite un aller-retour pour être établie. Si vous utilisez le cryptage, l’établissement d'une liaison TLS nécessite encore 1 ou 2 allers-retours. Tout cela se produit avant que le premier octet de la première réponse puisse être envoyé. En réutilisant une connexion existante au lieu d'en établir une nouvelle, ce surcoût peut être partagé par de nombreuses demandes. HTTP/2 réduit considérablement la nécessité pour une requête d'attendre qu'une nouvelle connexion soit établie ou qu'une connexion existante devienne inactive. Comme une connexion unique est multiplexée entre plusieurs requêtes, la requête peut généralement être envoyée immédiatement sans attendre que les autres requêtes se terminent.
Compression des en-têtes avec HPACK
Le protocole HTTP prend en charge la compression des données depuis des lustres. Les en-têtes, en revanche, sont envoyés sous forme de texte non compressé, avec beaucoup de redondance entre les demandes. (La plupart des en-têtes les plus longs sont envoyés avec exactement la même valeur à chaque requête !) HTTP/2 introduit HPACK, un système de compression pour les en-têtes HTTP qui réduit la redondance entre les requêtes.
La compression facilite le multiplexage, car les demandes sont plus petites. Cela permet aux clients de faire de nombreuses demandes dans leurs premiers paquets sur une connexion, alors que les fenêtres de contrôle de flux TCP sont encore petites.
Server push
Les demandes se présentent sous forme de modèles. Si un client demande une ressource, le serveur peut souvent prédire qu'il aura besoin d'autres ressources référencées sur la page. Dans le protocole HTTP/1.1, l'incorporation a été utilisée pour fournir ces ressources aux clients dans le cadre de la première réponse. L'incrustation a ses inconvénients, notamment le fait que la ressource incrustée ne peut être mise en cache pour être utilisée sur d'autres pages où elle pourrait également être référencée.
HTTP/2 introduit le concept de « push », c'est-à-dire que le serveur répond aux demandes que le client n'a pas encore formulées, mais qu'il prévoit qu'il le fera. Cela permet aux serveurs de continuer à fournir les avantages de latence de l'incorporation, mais sous une forme que le client peut mettre en cache et réutiliser sur d'autres pages.
Comment faire pour utiliser HTTP/2 ?
Vous le faites peut-être déjà ! Étant donné que presque tous les navigateurs prennent déjà en charge HTTP/2 dans leur version la plus récente, et les données actuelles montrent que plus de 50 % des utilisateurs sont déjà sur des navigateurs compatibles HTTP/2.
Sur le serveur, IIS fonctionnant sous Windows 10 ou Windows Server 2016 prend en charge HTTP/2.
IIS ne prend actuellement en charge HTTP/2 qu'avec TLS. Lors d'une connexion HTTPS à un serveur web exécutant IIS sous Windows 10, HTTP/2 est utilisé si le client et le serveur le prennent en charge. Dans IIS, nous avons mis en œuvre HTTP/2 de la manière la plus transparente possible ; vous ne devriez pas avoir besoin de modifier quoi que ce soit dans votre application pour que HTTP/2 fonctionne. Certaines optimisations HTTP/1.1 (partitionnement domaine, incorporation, etc.) ne sont plus recommandées dans HTTP/2, et vous devez donc prévoir de les supprimer à l'avenir.
Qu’en est-il du push ?
La fonction Server Push étant une nouvelle fonctionnalité de HTTP/2, il existe de nouvelles API que vous devez appeler pour en tirer parti. Lorsque vous appelez l’API PushPromise dans ASP.NET ou l’API HttpDeclarePush à partir d’un module natif IIS, vous fournissez l’URL et les en-têtes de requête facultatifs pour la requête que vous prévoyez d’effectuer par le client. Si la fonction push est prise en charge par la connexion sous-jacente, deux choses se produisent :
- Un message PUSH_PROMISE est envoyé au client, afin qu'il puisse vérifier si la ressource existe déjà dans le cache
- Une nouvelle requête est ajoutée à la file d'attente pour la ressource poussée
Si la connexion sous-jacente ne prend pas en charge le push (push désactivé par le client ou client HTTP/1.1), l'appel ne fait rien et renvoie un succès, de sorte que vous pouvez appeler l'API en toute sécurité sans avoir à vous préoccuper de savoir si le push est autorisé.
Paramètres IIS
Il n'y a pas de nouveaux paramètres de configuration IIS spécifiques à HTTP/2.
Dans Windows Server 2016 Tech Preview, il était question de définir une clé de registre « DuoEnabled ». Cela n’est plus requis. Comme indiqué ci-dessus, si la configuration du client et du serveur prend en charge HTTP/2, IIS utilisera HTTP/2 (ou reviendra à HTTP/1.1 si ce n'est pas possible).
Version du protocole d'enregistrement
La journalisation IIS comporte un champ « Version du protocole » qui est désactivé par défaut. L'activation de ce champ est utile si vous souhaitez savoir quelles requêtes sont envoyées via HTTP/2, HTTP/1.1, etc.
Dans l’interface utilisateur du Gestionnaire des services Internet, vous pouvez le trouver sous la fonctionnalité Journalisation, via Sélectionner des champs.
Après avoir apporté les modifications, cliquez sur Appliquer sous le volet Actions à l’extrême droite.
Voici un exemple de sortie de fichier journal avec le champ Version du protocole activé :
#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
Démonstration d'IIS avec HTTP/2
Si vous exécutez Windows 10, vous pouvez le trouver via Programmes et fonctionnalités, puis Activer ou désactiver les fonctionnalités Windows, puis activer la case à cocher Internet Information Services. Si vous exécutez Windows Server 2016, lancez Gestionnaire de serveur, puis Ajouter des rôles et des fonctionnalités dans le tableau de bord, puis sélectionnez Serveur web (IIS) dans la liste.
Une fois l’installation terminée, lancez le Gestionnaire des services Internet et créez un certificat auto-signé en sélectionnant l’option Certificats de serveur sous la vue Fonctionnalités du serveur. Notez que l'utilisation d'un certificat auto-signé dans cet exemple est uniquement à des fins de démonstration/test (non recommandé pour protéger vos sites de production).
Accédez à votre site web par défaut et, sous Liaisons, créez une liaison TLS avec le certificat auto-signé que vous venez de créer.
Lancez votre navigateur à partir de votre ordinateur Windows 10 ou Windows Server 2016 et appuyez sur F12 (ou accédez à Paramètres et activezOutils de développement F12), puis basculez vers l’onglet Réseau. Accédez à
https://localhost
et voilà, vous êtes sur HTTP/2 !
Quand HTTP/2 n'est-il pas pris en charge ?
Dans certains cas, HTTP/2 ne peut pas être utilisé en combinaison avec d'autres fonctionnalités. Dans ce cas, Windows revient à HTTP/1.1 et poursuit la transaction. Il peut s'agir de négocier HTTP/1.1 au cours de l'établissement d'une liaison ou d'envoyer un code d'erreur au client pour lui demander d'essayer à nouveau d'établir une connexion HTTP/1.1.
- L'Authentification Windows (NTLM/Kerberos/Negotiate) n'est pas prise en charge par HTTP/2. Dans ce cas, IIS reviendra à HTTP/1.1.
- Texte en clair ; comme indiqué ci-dessus, IIS ne prend actuellement en charge que le protocole HTTP/2 sur TLS. Là encore, IIS reviendra à HTTP/1.1.
- Limitation de la bande passante ; IIS dispose d'une fonction permettant de limiter la bande passante (dans Inetmgr, sélectionnez le site, « Limites » sous Configurer dans le volet Action). Cela s'applique à HTTP/1.1 mais n'est pas appliqué pour HTTP/2 (qui se déroulera sans erreur ni limitation de la bande passante).
Pour plus d'informations
Voir la présentation Build 2015 HTTP/2 dans Windows 10 : navigateur, applications et serveur Web pour une discussion plus approfondie sur HTTP/2 et les implémentations client et serveur dans Windows.
Auteurs : Mike Bishop, David So (avec la contribution et les remerciements de Rob Trace, Baris Caglar, Nazim Lala)