1) Warum ist das WebSockets-Protokoll besser?
WebSockets ist besser für Situationen geeignet, in denen Kommunikation mit geringer Latenz erforderlich ist, insbesondere für Situationen mit geringer Latenz für Client-Server-Nachrichten. Bei Server-zu-Client-Daten kann die Latenz durch lang anhaltende Verbindungen und Chunked-Übertragung relativ gering sein. Dies hilft jedoch nicht bei der Latenz von Client zu Server, bei der für jede Client-zu-Server-Nachricht eine neue Verbindung hergestellt werden muss.
Ihr 48-Byte-HTTP-Handshake ist für reale HTTP-Browserverbindungen nicht realistisch, bei denen häufig mehrere Kilobyte Daten als Teil der Anforderung gesendet werden (in beide Richtungen), einschließlich vieler Header und Cookie-Daten. Hier ist ein Beispiel für eine Anfrage / Antwort auf die Verwendung von Chrome:
Beispielanforderung (2800 Bytes einschließlich 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 Handshakes für die anfängliche Verbindung gleicher Größe. Bei einer WebSocket-Verbindung wird der anfängliche Handshake jedoch einmal ausgeführt, und kleine Nachrichten haben nur 6 Byte Overhead (2 für den Header und 4 für den Maskenwert). Der Latenzaufwand hängt nicht so sehr von der Größe der Header ab, sondern von der Logik zum Parsen / Behandeln / Speichern dieser Header. Darüber hinaus ist die Latenz beim Einrichten der TCP-Verbindung wahrscheinlich ein größerer Faktor als die Größe oder Verarbeitungszeit für jede Anforderung.
2) Warum wurde es implementiert, anstatt das HTTP-Protokoll zu aktualisieren?
Es wird versucht, das HTTP-Protokoll neu zu entwickeln, um eine bessere Leistung und eine geringere Latenz wie SPDY , HTTP 2.0 und QUIC zu erzielen . Dies verbessert die Situation für normale HTTP-Anforderungen, aber es ist wahrscheinlich, dass WebSockets und / oder WebRTC DataChannel immer noch eine geringere Latenz für die Datenübertragung von Client zu Server aufweisen als das HTTP-Protokoll (oder es wird in einem Modus verwendet, der WebSockets sehr ähnlich sieht Sowieso).
Update :
Hier ist ein Rahmen zum Nachdenken über Webprotokolle:
- TCP : Low-Level-, bidirektionale, Vollduplex- und garantierte Auftragstransportschicht. Keine Browserunterstützung (außer über Plugin / Flash).
- HTTP 1.0 : Auf TCP geschichtetes Request-Response-Transportprotokoll. Der Client stellt eine vollständige Anfrage, der Server gibt eine vollständige Antwort und dann wird die Verbindung geschlossen. Die Anforderungsmethoden (GET, POST, HEAD) haben eine spezifische Transaktionsbedeutung für Ressourcen auf dem Server.
- HTTP 1.1 : Behält die Anforderungs-Antwort-Natur von HTTP 1.0 bei, ermöglicht jedoch, dass die Verbindung für mehrere vollständige Anforderungen / vollständige Antworten (eine Antwort pro Anforderung) offen bleibt. Die Anforderung und Antwort enthält weiterhin vollständige Header, die Verbindung wird jedoch wiederverwendet und nicht geschlossen. HTTP 1.1 hat auch einige zusätzliche Anforderungsmethoden (OPTIONS, PUT, DELETE, TRACE, CONNECT) hinzugefügt, die ebenfalls spezifische Transaktionsbedeutungen haben. Wie in der Einführung zum Entwurf des HTTP 2.0-Entwurfs erwähnt, ist das HTTP 1.1-Pipelining jedoch nicht weit verbreitet, sodass der Nutzen von HTTP 1.1 zur Lösung der Latenz zwischen Browsern und Servern stark eingeschränkt wird.
- Lange Umfrage : Eine Art "Hack" auf HTTP (entweder 1.0 oder 1.1), bei dem der Server nicht sofort (oder nur teilweise mit Headern) auf die Clientanforderung reagiert. Nach einer Serverantwort sendet der Client sofort eine neue Anforderung (über HTTP 1.1 wird dieselbe Verbindung verwendet).
- HTTP-Streaming : Eine Vielzahl von Techniken (mehrteilige / blockierte Antwort), mit denen der Server mehr als eine Antwort auf eine einzelne Clientanforderung senden kann. Das W3C standardisiert dies als vom Server gesendete Ereignisse unter Verwendung eines
text/event-stream
MIME-Typs. Die Browser-API (die der WebSocket-API ziemlich ähnlich ist) wird als EventSource-API bezeichnet.
- Comet / Server Push : Dies ist ein Überbegriff, der sowohl Long-Poll- als auch HTTP-Streaming umfasst. Comet-Bibliotheken unterstützen normalerweise mehrere Techniken, um die browser- und serverübergreifende Unterstützung zu maximieren.
- WebSockets : Eine auf TCP basierende Transportschicht, die einen HTTP-freundlichen Upgrade-Handshake verwendet. Im Gegensatz zu TCP, einem Streaming-Transport, handelt es sich bei WebSockets um einen nachrichtenbasierten Transport: Nachrichten werden auf der Leitung begrenzt und vor der Übermittlung an die Anwendung vollständig neu zusammengestellt. WebSocket-Verbindungen sind bidirektional, Vollduplex und langlebig. Nach der ersten Handshake-Anforderung / Antwort gibt es keine Transaktionssemantik und nur sehr wenig Overhead pro Nachricht. Der Client und der Server können jederzeit Nachrichten senden und müssen den Nachrichtenempfang asynchron behandeln.
- SPDY : Ein von Google initiierter Vorschlag zur Erweiterung von HTTP mithilfe eines effizienteren Kabelprotokolls unter Beibehaltung der gesamten HTTP-Semantik (Anforderung / Antwort, Cookies, Codierung). SPDY führt ein neues Rahmenformat (mit Rahmen mit Längenpräfix) ein und gibt eine Möglichkeit an, HTTP-Anforderungs- / Antwortpaare auf die neue Rahmenebene zu schichten. Header können komprimiert und neue Header gesendet werden, nachdem die Verbindung hergestellt wurde. Es gibt reale Implementierungen von SPDY in Browsern und Servern.
- HTTP 2.0 : hat ähnliche Ziele wie SPDY: Reduzierung der HTTP-Latenz und des Overheads unter Beibehaltung der HTTP-Semantik. Der aktuelle Entwurf ist von SPDY abgeleitet und definiert ein Upgrade-Handshake und Datenframing, das dem WebSocket-Standard für Handshake und Framing sehr ähnlich ist. Ein alternativer HTTP 2.0-Entwurfsvorschlag (httpbis-speed-mobility) verwendet tatsächlich WebSockets für die Transportschicht und fügt das SPDY-Multiplexing und die HTTP-Zuordnung als WebSocket-Erweiterung hinzu (WebSocket-Erweiterungen werden während des Handshakes ausgehandelt).
- WebRTC / CU-WebRTC : Vorschläge zur Ermöglichung der Peer-to-Peer-Konnektivität zwischen Browsern. Dies kann eine Kommunikation mit niedrigerer durchschnittlicher und maximaler Latenz ermöglichen, da der zugrunde liegende Transport eher SDP / Datagramm als TCP ist. Dies ermöglicht die Zustellung von Paketen / Nachrichten außerhalb der Reihenfolge, wodurch das TCP-Problem von Latenzspitzen vermieden wird, die durch verworfene Pakete verursacht werden und die Zustellung aller nachfolgenden Pakete verzögern (um die Zustellung in der Reihenfolge zu gewährleisten).
- QUIC : ist ein experimentelles Protokoll zur Reduzierung der Weblatenz gegenüber TCP. An der Oberfläche ist QUIC TCP + TLS + SPDY sehr ähnlich, das auf UDP implementiert ist. QUIC bietet Multiplexing und Flusskontrolle, die HTTP / 2 entsprechen, Sicherheit, die TLS entspricht, sowie Verbindungssemantik, Zuverlässigkeit und Überlastungskontrolle, die TCP entsprechen. Da TCP in Betriebssystemkernen und in der Middlebox-Firmware implementiert ist, ist es nahezu unmöglich, wesentliche Änderungen an TCP vorzunehmen. Da QUIC jedoch auf UDP aufbaut, unterliegt es keinen solchen Einschränkungen. QUIC wurde für die HTTP / 2-Semantik entwickelt und optimiert.
Referenzen :
- HTTP :
- Vom Server gesendetes Ereignis :
- WebSockets :
- SPDY :
- HTTP 2.0 :
- WebRTC :
- QUIC :