【问题标题】:Could websocket support gzip compression?websocket 可以支持 gzip 压缩吗?
【发布时间】:2012-07-25 09:28:05
【问题描述】:

WebSocket握手成功后,我们可以使用gzip压缩吗?

这是我的测试:

  1. 我使用 autobahn lib 构建服务器,然后响应客户端为:
    HTTP/1.1 101 Switching Protocols content-encoding: gzip Connection: Upgrade Server: AutobahnPython/?.?.? Upgrade: WebSocket Sec-WebSocket-Accept: RIR8KmljoV8Cv9mdiLY7GM2nYMc=
  2. 那么我的服务器使用 gzip 压缩
  3. chrome 浏览器得到了结果,但它告诉我“无法将文本帧解码为 UTF-8”

【问题讨论】:

  • AutobahnPython(当前)不支持每帧压缩扩展。在任何情况下,支持信号都是通过 WebSocket 特定的 HTTP 标头完成的,而不是“内容编码”。
  • 感谢提醒。无论如何,在使用 websocket 时,有一种简单的方法可以支持 gzip 压缩作为 http 方法吗?
  • 没有。为了在 WebSocket 上使用压缩,需要实现扩展,这需要“深入底层”的大量代码。
  • 压缩工作是否成功?我自己对此很感兴趣。
  • AutobahnPython 现在支持“permessage-deflate”。您可以使用 Chrome Canary(目前唯一实现它的浏览器)对其进行测试。您需要 AutobahnPython GitHub 上的 permessage_deflate 分支或等待 0.6.0 - 即将发布。

标签: websocket gzip


【解决方案1】:

默认情况下,某些浏览器中启用了 WebSocket 压缩(在撰写本文时,例如在 Chrome 中,但在 Firefox 中未启用)。客户端必须为此包含“Sec-WebSocket-Extensions: permessage-deflate”标头。如果服务器使用相同的扩展名进行响应,则 WebSocket 通信会以帧为单位进行压缩。据我所知,没有用于启用/禁用扩展的浏览器 API。

关于该主题的一篇好文章是:https://www.igvita.com/2013/11/27/configuring-and-optimizing-websocket-compression/

【讨论】:

    【解决方案2】:

    IETF Websocket (HyBi) 工作组有一个compression extensionworked on。我建议关注他们的邮件列表以获取最新信息。我还建议查看this question


    2017 年更新:该扩展现已推出一段时间,请参见此处:https://www.rfc-editor.org/rfc/rfc7692

    【讨论】:

    • 你能告诉我如何使用吗?我确实在 RFC 6455 中查找过,但我不知道如何使用...
    • 感谢 Dreen,太好了。我将研究压缩扩展。有其他朋友在研究吗?
    • @littlesun:据我所知,此扩展尚不可用,因为它仍在开发中(主要证据是他们只是将其从“每帧”更改为“每条消息”设备)。 Javascript 本身并不真正支持任何形式的压缩/解压缩。恐怕目前唯一的解决方案是等待 IETF 人员完成规范并等待浏览器供应商实施......这应该不会太久,恕我直言,它可能会在几个月内发生。
    • 已经不是草稿了。建议标准请参考RFC 7692, Compression Extensions for WebSocket
    • IETF 目前官方只定义了“permessage-deflate”。根据RFC 7692, Compression Extensions for WebSocket。 permessage-gzip 尚未得到 IETF 的正式支持。您可以在此处关注IETF mails 以获取最新更新。
    【解决方案3】:

    是的,它可以。 Chrome 19+ supports it.

    "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()
    

    更多信息:how PerMessageDeflateOffer is used in Autobahn examples

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2015-07-14
      • 2011-07-29
      相关资源
      最近更新 更多