【译】 WebSocket 协议第九章——扩展(Extension)

概述

本文为 WebSocket 协议的第九章,本文翻译的主要内容为 WebSocket 扩展相关内容。服务器

有兴趣了解该文档以前几章内容的同窗能够见:post

扩展(协议正文)

WebSocket 能够请求该规范中提到的扩展,WebSocket 服务端能够接受其中一些或者全部的客户端请求的扩展。服务端禁止响应客户端没有请求过的扩展。若是扩展参数须要在客户端和服务端之间进行协商,这些参数必须根据参数所应用的扩展的规范来选择。ui

9.1 协商扩展

客户端经过 Sec-WebSocket-Extensions 请求头字段来请求扩展,请求头字段遵照 HTTP 的规则,它的值是经过 ABNF 定义的。注意这一节是经过 ABNF 语法/规则,包括“implied *LWS rule”。若是咱们客户端或者服务端在协商扩展收到了一个没有符合下面的 ABNF 规则的值,接收到错误的数据的这一方须要马上让 WebSocket 关闭链接spa

Sec-WebSocket-Extensions = extension-list
extension-list = 1#extension
extension = extension-token *( ";" extension-param )
extension-token = registered-token
registered-token = token
extension-param = token [ "=" (token | quoted-string) ]
	; 使用带引号的语法变量时,在引号字符后面的变量的值必须符合`token`变量 ABNF规范。
复制代码

注意,就像其余的 HTTP 请求头字段同样,这个请求头字段能够被切割成几行或者几行合并成一行。所以,下面这两段是等价的:翻译

Sec-WebSocket-Extensions: foo
Sec-WebSocket-Extensions: bar; baz=2
复制代码

是等价于:code

Sec-WebSocket-Extensions: foo, bar; baz=2
复制代码

任何一个扩展凭证都必须是一个注册过的凭证。(见底 11.4 节)。扩展所使用的任何参数都必须是定义给这个扩展的。注意,客户端只能建议使用任意存在的扩展而不能使用它们,除非服务端表示他们但愿使用这个扩展。orm

注意扩展的顺序是重要的。多个扩展中的任意的互相做用均可以被定义在这个定义扩展的文档中。在没有此类定义的状况下,客户端在其请求中列出的头字段表示其但愿使用的头字段的首选项,其中列出的第一个选项是最可取的。服务器在响应中列出的扩展表示链接实际使用的扩展。若是扩展修改了数据或者帧,对数据的操做顺序应该被假定为和连接开始握手的服务端响应的列举的扩展中的顺序相同。token

例如,若是有两个扩展”foo”和”bar”,而且服务端发送的头字段Sec-WebSocket-Extensions的值为”foo,bar”,那么对数据的操做顺序就是bar(foo(data)),是对数据自己的更改(例如压缩)或者“堆叠”的帧的更改。rem

可接受的扩展标头字段的非规范性示例(请注意,长线被折叠以便于阅读)以下:文档

Sec-WebSocket-Extensions: deflate-stream
Sec-WebSocket-Extensions: mux; max-channels=4; flow-control, deflate-stream
Sec-WebSocket-Extensions: private-extension
复制代码

服务端接受一个或者多个扩展字段,这些扩展字段是包含客户端请求的Sec-WebSocket-Extensions头字段扩展中的。任何经过服务端构成的可以响应来自客户端请求的参数的扩展参数,将由每一个扩展定义。

9.2 已知扩展

扩展为实现方式提供了一个机制,即选择使用附加功能协议。这个文档中不定义任何扩展,可是实现跨越使用单独定义的扩展。

相关文章
相关标签/搜索