Il existe de nombreux blogs et discussions sur Websocket et HTTP, et de nombreux développeurs et sites préconisent fortement les websockets, mais je ne comprends toujours pas pourquoi.
par exemple (arguments des amateurs de websocket):
HTML5 Web Sockets représente la prochaine évolution des communications Web: un canal de communication bidirectionnel en duplex intégral fonctionnant via un seul socket sur le Web. ( http://www.websocket.org/quantum.html )
HTTP prend en charge la diffusion: requête de diffusion en continu (vous l'utilisez lors du téléchargement de fichiers volumineux) et réponse en continu.
Lors de la connexion à WebSocket, le client et le serveur échangent des données par trame de 2 octets chacune, contre 8 kilo-octets d’en-tête http lors d’une interrogation continue.
Pourquoi ces 2 octets n'incluent-ils pas TCP et les frais généraux des protocoles TCP?
GET /about.html HTTP/1.1
Host: example.org
C'est l'en-tête http de ~ 48 octets.
encodage http chunked - http://ru.wikipedia.org/wiki/Chunked_transfer_encoding :
23
This is the data in the first chunk
1A
and this is the second one
3
con
8
sequence
0
De plus, les deux protocoles fonctionnent sur TCP, de sorte que tous les TCP problèmes liés aux connexions longue durée sont toujours présents.
Question:
1) Pourquoi le protocole WebSockets est-il meilleur?
WebSockets est préférable pour les situations impliquant une communication à faible temps de latence, en particulier pour les messages client à serveur à faible temps de latence. Pour les données serveur à client, vous pouvez obtenir une latence relativement faible en utilisant des connexions de longue durée et un transfert fractionné. Toutefois, cela n’aide en rien avec la latence client à serveur, qui nécessite l’établissement d’une nouvelle connexion pour chaque message client à serveur.
Votre négociation HTTP à 48 octets n'est pas réaliste pour les connexions de navigateur HTTP réelles où plusieurs kilo-octets de données sont souvent envoyés 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 pour utiliser Chrome:
Exemple de demande (2800 octets comprenant des données de cookie, 490 octets sans données de cookie):
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
Les connexions HTTP et WebSockets ont une négociation initiale de taille équivalente, mais avec une connexion WebSocket, la négociation initiale est effectuée une fois, puis les petits messages ne disposent que de 6 octets de surcharge (2 pour l'en-tête et 4 pour la valeur de masque). La surcharge de latence ne provient pas tellement de la taille des en-têtes, mais de la logique d'analyse/de traitement/de stockage de 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 de chaque demande.
2) Pourquoi a-t-il été mis en œuvre au lieu de mettre à jour le protocole HTTP?
Des efforts sont en cours pour repenser le protocole HTTP afin d'obtenir de meilleures performances et une latence moindre, tels que SPDY , HTTP 2. 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 inférieure pour le transfert de données client à serveur par rapport au protocole HTTP (ou qu'il sera utilisé dans un mode qui ressemble beaucoup à WebSockets. de toute façon).
Mise à jour :
Voici un cadre pour réfléchir aux protocoles Web:
text/event-stream
MIME. L'API du navigateur (qui est assez similaire à l'API WebSocket) s'appelle l'API EventSource.Références :
Vous semblez supposer que WebSocket remplace HTTP. Ce n'est pas. C'est une extension.
Les principaux cas d'utilisation de WebSockets sont des applications Javascript qui s'exécutent dans le navigateur Web et reçoivent des données en temps réel d'un serveur. Les jeux sont un bon exemple.
Avant WebSockets, la seule méthode permettant aux applications Javascript d'interagir avec un serveur consistait à utiliser XmlHttpRequest
. Mais ceux-ci présentent un inconvénient majeur: le serveur ne peut pas envoyer de données à moins que le client ne l’ait explicitement demandé.
Mais la nouvelle fonctionnalité WebSocket permet au serveur d’envoyer des données à tout moment. Cela permet d’implémenter des jeux basés sur un navigateur avec une latence bien inférieure et sans avoir à utiliser d’incroyables hacks comme AJAX des plugins de longue interrogation ou de navigateur.
Alors pourquoi ne pas utiliser HTTP normal avec des requêtes et des réponses en streaming
Dans un commentaire à une autre réponse, vous avez suggéré de simplement diffuser la requête du client et le corps de la réponse de manière asynchrone.
En fait, les WebSockets sont fondamentalement cela. Une tentative d'ouvrir une connexion WebSocket à partir du client ressemble à une requête HTTP, mais une directive spéciale dans l'en-tête (Upgrade: websocket) indique au serveur de commencer à communiquer en mode asynchrone. Premiers brouillons du protocole WebSocket n'étaient pas beaucoup plus que cela et une poignée de main pour s'assurer que le serveur comprend réellement que le client veut communiquer de manière asynchrone. Mais on s'est rendu compte que cela dérouterait les serveurs proxy, car ils sont habitués au modèle de requête/réponse habituel de HTTP. Un scénario d'attaque potentielle contre les serveurs proxy a été découvert. Pour éviter cela, il était nécessaire de rendre le trafic WebSocket différent de tout trafic HTTP normal. C'est pourquoi les clés de masquage ont été introduites dans la version finale du protocole .
Pour le TL; DR, voici 2 centimes et une version plus simple pour vos questions:
WebSockets offre ces avantages sur HTTP:
WebSocket et le protocole HTTP ont été conçus pour résoudre différents problèmes, I.E. WebSocket a été conçu pour améliorer la communication bidirectionnelle alors que HTTP a été conçu pour être sans état, distribué à l'aide d'un modèle de requête/réponse. Hormis le partage des ports pour des raisons héritées (pénétration de pare-feu/proxy), il n’ya pas vraiment de terrain commun pour les combiner en un seul protocole.
Je ne pense pas que nous puissions les comparer côte à côte pour savoir qui est meilleur. Ce ne sera pas une comparaison juste simplement parce qu'ils résolvent deux problèmes différents . Leurs exigences sont différentes. Ce sera comme comparer des pommes à des oranges. Ils sont différents.
HTTP est un protocole de requête-réponse. Le client (navigateur) veut quelque chose, le serveur le lui donne. C'est. Si le client de données souhaite une taille importante, le serveur peut envoyer des données en streaming afin d’annuler les problèmes de mémoire tampon indésirables. Ici, la principale exigence ou le principal problème est de savoir comment faire la demande des clients et comment répondre aux ressources (hybertext) qu'ils demandent. C'est là que HTTP brille.
En HTTP, seule la demande du client. Le serveur répond seulement.
WebSocket n'est pas un protocole de requête-réponse où seul le client peut demander. C'est une socket (très similaire à TCP socket). Une fois la connexion ouverte, chaque côté peut envoyer des données jusqu'à ce que la connexion TCP soit soulignée. C'est comme une prise normale. La seule différence avec TCP socket est que websocket peut être utilisé dans Web. En web, nous avons beaucoup de restrictions pour un socket normal. La plupart des pare-feu bloquent les ports autres que 80 et 433 utilisés par HTTP. Les procurations et les intermédiaires seront également problématiques. Pour faciliter le déploiement du protocole sur les infrastructures existantes, utilisez Websocket pour établir une liaison HTTP. Cela signifie que, lorsque la première connexion va s'ouvrir, le client a envoyé une requête HTTP au serveur en lui disant: "Ce n'est pas une requête HTTP, veuillez effectuer la mise à niveau vers le protocole websocket".
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Une fois que le serveur a compris la demande et mis à niveau vers le protocole websocket, le protocole HTTP ne s’applique plus.
Donc, ma réponse est Ni l'un ni l'autre ne sont meilleurs l'un que l'autre. Ils sont complètement différents.
Eh bien, nous pouvons tout créer sous le nom appelé HTTP également. Mais allons-nous? Si ce sont deux choses différentes, je préférerai deux noms différents. Il en va de même pour Hickson et Michael Carter .
Les autres réponses ne semblent pas toucher ici à un aspect clé, à savoir que vous ne mentionnez pas la nécessité de prendre en charge un navigateur Web en tant que client. La plupart des limitations du simple HTTP ci-dessus supposent que vous travailleriez avec des implémentations de navigateur/JS.
Le protocole HTTP est entièrement capable de communiquer en duplex intégral. il est légal de demander à un client d'effectuer un POST avec un transfert d'encodage en bloc, et à un serveur de renvoyer une réponse avec un corps d'encodage en bloc. Cela enlèverait la surcharge d'en-tête juste au moment de l'initialisation.
Donc, si tout ce que vous recherchez est en duplex intégral, contrôlez le client et le serveur, et ne vous intéressez pas aux fonctions supplémentaires de cadrage/Websockets, alors je dirais que HTTP est une approche plus simple avec une latence plus faible/CPU (bien que la latence ne différerait vraiment qu'en microsecondes ou moins pour les deux).
Une API normale REST utilise HTTP comme protocole de communication sous-jacent, qui suit le paradigme de la demande et de la réponse, ce qui signifie que le client demande des données ou des ressources à un serveur et que le serveur y répond. client. Cependant, HTTP étant un protocole sans état, chaque cycle de requête-réponse finira par devoir répéter les informations d'en-tête et de métadonnées. Cela entraîne une latence supplémentaire en cas de cycles demande-réponse fréquemment répétés.
Avec WebSockets , bien que la communication commence toujours par une négociation HTTP initiale, il convient de mettre à niveau le protocole WebSockets (c.-à-d. Si le serveur et le client sont conformes au protocole car toutes les entités ne prennent pas en charge le protocole WebSockets).
Maintenant, avec WebSockets , il est possible d’établir une connexion en duplex intégral et persistante entre le client et un serveur. Cela signifie que, contrairement à une demande et à une réponse, la connexion reste ouverte tant que l'application est en cours d'exécution (c'est-à-dire persistante) et, vu qu'elle est en duplex intégral, une communication simultanée bidirectionnelle est possible, c'est-à-dire que le serveur est maintenant capable de démarrer. une communication et une transmission de données au client lorsque de nouvelles données (qui intéressent le client) sont disponibles.
Le protocole WebSockets est dynamique et vous permet d'implémenter le modèle de messagerie Publish-Subscribe (ou Pub/Sub) qui est le concept principal utilisé dans les technologies temps réel dans lesquelles vous pouvez obtenir de nouvelles mises à jour. la forme du serveur Push sans que le client ait à demander (actualiser la page) à plusieurs reprises. Parmi les exemples de telles applications, citons le suivi de la localisation d'Uber car, les notifications push, la mise à jour des prix de la bourse en temps réel, les discussions en ligne, les jeux multijoueurs, les outils de collaboration en direct, etc.
Vous pouvez consulter un article de plongée approfondie sur Websockets qui explique l'historique de ce protocole, son origine, son utilisation et sa mise en oeuvre.
Voici une vidéo d'une présentation que j'ai faite sur WebSockets et sur la différence entre leur utilisation et l'utilisation des API REST normales: Normalisation et exploitation de la croissance exponentielle du flux de données