1) Warum ist das WebSockets-Protokoll besser?
WebSockets eignen sich besser für Situationen, in denen eine Kommunikation mit geringer Latenz erforderlich ist, insbesondere für eine geringe Latenz bei Nachrichten zwischen Client und Server. Für Server-zu-Client-Daten können Sie eine ziemlich niedrige Latenzzeit erreichen, wenn Sie lange gehaltene Verbindungen und Chunked-Transfer verwenden. Dies hilft jedoch nicht bei der Latenz von Client zu Server, da für jede Client zu Server Nachricht eine neue Verbindung aufgebaut werden muss.
Ihr 48-Byte-HTTP-Handshake ist nicht realistisch für reale HTTP-Browserverbindungen, bei denen oft mehrere Kilobyte an Daten als Teil der Anfrage (in beide Richtungen) gesendet werden, einschließlich vieler Kopfzeilen und Cookie-Daten. Hier ist ein Beispiel für eine Anfrage/Antwort mit Chrome:
Beispielanfrage (2800 Bytes mit Cookie-Daten, 490 Bytes ohne Cookie-Daten):
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]]]
Beispielantwort (355 Bytes):
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
Sowohl HTTP als auch WebSockets haben gleich große anfängliche Verbindungs-Handshakes, aber bei einer WebSocket-Verbindung wird der anfängliche Handshake nur einmal durchgeführt, und dann haben kleine Nachrichten nur 6 Bytes Overhead (2 für den Header und 4 für den Maskenwert). Der Latenz-Overhead entsteht nicht so sehr durch die Größe der Header, sondern durch die Logik zum Parsen/Handling/Speichern dieser Header. Darüber hinaus ist die Latenzzeit für den Aufbau der TCP-Verbindung wahrscheinlich ein größerer Faktor als die Größe oder die Verarbeitungszeit für jede Anfrage.
2) Warum wurde es anstelle einer Aktualisierung des HTTP-Protokolls eingeführt?
Es gibt Bestrebungen, das HTTP-Protokoll umzugestalten, um eine bessere Leistung und geringere Latenzzeiten zu erreichen, z. B. SPDY , HTTP 2.0 y QUIC . Dies wird die Situation für normale HTTP-Anfragen verbessern, aber es ist wahrscheinlich, dass WebSockets und/oder WebRTC DataChannel immer noch eine geringere Latenz für die Datenübertragung zwischen Client und Server haben als das HTTP-Protokoll (oder es wird in einem Modus verwendet, der ohnehin sehr wie WebSockets aussieht).
Update :
Hier ist ein Rahmen, um über Webprotokolle nachzudenken:
-
TCP Low-Level-, bidirektionale, Vollduplex- und garantierte Auftrags-Transportschicht. Keine Browser-Unterstützung (außer über Plugin/Flash).
-
HTTP 1.0 : Anfrage-Antwort-Transportprotokoll, das auf TCP aufbaut. Der Client stellt eine vollständige Anfrage, der Server gibt eine vollständige Antwort, und dann wird die Verbindung geschlossen. Die Anfragemethoden (GET, POST, HEAD) haben eine spezifische transaktionale Bedeutung für die Ressourcen des Servers.
-
HTTP 1.1 HTTP 1.0: Behält den Anfrage-Antwort-Charakter von HTTP 1.0 bei, erlaubt aber, dass die Verbindung für mehrere vollständige Anfragen/Antworten offen bleibt (eine Antwort pro Anfrage). Die Anfrage und die Antwort enthalten weiterhin vollständige Kopfzeilen, aber die Verbindung wird wiederverwendet und nicht geschlossen. HTTP 1.1 fügte auch einige zusätzliche Anfragemethoden hinzu (OPTIONS, PUT, DELETE, TRACE, CONNECT), die ebenfalls spezifische transaktionale Bedeutungen haben. Wie jedoch im Abschnitt Einführung Im Vergleich zum HTTP-2.0-Entwurf ist das HTTP-1.1-Pipelining nicht weit verbreitet, so dass der Nutzen von HTTP 1.1 zur Lösung von Latenzproblemen zwischen Browsern und Servern stark eingeschränkt ist.
-
Lange Abfrage Eine Art "Hack" für HTTP (entweder 1.0 oder 1.1), bei dem der Server nicht sofort (oder nur teilweise mit Headern) auf die Client-Anfrage antwortet. Nach einer Antwort des Servers sendet der Client sofort eine neue Anfrage (über dieselbe Verbindung, falls HTTP 1.1).
-
HTTP-Streaming eine Vielzahl von Techniken (Multipart/Chunked Response), die es dem Server ermöglichen, mehr als eine Antwort auf eine einzige Client-Anfrage zu senden. Das W3C standardisiert dies als Server-gesendete Ereignisse unter Verwendung einer text/event-stream
MIME-Typ. Die Browser-API (die der WebSocket-API recht ähnlich ist) wird EventSource-API genannt.
-
Comet/Server Push : Dies ist ein Oberbegriff, der sowohl Long-Poll als auch HTTP-Streaming umfasst. Comet-Bibliotheken unterstützen in der Regel mehrere Techniken, um die Browser- und Server-übergreifende Unterstützung zu maximieren.
-
WebSockets eine auf TCP aufbauende Transportschicht, die ein HTTP-freundliches Upgrade-Handshake verwendet. Im Gegensatz zu TCP, das ein Streaming-Transport ist, ist WebSockets ein nachrichtenbasierter Transport: Nachrichten werden auf der Leitung abgegrenzt und vor der Zustellung an die Anwendung wieder vollständig zusammengesetzt. WebSocket-Verbindungen sind bidirektional, voll-duplex und langlebig. Nach dem anfänglichen Handshake Anfrage/Antwort gibt es keine transaktionale Semantik und es fällt nur sehr wenig Overhead pro Nachricht an. Der Client und der Server können jederzeit Nachrichten senden und müssen den Empfang von Nachrichten asynchron verarbeiten.
-
SPDY SPDY ist ein von Google initiierter Vorschlag zur Erweiterung von HTTP durch ein effizienteres Leitungsprotokoll unter Beibehaltung aller HTTP-Semantiken (Anfrage/Antwort, Cookies, Kodierung). SPDY führt ein neues Framing-Format ein (mit längenpräfixierten Frames) und spezifiziert einen Weg, HTTP-Anfrage/Antwort-Paare auf die neue Framing-Schicht zu schichten. Kopfzeilen können komprimiert werden und neue Kopfzeilen können nach dem Verbindungsaufbau gesendet werden. SPDY wird in der Praxis in Browsern und Servern implementiert.
-
HTTP 2.0 : hat ähnliche Ziele wie SPDY: Verringerung der HTTP-Latenz und des Overheads unter Beibehaltung der HTTP-Semantik. Der aktuelle Entwurf ist von SPDY abgeleitet und definiert ein Upgrade-Handshake und ein Daten-Framing, das dem WebSocket-Standard für Handshake und Framing sehr ähnlich ist. Ein alternativer HTTP-2.0-Entwurf (httpbis-speed-mobility) verwendet WebSockets für die Transportschicht und fügt das SPDY-Multiplexing und HTTP-Mapping als WebSocket-Erweiterung hinzu (WebSocket-Erweiterungen werden während des Handshakes ausgehandelt).
-
WebRTC/CU-WebRTC : Vorschläge zur Ermöglichung von Peer-to-Peer-Verbindungen zwischen Browsern. Dies kann niedrigere durchschnittliche und maximale Latenzzeiten für die Kommunikation ermöglichen, da der zugrunde liegende Transport SDP/Datagramm und nicht TCP ist. Dies ermöglicht eine ungeordnete Zustellung von Paketen/Nachrichten, wodurch das TCP-Problem von Latenzspitzen vermieden wird, die durch verworfene Pakete verursacht werden, die die Zustellung aller nachfolgenden Pakete verzögern (um eine ordnungsgemäße Zustellung zu gewährleisten).
-
QUIC QUIC: ist ein experimentelles Protokoll, das die Latenzzeit im Internet gegenüber TCP verringern soll. Oberflächlich betrachtet ist QUIC sehr ähnlich wie TCP+TLS+SPDY auf UDP-Basis. QUIC bietet Multiplexing und Flusskontrolle wie HTTP/2, Sicherheit wie TLS und Verbindungssemantik, Zuverlässigkeit und Staukontrolle wie TCP. Da TCP in Betriebssystem-Kernels und Middlebox-Firmware implementiert ist, ist es nahezu unmöglich, wesentliche Änderungen an TCP vorzunehmen. Da QUIC jedoch auf UDP aufbaut, unterliegt es keinen derartigen Beschränkungen. QUIC wurde für die Semantik von HTTP/2 entwickelt und optimiert.
Referenzen :
HTTP :
Server-gesendetes Ereignis :
WebSockets :
SPDY :
HTTP 2.0 :
WebRTC :
QUIC :