Wie konstruiere ich Datenrahmen in WebSockets hybi 08+?

8

Da Chrome auf Version 14 aktualisiert wurde, ging es von Version drei des Entwurfs zu Version acht des Entwurfs .

Ich habe eine interne Chat-Anwendung, die auf WebSocket läuft, und obwohl ich den neuen Handshake funktioniert habe, hat sich das Daten-Framing anscheinend ebenfalls geändert. Mein WebSocket-Server basiert auf Nugget .

Hat irgendjemand WebSocket mit der Version acht des Entwurfs zu arbeiten und ein Beispiel dafür zu haben, wie man die über die Leitung gesendeten Daten einrahmen kann?

    
gislikonrad 12.08.2011, 12:30
quelle

3 Antworten

16

(Siehe auch: How kann ich WebSocket-Nachrichten serverseitig senden und empfangen? )

Es ist ziemlich einfach, aber es ist wichtig, das Format zu verstehen.

Das erste Byte ist fast immer 1000 0001 , wobei 1 "letztes Bild" bedeutet, die drei 0 s sind reservierte Bits ohne Bedeutung und das 0001 bedeutet, dass es ein Textrahmen ist ( welche Chrome mit der Methode ws.send() sendet.

( Update: Chrome kann jetzt auch binäre Frames mit ArrayBuffer senden. Die letzten vier Bits des ersten Bytes sind 0002 , Sie können also zwischen Text- und Binärdaten unterscheiden. Die Entschlüsselung der Daten funktioniert genau so.)

Das zweite Byte enthält ein 1 (was bedeutet, dass es "maskiert" (codiert) ist), gefolgt von sieben Bits, die die Rahmengröße darstellen. Wenn es zwischen 000 0000 und 111 1101 liegt, ist das die Größe. Wenn es 111 1110 ist, sind die folgenden 2 Bytes die Länge (weil es nicht in sieben Bits passen würde), und wenn es 111 1111 ist, sind die folgenden 8 Bytes die Länge (wenn sie auch nicht in zwei Bytes passen würde ).

Daran schließen sich vier Bytes an, die die "Masken" sind, die Sie zum Entschlüsseln der Rahmendaten benötigen. Dies geschieht mithilfe der XOR-Codierung, die eine der Masken verwendet, die durch indexOfByteInData mod 4 der Daten definiert sind. Die Dekodierung funktioniert einfach wie encodedByte xor maskByte (wobei maskByte ist indexOfByteInData mod 4 ).

Nun muss ich sagen, dass ich überhaupt keine Erfahrung mit C # habe, aber das ist ein Pseudocode (etwas JavaScript-Akzent, fürchte ich):

%Vor%

Sie können auch die Spezifikation herunterladen, die hilfreich sein kann (sie enthält natürlich alles, was Sie brauchen, um das Format zu verstehen).

    
pimvdb 12.08.2011, 20:22
quelle
8

Dieser c # Code funktioniert gut für mich. Dekodieren Sie Textdaten, die von einem Browser über einen Socket an einen c # -Server gesendet werden.

%Vor%     
Daniel Grossztein 29.07.2014 14:50
quelle
2

Um genauer zu sein, Chrome hat sich von der Hixie-76 Version des Protokolls verabschiedet zu der HyBi-10 Version des Protokolls. HyBi-08 bis HyBi-10 melden sich alle als Version 8, da sich nur der Spezifikationstext geändert hat und nicht das Kabelformat.

Das Framing hat sich von der Verwendung von '\ x00 ... \ xff' zu einem 2-7-Byte-Header für jeden Frame geändert, der unter anderem die Länge der Payload enthält. Es gibt ein Diagramm des Rahmenformats in Abschnitt 4.2 der Spezifikation . Beachten Sie auch, dass Daten vom Client (Browser) zum Server maskiert sind (4 Bytes der Client-Server-Frame-Header enthalten den Demaskierungsschlüssel).

Sie können sich websockify ansehen, das ist ein WebSockets zu TCP-Socket-Proxy / Bridge, den ich erstellt habe, um noVNC . Es ist in Python implementiert, aber Sie sollten in der Lage sein, die Idee von der encode_hybi und decode_hybi Routinen.

    
kanaka 12.08.2011 15:21
quelle

Tags und Links