AccueilđŸ‡«đŸ‡·Chercher

Pipelining HTTP

Le pipelining HTTP est une technique consistant Ă  combiner plusieurs requĂȘtes HTTP dans une seule connexion TCP sans attendre les rĂ©ponses correspondant Ă  chaque requĂȘte.

Le pipelining présente plusieurs avantages :

  • amĂ©lioration importante du temps de chargement des pages, en particulier sur des liaisons prĂ©sentant une forte latence ;
  • rĂ©duction de la charge pour l'infrastructure rĂ©seau ainsi que pour les serveurs et clients HTTP.

Le pipelining nécessite, de la part du client aussi bien que du serveur, le support de la norme HTTP 1.1 telle que décrite dans la RFC 2616.

Principe

Schéma de connexions avec et sans pipelining.

Dans la version 1.0 du protocole HTTP, le traitement des requĂȘtes est sĂ©quentiel. Le client doit effectuer une nouvelle connexion TCP avec le serveur pour chaque objet (page, image, etc.) demandĂ© et attendre le rĂ©sultat avant de pouvoir poursuivre avec la requĂȘte suivante.

La technique du pipelining contourne ce problĂšme en exploitant le principe de connexion persistante (keepalive). Lorsque le client envoie une requĂȘte HTTP au serveur, celui-ci inclut dans sa rĂ©ponse la version du protocole HTTP utilisĂ©e. Si les deux extrĂ©mitĂ©s utilisent HTTP 1.1, la connexion sera par dĂ©faut persistante. Le client doit indiquer qu'il souhaite fermer la connexion persistante avec le message "Connection: close" lorsqu'il ne souhaite plus utiliser la connexion.

Le pipelining peut alors prendre place sans autre nĂ©gociation. Il consiste Ă  envoyer plusieurs requĂȘtes Ă  la suite sans attendre leurs rĂ©sultats. Le serveur HTTP a l'obligation de renvoyer les rĂ©ponses exactement dans le mĂȘme ordre que les requĂȘtes.

On remarquera que puisqu'il est nĂ©cessaire qu'il y ait un Ă©change complet entre client et serveur pour s'assurer qu'ils supportent bien tous les deux HTTP 1.1, les requĂȘtes constituant une nouvelle connexion ne peuvent pas ĂȘtre l'objet du pipelining. De mĂȘme, seules les requĂȘtes idempotentes[1] — telles que GET, HEAD, PUT et DELETE — peuvent faire l'objet du pipelining.

Avantages

L'utilisation du pipelining hérite plusieurs avantages de l'utilisation des connexions persistantes. Ces avantages sont résumés dans la section 8.1.1 de la RFC 2616 décrivant le protocole HTTP 1.1. Notamment :

  • En ouvrant et fermant moins de connexions TCP, routeurs et hĂŽtes (client, serveur, serveur mandataire, etc.) Ă©conomisent du temps CPU. Les hĂŽtes en particulier Ă©conomisent la mĂ©moire utilisĂ©e pour les blocs de contrĂŽle TCP ;
  • La congestion du rĂ©seau est diminuĂ©e par la rĂ©duction du nombre de paquets dus Ă  l'ouverture de la connexion TCP, et par le fait qu'on laisse suffisamment de temps Ă  TCP pour dĂ©terminer l'Ă©tat de congestion du rĂ©seau ;
  • La latence est rĂ©duite pour les requĂȘtes suivantes puisqu'on ne perd pas de temps Ă  cause de l'initialisation de la connexion TCP. De plus, en dĂ©but de connexion, l'algorithme Slow Start implique un dĂ©bit plus rĂ©duit que pour une connexion Ă©tablie.

L'avantage supplĂ©mentaire Ă  l'utilisation du pipelining est qu'un client peut effectuer plusieurs requĂȘtes sans attendre chaque rĂ©ponse, permettant Ă  une seule connexion TCP d'ĂȘtre utilisĂ©e avec plus d'efficacitĂ©, dans un temps plus court. Le concept est similaire aux mĂ©canismes de fenĂȘtre glissante dans TCP ou fenĂȘtre d'anticipation dans HDLC.

ProblĂšmes

Le W3C a conduit en 1997 une étude sur les performances obtenues grùce aux nouveaux standards de l'époque qu'étaient HTTP 1.1, CSS1 et PNG. L'application construite à l'occasion de ces tests utilisait le pipelining. Les résultats ont montré que HTTP 1.1 avec connexions persistantes et pipelining réduisait d'un facteur 6 le nombre de paquets envoyés mais introduisait une latence supplémentaire d'un facteur 1,5 à la grande surprise des auteurs. HTTP 1.1 est dans tous les cas plus rapide avec pipelining que sans.

Les auteurs de l'Ă©tude ont conclu Ă  une possible interfĂ©rence entre le pipelining et l'algorithme de Nagle mis en Ɠuvre par TCP. Celui-ci effectue en effet, au niveau 4 du modĂšle OSI, le mĂȘme type de mise en tampon des donnĂ©es que le pipelining au niveau 7. Cette succession de mise en tampon introduit un dĂ©lai supplĂ©mentaire Ă  l'envoi des donnĂ©es. C'est pourquoi il est recommandĂ© pour les clients et les serveurs utilisant HTTP 1.1 avec pipelining de dĂ©sactiver purement et simplement l'algorithme de Nagle, ce qui est habituellement possible dans l'interface BSD socket via l'option TCP_NODELAY.

Ce problÚme avait également été identifié en 1997 par John Heidemann dans une étude portant sur les connexions persistantes dans HTTP. Il l'avait alors appelé « Short-Signal-Segment Problem ». Plusieurs autres problÚmes provenant d'interaction entre TCP et HTTP 1.1 sont abordés dans son étude mais concernent les connexions persistantes et pas seulement le pipelining.

Par ailleurs, le pipelining perd son intĂ©rĂȘt lorsqu'une requĂȘte est bloquante et nĂ©cessite d'attendre son rĂ©sultat pour pouvoir procĂ©der Ă  l'envoi de requĂȘtes HTTP subsĂ©quentes. En cas d'Ă©chec on doit alors retenter la requĂȘte. Aucune ressource n'est donc Ă©conomisĂ©e au niveau de TCP. Un tel cas de figure se produit par exemple lorsqu'un client reçoit des rĂ©ponses 401 ou 407 ou mĂȘme des redirections 3xx (voir Liste des codes HTTP) en rĂ©ponse Ă  une HTTP Authentification.

Pipelining et serveurs mandataires

La RFC 2616 indique que lorsqu'une connexion fait l'objet de pipelining, les rĂ©ponses doivent ĂȘtre envoyĂ©es dans le mĂȘme ordre que les requĂȘtes. Lorsqu'un serveur mandataire se trouve entre le serveur et le client, il doit donc en faire autant. Or un client peut accĂ©der Ă  plusieurs serveurs simultanĂ©ment Ă  travers le serveur mandataire, imposant Ă  celui-ci de conserver en mĂ©moire l'ordre des requĂȘtes pour chaque paire client/serveur.

Cette opération s'avÚre rapidement complexe lorsqu'on augmente le nombre de clients et implique de temporiser les réponses pour pallier les problÚmes de déséquencement qui peuvent apparaßtre dans un réseau TCP/IP[2]. Les difficultés augmentent encore lorsqu'on tente de profiter du serveur mandataire pour répartir la charge sur plusieurs serveurs web.

Implémentations

La norme HTTP 1.1 impose de supporter le pipelining sans pour autant rendre son usage obligatoire. Ce sont les clients qui prennent la décision d'utiliser le pipelining si le serveur le supporte.

  • Clients :
    • Google Chrome supporte le pipelining de maniĂšre expĂ©rimentale (donc dĂ©sactivĂ© par dĂ©faut).
    • Mozilla Firefox 2.0 et 3.0 supportent le pipelining mais le dĂ©sactivent par dĂ©faut[3].
    • Opera supporte le pipelining depuis la version 4.0 et l'active par dĂ©faut[4].
    • Internet Explorer 8 ne supporte pas le pipelining.
  • Serveurs :
    • Apache supporte le pipelining depuis (au moins) la version 1.3.
    • IIS supporte le pipelining depuis la version 4.0[5]. Ce support Ă©tant dĂ©fectueux, il a Ă©tĂ© supprimĂ© dans les versions suivantes.
  • Serveurs mandataires

La plupart des serveurs mandataires sont capables de servir un client qui fait du pipelining. Cependant, ils ne sont pas capables d'envoyer des requĂȘtes pipelinĂ©es vers le serveur en amont.

La seule exception connue est Polipo, qui utilise le pipelining de façon agressive. Voir The Polipo Manual: 1.4.2 Pipelining.

Références

Notes

  1. (en) Voir RFC 2616, section 9.1.2, Idempotent Methods
  2. (fr) Gestion d'une connexion HTTP avec pipelining dans un proxy
  3. (en) Voir Firefox Help: Tips & Tricks, Enable pipelining.
  4. (en) Voir Opera 4.0 Upgrades File Exchange: Includes HTTP 1.1.
  5. (en) Voir Microsoft Internet Information Server Ressource Kit, Chapter 1.
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.