1) Pourquoi le protocole WebSockets est-il meilleur?
WebSockets est préférable pour les situations impliquant une communication à faible latence, en particulier pour les messages à client à faible latence. Pour les données du serveur au client, vous pouvez obtenir une latence assez faible en utilisant des connexions de longue date et un transfert en bloc. Cependant, cela n'aide pas avec la latence client-serveur qui nécessite une nouvelle connexion pour chaque message client-serveur.
Votre prise de contact HTTP de 48 octets n'est pas réaliste pour les connexions de navigateur HTTP réelles où il y a souvent plusieurs kilo-octets de données envoyées dans le cadre de la demande (dans les deux sens), y compris de nombreux en-têtes et données de cookies. Voici un exemple de demande / réponse à l'utilisation de Chrome:
Exemple de demande (2800 octets, y compris les données des cookies, 490 octets sans les données des cookies):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
Exemple de réponse (355 octets):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
HTTP et WebSockets ont des prises de contact de connexion initiale de taille équivalente, mais avec une connexion WebSocket, la prise de contact initiale est effectuée une fois, puis les petits messages n'ont que 6 octets de surcharge (2 pour l'en-tête et 4 pour la valeur de masque). La surcharge de latence ne vient pas tant de la taille des en-têtes, mais de la logique pour analyser / gérer / stocker ces en-têtes. De plus, la latence de configuration de la connexion TCP est probablement un facteur plus important que la taille ou le temps de traitement pour chaque demande.
2) Pourquoi a-t-il été implémenté au lieu de mettre à jour le protocole HTTP?
Des efforts sont en cours pour réorganiser le protocole HTTP pour obtenir de meilleures performances et une latence plus faible, tels que SPDY , HTTP 2.0 et QUIC . Cela améliorera la situation pour les requêtes HTTP normales, mais il est probable que WebSockets et / ou WebRTC DataChannel auront toujours une latence plus faible pour le transfert de données client à serveur que le protocole HTTP (ou il sera utilisé dans un mode qui ressemble beaucoup à WebSockets de toute façon).
Mettre à jour :
Voici un cadre pour réfléchir aux protocoles Web:
- TCP : couche de transport de bas niveau, bidirectionnelle, duplex intégral et garantie de commande. Pas de support de navigateur (sauf via plugin / Flash).
- HTTP 1.0 : protocole de transport requête-réponse en couches sur TCP. Le client fait une demande complète, le serveur donne une réponse complète, puis la connexion est fermée. Les méthodes de requête (GET, POST, HEAD) ont une signification transactionnelle spécifique pour les ressources sur le serveur.
- HTTP 1.1 : conserve la nature demande-réponse de HTTP 1.0, mais permet à la connexion de rester ouverte pour plusieurs demandes complètes / réponses complètes (une réponse par demande). Il y a toujours des en-têtes complets dans la demande et la réponse, mais la connexion est réutilisée et non fermée. HTTP 1.1 a également ajouté quelques méthodes de demande supplémentaires (OPTIONS, PUT, DELETE, TRACE, CONNECT) qui ont également des significations transactionnelles spécifiques. Cependant, comme indiqué dans l' introduction du projet de proposition HTTP 2.0, le pipelining HTTP 1.1 n'est pas largement déployé, ce qui limite considérablement l'utilité de HTTP 1.1 pour résoudre la latence entre les navigateurs et les serveurs.
- Long-poll : sorte de "hack" à HTTP (1.0 ou 1.1) où le serveur ne répond pas immédiatement (ou ne répond que partiellement avec des en-têtes) à la demande du client. Après une réponse du serveur, le client envoie immédiatement une nouvelle demande (en utilisant la même connexion si sur HTTP 1.1).
- Streaming HTTP : une variété de techniques (réponse en plusieurs parties / fragmentée) qui permettent au serveur d'envoyer plus d'une réponse à une seule demande client. Le W3C standardise cela en tant qu'événements envoyés par le serveur à l' aide d'un
text/event-stream
type MIME. L'API du navigateur (qui est assez similaire à l'API WebSocket) est appelée l'API EventSource.
- Poussée de comète / serveur : il s'agit d'un terme générique qui inclut à la fois le long poll et le streaming HTTP. Les bibliothèques de comètes prennent généralement en charge plusieurs techniques pour essayer de maximiser la prise en charge inter-navigateurs et inter-serveurs.
- WebSockets : une couche de transport TCP intégrée qui utilise une poignée de main de mise à niveau conviviale HTTP. Contrairement à TCP, qui est un transport en continu, WebSockets est un transport basé sur les messages: les messages sont délimités sur le câble et sont réassemblés en totalité avant la livraison à l'application. Les connexions WebSocket sont bidirectionnelles, duplex intégral et de longue durée. Après la demande / réponse initiale de prise de contact, il n'y a pas de sémantique transactionnelle et il y a très peu de surcharge par message. Le client et le serveur peuvent envoyer des messages à tout moment et doivent gérer la réception des messages de manière asynchrone.
- SPDY : une proposition lancée par Google pour étendre HTTP en utilisant un protocole de fil plus efficace mais en conservant toutes les sémantiques HTTP (demande / réponse, cookies, encodage). SPDY introduit un nouveau format de trame (avec des trames à longueur préfixée) et spécifie un moyen de superposer les paires requête / réponse HTTP sur la nouvelle couche de trame. Les en-têtes peuvent être compressés et de nouveaux en-têtes peuvent être envoyés une fois la connexion établie. Il existe des implémentations réelles de SPDY dans les navigateurs et les serveurs.
- HTTP 2.0 : a des objectifs similaires à SPDY: réduire la latence et la surcharge HTTP tout en préservant la sémantique HTTP. Le brouillon actuel est dérivé de SPDY et définit une mise à niveau de prise de contact et de cadrage de données qui est très similaire à la norme WebSocket pour la prise de contact et le cadrage. Une autre proposition de brouillon HTTP 2.0 (httpbis-speed-Mobility) utilise en fait des WebSockets pour la couche de transport et ajoute le multiplexage SPDY et le mappage HTTP en tant qu'extension WebSocket (les extensions WebSocket sont négociées pendant la prise de contact).
- WebRTC / CU-WebRTC : propositions pour permettre la connectivité d'égal à égal entre les navigateurs. Cela peut permettre une communication à latence moyenne et maximale inférieure, car le transport sous-jacent est SDP / datagramme plutôt que TCP. Cela permet une livraison dans le désordre des paquets / messages, ce qui évite le problème TCP des pics de latence causés par les paquets abandonnés qui retardent la livraison de tous les paquets suivants (pour garantir la livraison dans l'ordre).
- QUIC : est un protocole expérimental visant à réduire la latence Web par rapport à celle de TCP. En surface, QUIC est très similaire à TCP + TLS + SPDY implémenté sur UDP. QUIC fournit un multiplexage et un contrôle de flux équivalent à HTTP / 2, une sécurité équivalente à TLS et une sémantique de connexion, une fiabilité et un contrôle de congestion équivalents à TCP. Étant donné que TCP est implémenté dans les noyaux du système d'exploitation et le micrologiciel du boîtier de médiation, apporter des modifications importantes à TCP est presque impossible. Cependant, puisque QUIC est construit sur UDP, il ne souffre pas de telles limitations. QUIC est conçu et optimisé pour la sémantique HTTP / 2.
Références :
- HTTP :
- Événement envoyé par le serveur :
- WebSockets :
- SPDY :
- HTTP 2.0 :
- WebRTC :
- QUIC :