Вопрос по websocket, gzip – Может ли websocket поддерживать сжатие gzip?

20

После успешного рукопожатия WebSocket, мы могли бы использовать сжатие gzip?

Вот мои тесты:

I use autobahn lib to build a server, then respon to client as:
HTTP/1.1 101 Switching Protocols content-encoding: gzip Connection: Upgrade Server: AutobahnPython/?.?.? Upgrade: WebSocket Sec-WebSocket-Accept: RIR8KmljoV8Cv9mdiLY7GM2nYMc= then my server uses gzip compression and the chrome browser got the result, but it told me that "could not decode a text frame as UTF-8"
AutobahnPython теперь поддерживает «permessage-deflate». Вы можете протестировать его с Chrome Canary (в настоящее время это единственный браузер, реализующий его). Вам понадобится ветка permessage_deflate на GitHub AutobahnPython или дождитесь версии 0.6.0 - скоро выйдет. oberstet
AutobahnPython (в настоящее время) не поддерживает расширение сжатия для каждого кадра. В любом случае сигнализация поддержки осуществляется через специальный HTTP-заголовок WebSocket, а не «content-encoding». oberstet
Спасибо за напоминание. В любом случае, есть простой способ поддержки сжатия gzip в качестве метода http при использовании websocket? littlesun
Любая удача заставить сжатие работать? Я очень заинтересован в этом сам. Dreen
Нет. Для использования сжатия в WebSocket необходимо реализовать расширение, для которого требуется значительный код «глубоко под капотом». oberstet

Ваш Ответ

3   ответа
0

Да, это может.Chrome 19+ поддерживает это.

"https://github.com/crossbario/autobahn-python/blob/master/examples/twisted/websocket/echo_compressed/server_advanced.py"

from twisted.internet import reactor
from twisted.web.server import Site
from twisted.web.static import File

from autobahn.twisted.websocket import WebSocketServerFactory, \
    listenWS

from autobahn.websocket.compress import *

def accept(offers):
    for offer in offers:
        return PerMessageDeflateOfferAccept(offer)

debug = True
factory = WebSocketServerFactory(u"ws://127.0.0.1:9000", debug=debug, debugCodePaths=debug)
factory.setProtocolOptions(perMessageCompressionAccept=accept)

listenWS(factory)

webdir = File(".")
web = Site(webdir)
reactor.listenTCP(8080, web)

reactor.run()

Больше информации:как PerMessageDeflateOffer используется в примерах автобана.

4

Eстьрасширение сжатия являющийсяработал над по IETF Websocket (HyBi) рабочая группа. Я бы предложил следовать их списку рассылки для получения актуальной информации. Я также рекомендую проверитьэтот вопрос.

Обновление 2017: расширение теперь доступно в течение некоторого времени, смотрите здесь:https://tools.ietf.org/html/rfc7692

По крайней мере, Chrome уже поддерживает это.
Спасибо за Дрин, это здорово. Я буду изучать расширение сжатия. Другие друзья учатся на нем? littlesun
Это уже не черновик. Пожалуйста, обратитесь кRFC 7692, Compression Extensions for WebSocket для предлагаемого стандарта.
@littlesun: Насколько я знаю, это расширение пока недоступно, так как над ним все еще ведутся работы (главное доказательство этого заключается в том, что они просто изменили его с устройства «на кадр» на «на сообщение»). ). Сам Javascript на самом деле не поддерживает какую-либо форму сжатия / распаковки. Я боюсь, что единственное решение на данный момент - это дождаться, пока ребята из IETF закончат спецификацию, и поставщики браузеров его реализуют ... Это не должно быть долгим, ИМХО, вероятно, это произойдет через пару месяцев.
Не могли бы вы сказать мне, как использовать? Я посмотрел в RFC 6455, но я не знаю, как использовать ... littlesun
8

Сжатие WebSocket включено в некоторых браузерах по умолчанию (во время написания, например, в Chrome, но не в Firefox). Клиент должен включать «Sec-WebSocket-Extensions: permessage-deflate» заголовок для этого. Если сервер отвечает тем же расширением, связь WebSocket сжимается по кадрам. Насколько я знаю, нет браузера API для включения / отключения расширений.

Хорошая статья на эту тему:https://www.igvita.com/2013/11/27/configuring-and-optimizing-websocket-compression/

Похожие вопросы