2012-04-08 3 views
6

StackOverflow verwendet die GZip-Codierung auf allen ihren Seiten; das selbe scheint für ihren Websocket-Verkehr wahr zu sein, da es völlig verschleiert scheint.WebSocket-Verkehrscodierung (GZip)

enter image description here

Wie/Was würden sie dies zu erreichen, verwenden; Was müsste ich tun, um dasselbe zu erreichen, da mein Websocket-Server auf einem eigenen separaten Server ohne IIS usw. gehostet wird?

Bemerkenswert auch, dass die http compression nicht auf ihre Websocket-Verbindungsanforderung eingestellt ist.


Voll log Screenshot: http://i44.tinypic.com/19s4yr.jpg

+0

Aus Interesse, wie geht es schnüffelst du den Websocket-Verkehr? Es ist auch erwähnenswert, dass der Klartextteil der obigen Nachricht 19 Bytes lang ist, so dass er möglicherweise nicht tatsächlich verschleiert ist. – simonc

+0

@simonc Ich habe es tatsächlich nur zufällig gesehen, warum ich durch das Logbuch stöbere; Ich werde den Post mit einem Screenshot von dem, wie er auf Fiddler aussieht, aktualisieren. Was könnte es dann sein, da mein Websocket-Verkehr im Klartext ist. – f0x

Antwort

6

Nach RFC6455, WebSocket Nutzlast vom Client zum Server muss maskiert werden, Server zum Client maskiert werden darf nicht. Die Maskierung erfolgt durch XORring-Payload mit 32-Bit-Maske. Der Wert, den Sie in Ihrem Log sehen.

Beim Kochen gibt es eine WS-Erweiterung, die eine rahmenbasierte Komprimierung (Deflated) ermöglicht. Das hat nichts mit Maskierung zu tun. Payload mit aktivierter Per-Frame-Komprimierung komprimiert die Payload und maskiert dann die Payload (Client zu Server).

+0

danke, Kumpel! Könntest du mich vielleicht auf eine solche Maskierungsimplementierung hinweisen, vielleicht auf das .net-Framework? Da der Wert in meinem Screenshot oben auf den Client maskiert ist, ist die SO-Implementierung nach Spezifikation falsch? – f0x

+0

Der Screenshot lautet: "68 Bytes vom Browser empfangen .. Nachricht masking true". Also, wenn das von Browser zu Server maskierte Payload ist, dann ist es in Ordnung. Sollte es tatsächlich Server-zu-Client sein, dann bricht es die Spezifikation. Die Spezifikation ist klar darüber: DARF NICHT. – oberstet

+0

Der Maskierungsalgorithmus ist trivial: Nutzlast [i]^= Maske [i% 4], wobei Nutzlast und Maske Byte-Arrays sind, und ich indexiere die Frame-Nutzlast. – oberstet

1

Ich glaube nicht, dass es hier ein Gzipping gibt. Es sieht so aus, als hätte Fiddler begonnen, Unterstützung für Websockets hinzuzufügen, aber es ist immer noch in Arbeit.

Das Protokoll zeigt eine Verbindung
... dann eine erste Nachricht von 12 Bytes (461.287-Inbox. Die anfängliche Byte 81 8C einen neuen, vollständigen Textrahmen mit 4-Byte-Maske und 12 Bytes von Daten zeigen. Fiedler korrekt decodiert dies.)
... dann eine zweite Nachricht von 19 Bytes (die Bytes 81 93 - 19 Bytes in den Stream - zeigen einen neuen, vollständigen, Textrahmen mit 4 Byte Maske und 19 Bytes Daten)
. ..dann eine dritte Nachricht von 19 Bytes (die späteren Bytes 81 93 - ca. 44 Bytes in den Stream - zeigen einen neuen, vollständigen, Textrahmen mit 4 Byte Maske und 19 Bytes Daten)

+0

danke, Kumpel. Ich könnte Ihnen ein Logbuch meiner WebSocket Implementierung zeigen, wo der vollständige Text angezeigt wird. – f0x

+0

ah natürlich, ich sehe, dass die Maskierung ist in der Tat "falsch", so ist in der Tat nur die Verschleierung der Nutzlast. http://i43.tinypic.com/2n8tug1.png oh und +1 haha ​​:) – f0x