443 votes

WebSockets vs de protocole HTTP

Il existe beaucoup de blogs et de discussions à propos de websocket et HTTP, et de nombreux développeurs et les sites fermement défendre les websockets, mais je n'arrive toujours pas à comprendre pourquoi.

par exemple (les arguments de websocket les amateurs):

Websockets HTML5 représente la prochaine évolution de la communication web-un full-duplex, le canal de communication bidirectionnel qui opère à travers un socket unique sur le Web. ( http://www.websocket.org/quantum.html )

HTTP soutient streaming: le corps de la requête de diffusion(vous l'utilisez alors que le téléchargement de fichiers volumineux) et le corps de la réponse en streaming.

Cours de mise en relation avec WebSocket, le client et le serveur échangent des données par trame qui est de 2 octets chacun, par rapport à 8 kilo-octets d'en-tête http lorsque vous effectuez une interrogation continue.

Pourquoi est-ce que les 2 octets de ne pas inclure tcp et en vertu de protocoles tcp dessus?

GET /about.html HTTP/1.1
Host: example.org

C'est ~48 octets d'en-tête http.

http fragments de codage - 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
  • Ainsi, les frais généraux par chaque morceau n'est pas très grande.

Également dans le protocole fonctionne sur TCP, de sorte que tous TCP problèmes à long live les connexions sont toujours là.

Question:

  1. Pourquoi est-websockets protocole de mieux?
  2. Pourquoi était-il mis en œuvre au lieu de la mise à jour du protocole http?

657voto

kanaka Points 23143

1) Pourquoi les WebSockets protocole de mieux?

Les WebSockets est mieux pour les situations qui impliquent un faible temps de latence de communication, notamment pour de faibles temps de latence pour le client vers le serveur de messages. Pour le serveur de données de clients que vous pouvez obtenir assez faible latence à l'aide de la longue-tenue des connexions et des fragments de transfert. Cependant, cela n'aide pas avec le client pour la latence du serveur qui nécessite une nouvelle connexion pour chaque client vers le serveur de messages.

Votre 48 octets HTTP poignée de main n'est pas réaliste dans le monde réel HTTP connexions navigateur où il y a souvent plusieurs kilo-octets de données transmises dans le cadre de la demande (dans les deux sens), y compris de nombreux en-têtes et les données de cookie. Voici un exemple de requête/réponse à l'aide de google Chrome:

Exemple de demande (2800 octets, y compris les données des cookies, 490 octets sans les 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

HTTP et les WebSockets avoir l'équivalent de la taille initiale de la connexion des poignées de main, mais avec une connexion WebSocket la poignée de main initiale est effectuée une seule fois et puis des petits messages seulement 6 octets de surcharge (2 pour l'en-tête et de 4 pour la valeur de masque). Le temps de latence de frais généraux n'est pas tant la taille des en-têtes, mais de la logique pour analyser/gérer/stockage de ces en-têtes. En outre, la connexion TCP configuration du temps de latence est probablement un facteur plus grand que la taille ou le temps de traitement de chaque demande.

2) Pourquoi il a été mis en œuvre au lieu de la mise à jour du protocole HTTP?

Il y a des efforts à re-concevoir le protocole HTTP pour obtenir de meilleures performances et une faible latence tels que SPDY et HTTP 2.0. Cela permettra d'améliorer la situation normale pour les requêtes HTTP, mais il est probable que les WebSockets et/ou WebRTC DataChannel auront toujours un temps de latence inférieur pour le client vers le serveur de transfert de données de protocole HTTP (ou il sera utilisé dans un mode qui ressemble beaucoup à WebSockets de toute façon).

Mise à jour:

Ici, c'est un cadre de réflexion sur les protocoles web:

  • TCP: bas niveau, bi-directionnel, full-duplex, et de la garantie de l'ordre de la couche de transport. Pas de prise en charge du navigateur (sauf via un plugin ou d'un Flash).
  • HTTP 1.0: requête-réponse de protocole de transport en couches sur le protocole TCP. Le client fait une requête, le serveur donne une réponse complète, et la connexion est fermée. La demande de méthodes (GET, POST, HEAD) transactionnelle sens pour les ressources sur le serveur.
  • HTTP 1.1: maintient la requête-réponse de la nature de HTTP 1.0, mais permet la connexion à rester ouvert à de multiples requêtes complètes/réponses complètes (une seule réponse par demande). A encore plein les en-têtes de la requête et de la réponse, mais la connexion est de nouveau utilisé et ne sont pas fermées. HTTP 1.1, a également ajouté quelques autres méthodes de demande (OPTIONS, PUT, DELETE, TRACE, CONNECT) qui ont aussi spécifique transactionnelle significations. Cependant, comme mentionné dans l' introduction de la HTTP 2.0, le projet de proposition, HTTP 1.1 pipeline n'est pas largement déployé donc cela limite grandement l'utilité de HTTP 1.1 pour résoudre la latence entre les navigateurs et les serveurs.
  • Long-sondage: une sorte de "hack" pour HTTP (1.0 ou 1.1) où le serveur n'a pas de réponse immédiatement (ou n'y répond que partiellement avec les 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 plus de HTTP 1.1).
  • Streaming HTTP: une variété de techniques (multipart/fragments de réponse) qui permettent au serveur d'envoyer plus d'une réponse à une simple demande du client. Le W3C est la standardisation de ce que le Serveur a Envoyé des Événements à l'aide d'un text/event-stream type MIME. Le navigateur de l'API (qui est assez similaire à l'API WebSocket) est appelé le EventSource API.
  • La comète/server push: c'est un terme générique qui comprend les deux long-sondage et streaming HTTP. La comète bibliothèques en général de l'aide de multiples techniques pour essayer de maximiser la croix-navigateur et de la croix-serveur.
  • Les WebSockets: une couche de transport intégré sur TCP qui utilise un HTTP amicale de Mise à niveau de la poignée de main. Contrairement à TCP, qui est un flux de transport, les WebSockets est un message en fonction du transport des messages: les messages sont délimitées sur le fil et sont ré-assemblés en complet avant la livraison de l'application. WebSocket connexions sont bidirectionnelles en duplex intégral et à long terme. Après la poignée de main initiale de demande/réponse, il n'y a pas de sémantique transactionnelle et il est très peu par message généraux. Le client et le serveur peut envoyer des messages à tout moment et doit gérer la réception de message asynchrone.
  • SPDY: Google a initié une proposition visant à étendre HTTP à l'aide plus efficace le fil de protocole, mais le maintien de tous HTTP sémantique (demande/réponse, les cookies, l'encodage). SPDY introduit un nouveau format de trame (avec la longueur de préfixe de cadres) et spécifie un moyen de superposition de requête/réponse HTTP paires sur le nouveau cadrage de la couche. Les en-têtes peuvent être compressés et de nouveaux en-têtes peuvent être envoyés après que la connexion a été établie. Il y a du monde réel implémentations de SPDY dans les navigateurs et les serveurs.
  • HTTP 2.0: a des objectifs similaires à SPDY: réduire HTTP latence et les frais généraux tout en préservant HTTP sémantique. Le projet actuel est dérivé de SPDY et définit une mise à niveau de la poignée de main et des données de cadrage, qui est très semblable à la le WebSocket standard pour l'établissement de liaisons et d'encadrement. Un autre HTTP 2.0 projet de proposition (httpbis à la vitesse de la mobilité) utilise les WebSockets pour la couche de transport et ajoute le SPDY de multiplexage et de HTTP cartographie comme un WebSocket extension (WebSocket extensions sont négociés au cours de la poignée de main).
  • WebRTC/CU-WebRTC: propositions pour permettre peer-to-peer de la connectivité entre les navigateurs. Cela peut permettre à la baisse de la moyenne et maximale de la latence de communication parce que, comme le transport sous-jacent est SDP/datagramme plutôt que TCP. Cela vous permet de commander la livraison de paquets/messages, ce qui évite de TCP problème des pics de latence causée par la perte de paquets, qui retardent la livraison de tous les paquets suivants (pour garantir la livraison dans l'ordre).

Références:

179voto

Philipp Points 22441

Vous semblez supposer que WebSocket est un remplacement pour HTTP. Il n'est pas. C'est une extension.

Les principaux cas d'utilisation des WebSockets sont Javascript applications qui s'exécutent dans le navigateur web et de recevoir des données en temps réel à partir d'un serveur. Les jeux sont un bon exemple.

Avant les WebSockets, la seule méthode pour des applications Javascript pour interagir avec un serveur par le biais XmlHttpRequest. Mais elles ont un inconvénient majeur: Le serveur ne peut pas envoyer de données, sauf si le client a expressément demandé.

Mais la nouvelle WebSocket permet au serveur d'envoyer des données à chaque fois qu'il veut. Cela permet de mettre en œuvre basée sur le navigateur de jeux avec beaucoup moins de latence et sans avoir à utiliser laid hacks comme AJAX le long du scrutin ou plug-ins de navigateur.

Alors pourquoi ne pas faire un usage normal l'adresse HTTP en streaming avec les demandes et les réponses

Dans un commentaire à une autre réponse vous a suggéré de juste de flux de la demande du client et le corps de la réponse de manière asynchrone.

En fait, les WebSockets sont essentiellement que. Une tentative d'ouverture d'une connexion WebSocket de la client ressemble à une requête HTTP au premier abord, mais une directive spéciale dans l'en-tête (Mise à jour: websocket) indique au serveur de communiquer dans ce mode asynchrone. Les premiers projets de protocole WebSocket n'étaient pas beaucoup plus que cela et certains serrer la main pour s'assurer que le serveur comprend que le client veut communiquer de manière asynchrone. Mais ensuite il s'est rendu compte que les serveurs proxy serait troublé par ça, parce qu'ils sont utilisés à l'habitude de requête/réponse modèle de HTTP. Un potentiel scénario d'attaque contre les serveurs proxy a été découvert. Pour éviter cela, il était nécessaire de faire WebSocket trafic look à la différence de tout le trafic HTTP. C'est pourquoi le masquage clés ont été introduites dans la version finale du protocole.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X