0%

Wenn der Server Neuigkeiten hat

Eine Verbindung, beide Richtungen

Long Polling lässt den Server antworten, sobald eine Neuigkeit eintrifft, aber jede Antwort beendet eine Anfrage. Server-Sent Events lassen den Server weiterschreiben, aber nur den Server. Die Anzeigetafel braucht beides zugleich: Zuschauer, die jede Änderung in dem Moment hören, in dem sie passiert, und einen Punktezähler, der Punktestände sendet, wann immer eine Frage bewertet ist. Ein ist die Verbindung, die genau dafür gebaut ist. Diese Lektion zählt auf, was er bietet, und der Rest des Kurses baut ihn.

Vier Dinge, die ein WebSocket bietet

  1. Eine Verbindung, die offen bleibt. Ein Zuschauer verbindet sich einmal, zu Beginn des Abends, und behält dieselbe , bis das Quiz endet. Für die nächste Neuigkeit ist keine neue Anfrage nötig.

  2. Beide Seiten dürfen jederzeit senden. Das nennt man Vollduplex (full duplex). Der Server sendet eine Änderung des Punktestands in dem Moment, in dem sie passiert, ohne gefragt zu werden, und ein Client sendet, wann immer er etwas zu sagen hat, ohne auf den Server zu warten. Keine der beiden Nachrichten ist eine Antwort auf die andere.

  3. Daten kommen als ganze Nachrichten an. Aus Networks with Python weißt du, dass TCP ein Byte-Stream ohne Grenzen ist: Zwei nacheinander gesendete Nachrichten können zusammengeklebt oder in Stücke geschnitten ankommen. Deshalb verpackt ein WebSocket jede Nachricht in einen , ähnlich wie dein Protokoll mit Längenpräfix in jenem Kurs eine Länge vor jede Nachricht gesetzt hat. Der Leser bekommt Owls 12 als eine Nachricht, nie Ow und dann ls 12. Kapitel 3 nimmt diese Frames Byte für Byte auseinander.

  4. Er beginnt als -Anfrage. Der Client öffnet eine Verbindung zu denselben wie HTTP und sendet zuerst eine gewöhnliche HTTP-Anfrage, sodass alles, was HTTP bereits verarbeitet, vertraute erste Bytes sieht. Diese Anfrage bittet den Server, die Verbindung auf das WebSocket-Protokoll umzustellen, und wenn der Server zustimmt, trägt dieselbe Verbindung von da an WebSocket-Nachrichten. Diese Umstellung heißt .

Die Punkte 1 und 2 sind das, was Long Polling und Server-Sent Events dir nicht zusammen geben konnten. Punkt 3 macht eine langlebige Verbindung für Nachrichten brauchbar, und Punkt 4 ist die Art, wie sie startet, ohne dass zwischen Client und Server etwas Neues nötig ist.

Was eine Nachricht kostet

Sobald die Verbindung offen ist, trägt eine Nachricht kaum mehr als ihre eigenen Bytes. Der Frame-Anteil vor einer Nachricht, die der Server sendet und die bis zu 125 Bytes lang ist, beträgt 2 Bytes. Eine Nachricht von einem Client an einen Server trägt 6, weil Clients einen 4 Byte langen hinzufügen, den Kapitel 4 erklärt. Der größte Frame-Anteil, den eine Nachricht haben kann, beträgt 14 Bytes, für sehr große Nachrichten von einem Client.

Vergleiche das mit einer leeren Abfrage aus Lektion 2: eine Anfragezeile, ein Host-Header und ein If-None-Match-Header auf dem Hinweg und eine Statuszeile und ein ETag-Header auf dem Rückweg, nur um zu erfahren, dass sich nichts geändert hat. Allein die Anfragezeile GET /scores HTTP/1.1 hat vor ihrem Zeilenende 20 Bytes, und der Frame-Header einer kurzen Nachricht hat 2. Auf einem WebSocket muss niemand fragen, also sendet eine Minute ohne Neuigkeiten überhaupt keine Anfragen.

Ein Server sendet Owls 12 (7 Bytes) über einen WebSocket an einen Zuschauer. Wie viele Bytes Frame-Anteil gehören dazu?

Vier Techniken nebeneinander

Im Bild bekommt jede Technik zwei Zeitlinien, den Client oben und den Server unten, und die Zeit läuft nach rechts; eine Raute ist eine Änderung des Punktestands. Folge jeder Raute zu dem Pfeil, der sie zum Client bringt.

Beim Polling wartet jede Änderung des Punktestands auf die nächste zeitgesteuerte Anfrage, und die meisten Antworten sind leer, während Long Polling, Server-Sent Events und ein WebSocket jede Änderung liefern, sobald sie passiert, und ein WebSocket Nachrichten auf einer Verbindung in beide Richtungen trägt.

Die Tabelle sagt dasselbe in Spalten:

TechnikWer jeden Austausch beginntRichtungVerspätungKosten pro Nachricht
Pollingder Client, nach Zeitplander Client fragt, der Server antwortetungefähr das halbe Intervalleine vollständige Anfrage und Antwort, plus viele leere
Long Pollingder Clientder Client fragt, der Server antwortet, wenn es Neuigkeiten gibtungefähr ein Weg durch das Netzwerkeine vollständige Anfrage und Antwort
Server-Sent Eventsder Client, einmal; dann der Servernur vom Server zum Clientungefähr ein Weg durch das Netzwerkein paar Bytes in der offenen Antwort
WebSocketder Client, einmal; dann beide Seitenin beide Richtungen auf einer Verbindungungefähr ein Weg durch das Netzwerkein paar Bytes Frame-Anteil

Die Tabelle lässt den WebSocket jedes Mal wie den Sieger aussehen, und das ist er nicht. Polling ist die einfachste der vier Techniken, und wenn Neuigkeiten selten sind, kosten ein paar Anfragen pro Stunde fast nichts. Server-Sent Events passen gut, wenn nur der Server Neuigkeiten hat. Ein WebSocket lohnt seinen zusätzlichen Aufwand, wenn beide Seiten oft reden.

Zuschauer brauchen jede Änderung des Punktestands sofort, und der Punktezähler sendet Änderungen aus derselben App. Was passt am besten?

Eine Statusseite aktualisiert einmal pro Stunde ein Diagramm, und es wird nie etwas an den Server zurückgesendet. Was passt am besten?

Was bedeutet Vollduplex bei einem WebSocket?

Ein WebSocket beginnt als gewöhnliche HTTP-Anfrage, und eine HTTP-Anfrage erwartet eine Antwort und ist dann fertig. Wie kann aus dieser Anfrage eine Verbindung werden, die nie endet? Das ist das Rätsel von Kapitel 2, in dem du beide Seiten des Eröffnungs-Handshakes selbst schreibst.