Page 272 - Web性能权威指南
P. 272

并确认要在商定连接中使用的扩展。下面我们就来看一个 Upgrade 的例子。



                              WebSocket 多路复用与压缩在现实中的应用
                   截止到 2013 年年中,WebSocket 的多路复用还没有得到任何主流浏览器支持。类
                   似地,对压缩扩展的支持也很有限:谷歌 Chrome 和最新的 WebKit 浏览器可能会
                   向服务器发送“x-webkit-deflate-frame”扩展。然而这个 deflate-frame 是基于该标
                   准的过时版本实现的,将来可能会被抛弃。

                   压缩扩展的早期版本是“逐帧”压缩,这对要分成多个帧的大消息显然不是最佳
                   方法。最新版本已经修改为以消息为单位压缩,这是好消息。坏消息是,以消息
                   为单位压缩还是实验性的,目前尚未得到主流浏览器支持。

                   结果,就是应用需要密切关注传输的数据类型,并在可行的情况下采用自己的压
                   缩方案。换句话说,至少在所有主流浏览器原生支持 WebSocket 之前,你要考虑
                   这个方案。这对移动应用尤为重要,因为移动应用中的每个字节都可能给用户带
                   来不必要的成本。


                 17.2.3 HTTP升级协商

                 WebSocket 协议提供了很多强大的特性:基于消息的通信、自定义的二进制分帧层、
                 子协议协商、可选的协议扩展,等等。换句话说,在交换数据之前,客户端必须与
                 服务器协商适当的参数以建立连接。
                 利用 HTTP 完成握手有几个好处。首先,让 WebSockets 与现有 HTTP 基础设施兼
                 容:WebSocket 服务器可以运行在 80 和 443 端口上,这通常是对客户端唯一开放
                 的端口。其次,让我们可以重用并扩展 HTTP 的 Upgrade 流,为其添加自定义的
                 WebSocket 首部,以完成协商。

                 •   Sec-WebSocket-Version
                   客户端发送,表示它想使用的 WebSocket 协议版本(“13”表示 RFC  6455)。如
                   果服务器不支持这个版本,必须回应自己支持的版本。

                 •   Sec-WebSocket-Key
                   客户端发送,自动生成的一个键,作为一个对服务器的“挑战”,以验证服务器
                   支持请求的协议版本。

                 •   Sec-WebSocket-Accept
                   服务器响应,包含 Sec-WebSocket-Key 的签名值,证明它支持请求的协议版本。





                                                                            WebSocket   |   261
   267   268   269   270   271   272   273   274   275   276   277