4.3 握手中使用的新的头字段的 ABNF这一节中将使用定义在 ABNF 语法/规则,包括隐含的 LWS 规则(implied *LWS rule)。为了便于阅读,这里给出 LWS 的简单定义:任意数量的空格,水平 tab 或者换行(换行指的是 CR(carriage return) 后面跟着 LF(linefeed),使用转义字符表示就是 \r\n)。
注意,接下来的一些 ABNF 约定将运用于这一节。一些规则的名称与与之对应的头字段相关。这些规则表示相应的头字段的值的语法,比如 Sec-WebSocket-Key ABNF 规则,它描述了 |Sec-WebSocket-Key| 头字段的值的语法。名字中具有 -Client 后缀的 ABNF 规则,表示的是客户端向服务端发送请求时的字段值语法;名字中具有 -Server 后缀的 ABNF 规则,表示的是服务端向客户端发送请求时的字段值语法。比如 ABNF 规则 Sec-WebSocket-Protocol-Client 描述了 |Sec-WebSocket-Protocol| 存在与由客户端发送到服务端的请求中的语法。
接下来新头字段可以在握手期间由客户端发往服务端:
View Code
下面的新字段可以在握手期间由服务端发往客户端:
Sec-WebSocket-Extensions = extension-listSec-WebSocket-Accept = base64-value-non-emptySec-WebSocket-Protocol-Server = tokenSec-WebSocket-Version-Server = 1#version
4.4 支持多个版本的 WebSocket 协议这一节对在客户端和服务端之间提供多个版本的 WebSocket 协议提供了一些指导意见。
使用 WebSocket 的版本公告能力(|Sec-WebSocket-Version| 头字段),客户端可以指明它期望的采用的协议版本(不一定就是客户端已经支持的最新版本)。如果服务端支持相应的请求版本号的话,则握手可以继续,如果服务端不支持请求的版本号,它必须回应一个(或多个) |Sec-WebSocket-Version| 头字段,包含所有它支持的版本。这时,如果客户端也支持服务端的其中一个协议的话,它就可以使用新的版本号去重复客户端握手的步骤。
下面的例子可以作为上文提到的版本协商的演示:
客户端发送:
[url=][/url]
GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: Upgrade...Sec-WebSocket-Version: 25[url=][/url]
服务端的返回看起来类似:
HTTP/1.1 400 Bad Request...Sec-WebSocket-Version: 13, 8, 7
注意,服务器也可以返回下面的内容:
HTTP/1.1 400 Bad Request...Sec-WebSocket-Version: 13Sec-WebSocket-Version: 8, 7
客户端现在就可以重新采用版本 13 (如果客户端也支持的话)进行握手请求了:
[url=][/url]
GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: Upgrade...Sec-WebSocket-Version: 13 |