概述本文为 WebSocket 协议的第十一章,本文翻译的主要内容为 WebSocket 的 IANA 相关注意事项。IANA 注意事项(协议正文)11.1 注册新 URI 协议11.1.1 注册 “ws” 协议ws URI 定义了 WebSocket 服务器和资源名称。URI 协议名称ws状态永久URI 协议语法使用 ABNF (RFC5234)语法和来自 URI 规范 RFC3986 的 ABNF 终端:“ws:” “//” authority path-abempty [ “?” query ]path-abempty 和 query RFC3986 部分组成了发送给服务端的资源名称,来标记需要的服务类型。其他的部分在 RFC3986 中定义了含义。URI 协议含义这个方案的唯一操作就是使用 WebSocket 协议打开一个连接。编码注意事项按照上面定义的语法排除的主机部分中的字符必须按照 RFC3987 中的规定从 Unicode 转换为 ASCII 或其替换字符。为了实现基于方案的规范化,国际化网域名称(IDN)主机组件的形式与 punycode 码之间的相互转化认为是等价的(见 RFC3987 第 5.3.3 节)。除了由上面语法排除的字符外,其他组件的字符在第一次转换为 UTF-8 字符时,必须从 Unicode 码转化到 ASCII 码,然后使用百分比编码格式替换对应的定义在 URI RFC3896 字符和国际化资源标识符(IRI) RFC3987 规范。应用/协议使用这个 URI 协议规范WebSocket Protocol互操作性注意事项使用 WebSocket 时需要使用 1.1 或者更高版本的 HTTP 协议。安全性注意事项见”安全性注意事项”一节。联系HYBI WG <hybi@ietf.org\>作者/更改控制者IETF <iesg@ietf.org\>关联RFC 645511.1.2 注册 “wss”协议一个 wss 的 URI 定义了一个 WebSocket 服务器和资源名称,表明通过这个链接的传输需要通过 TLS(包含标准的 TLS 能力例如数据保密性和完整性以及终端认证)来进行保护。URI 协议名称wss状态永久URI 协议语法使用 ABNF (RFC5234)语法和来自 URI 规范 RFC3986 的 ABNF 终端:“wss:” “//” authority path-abempty [ “?” query ]path-abempty 和 query RFC3986 部分组成了发送给服务端的资源名称,来标记需要的服务类型。其他的部分在 RFC3986 中定义了含义。URI 协议含义这个方案的唯一操作就是使用 WebSocket 协议打开一个连接,通过 TLS 加密。编码注意事项按照上面定义的语法排除的主机部分中的字符必须按照 RFC3987 中的规定从 Unicode 转换为 ASCII 或其替换字符。为了实现基于方案的规范化,国际化网域名称(IDN)主机组件的形式与 punycode 码之间的相互转化认为是等价的(见 RFC3987 第 5.3.3 节)。除了由上面语法排除的字符外,其他组件的字符在第一次转换为 UTF-8 字符时,必须从 Unicode 码转化到 ASCII 码,然后使用百分比编码格式替换对应的定义在 URI RFC3896 字符和国际化资源标识符(IRI) RFC3987 规范。应用/协议使用这个 URI 协议规范WebSocket Protocol互操作性注意事项使用 WebSocket 时需要使用 1.1 或者更高版本的 HTTP 协议。安全性注意事项见”安全性注意事项”一节。联系HYBI WG <hybi@ietf.org\>作者/更改控制者IETF <iesg@ietf.org\>关联RFC 645511.2 注册“WebSocket”协议升级关键值这一节描述一个在 HTTP 升级凭证注册的关键值,在 RFC2817 定义。凭证名称WebSocket作者/更改控制者IETF <iesg@ietf.org\>关联RFC 645511.3 注册新的 HTTP 头字段Sec-WebSocket-Key这一节描述一个注册在永久消息头字段名称中的头字段,在 RFC3864 定义。头字段名称Sec-WebSocket-Key应用协议http状态标准作者/更改控制者IETF说明文档RFC 6455关联信息这个头字段只用于 WebSocket 开始握手。Sec-WebSocket-Key 头字段是用在 WebSocket 开始握手阶段。它是通过客户端发送给服务端,这部分信息用于服务端证明收到一个有效的 WebSocket 握手操作的认证。这可以帮助确认服务端不会接收可能被用来向 WebSocket 服务任意发送数据的非 WebSocket 客户端的连接(例如 HTTP 客户端)。Sec-WebSocket-Key 头字段禁止在一个 HTTP 请求中出现多次。11.3.2 Sec-WebSocket-Extensions这一节描述一个注册在永久消息头字段名称中的头字段,在 RFC3864 定义。头字段名称Sec-WebSocket-Extensions应用协议http状态标准作者/更改控制者IETF说明文档RFC 6455关联信息这个头字段只用于 WebSocket 开始握手。Sec-WebSocket-Extensions 头字段是用于 WebSocket 开始握手阶段。它最开始是通过客户端发送给服务端,然后通过服务端发送给客户端,来对一个在连接中的协议级的扩展进行协商。Sec-WebSocket-Extensions 头字段可能会在一个 HTTP 请求中出现多次(这个逻辑是等价于一个单独的 Sec-WebSocket-Extensions 头字段包含所有值)。然而,Sec-WebSocket-Extensions 头字段在 HTTP 响应中不能出现超过1次。11.3.3 Sec-WebSocket-Accept这一节描述一个注册在永久消息头字段名称中的头字段,在 RFC3864 定义。头字段名称Sec-WebSocket-Accept应用协议http状态标准作者/更改控制者IETF说明文档RFC 6455关联信息这个头字段只用于 WebSocket 开始握手。Sec-WebSocket-Accpet 头字段是用于 WebSocket 开始握手阶段。它是通过服务端发送给客户端,用来确认服务端会初始化一个 WebSocket 连接。Sec-WebSocket-Accpet 头在一个 HTTP 响应中不允许出现超过1次。11.3.4 Sec-WebSocket-Protocol这一节描述一个注册在永久消息头字段名称中的头字段,在 RFC3864 定义。头字段名称Sec-WebSocket-Protocol应用协议http状态标准作者/更改控制者IETF说明文档RFC 6455关联信息这个头字段只用于 WebSocket 开始握手。Sec-WebSocket-Protocol 头字段是用于 WebSocket 开始握手阶段。它是从客户端发送给服务端,然后从服务端返回给服务端来确认连接的子协议。这个机制能够让双方选择一个子协议,同时向服务端确认可以支持这个子协议。Sec-WebSocket-Protocol 头字段可以在一个 HTTP 请求中出现多次(这个逻辑是等价于一个单独的 Sec-WebSocket-Protocol 头字段包含所有值)。然而, Sec-WebSocket-Protocol 头字段在 HTTP 响应中不能出现超过1次。11.3.5 Sec-WebSocket-Version这一节描述一个注册在永久消息头字段名称中的头字段,在 RFC3864 定义。头字段名称Sec-WebSocket-Version应用协议http状态标准作者/更改控制者IETF说明文档RFC 6455关联信息这个头字段只用于 WebSocket 开始握手。Sec-WebSocket-Version 头字段是用于 WebSocket 开始握手阶段。它是从客户端发送给服务端来表示这个连接使用的协议版本。它能够让服务端正确的进行开始握手和接下来的数据发送,以及在服务端不能够在一个安全方式下正确解析数据时关闭连接。Sec-WebSocket-Version 头字段在服务端理解的版本不匹配从客户端收到的版本导致的 WebSocket 握手失败时,也从服务端发送给客户端。在这种情况下,这个头字段包含服务端支持的协议版本。注意这里不期望更高的版本号需要向前兼容低版本号。Sec-WebSocket-Version 头字段可以在一个 HTTP 响应中出现多次(这个逻辑等价于一个单独的Sec-WebSocket-Version包含所有的值)。然而,Sec-WebSocket-Version 头字段不能在 HTTP 请求中出现超过1次。11.4 WebSocket 扩展名注册表这个规范根据RFC5526中规定的原则为 WebSocket 协议创建了一个新的 IANA 注册表,用于 WebSocket 扩展名称。作为此注册表的一部分,IANA 包含了一下信息:扩展定义这个扩展的定义,将在 Sec-WebSocket-Extensions 头字段中使用,在此规范的第 11.3.2 节注册。这个值必须满足在此规范第 9.1 节中定义的扩展凭证要求。扩展通用名扩展名称,一般称为扩展名。扩展定义对定义与 WebSocket 协议一起使用的扩展的文档的引用。已知不兼容扩展已知的不兼容的扩展定义列表。WebSocket 扩展名是受到“先到先得” IANA 注册政策 RFC5226 限制的。这个注册表里没有初始值。11.5 WebSocket 子协议名注册表这个规范根据RFC5526中规定的原则为 WebSocket 协议创建了一个新的 IANA 注册表,用于 WebSocket 扩展名称。作为此注册表的一部分,IANA 包含了一下信息:子协议定义子协议的标识符将在 Sec-WebSocket-Protocol 头字段中使用,在此规范的第 11.3.4 节中注册。这个之必须符合此规范第 4.1 节中的第 10 项要求—换句话说,这个之必须是 RFC2616 中定义的凭证。子协议通用名子协议名称,通常被称为子协议。子协议定义对定义与 WebSocket 协议一起使用的子协议的文档的引用。WebSocket 子协议名是受到“先到先得” IANA 注册政策 RFC5226 限制的。11.6 WebSocket 版本号注册表该规范根据 RFC5226 中规定的原则为 WebSocket 协议创建了一个新的 IANA 注册表,用于 WebSocket 版本号。作为此注册表的一部分,IANA 包含了一下信息:版本号版本号是用于在此规范第 4.1 节中制定的 Sec-WebSocket-Version 字段。这个值必须是一个范围在 0 到 255(含)之间的非负整数。参考RFC 请求新版本号或者带有版本号的草稿名称(见下文)。状态临时或者标准。见下面描述。版本号被指定为“临时”或者“标准”。“标准”的版本号被记录在 RFC 文档中,被认为是一个重大、稳定的 WebSocket 协议版本,例如定义在这个 RFC 中的版本。“标准”版本号是受到 “IETF 评论” IANA 注册政策 RFC5526 限制的。“临时”版本是记录在网络草案和用于帮助实现者识别 WebSocket 协议的已部署版本并与之互操作,例如开发后但是发布前的 RFC 版本。“临时”版本号是受到 “专家评论” IANA 注册政策 RFC5526 、 最初的指定专家如HYBI 工作组主席(或者,如果工作组关闭,那么是 IETF 应用领域的领域主任)限制的。IANA 已经向注册表中添加了如下的初始值。版本号引用状态0draft-ietf-hybi-thewebsocketprotocol-00临时1draft-ietf-hybi-thewebsocketprotocol-01临时2draft-ietf-hybi-thewebsocketprotocol-02临时3draft-ietf-hybi-thewebsocketprotocol-03临时4draft-ietf-hybi-thewebsocketprotocol-04临时5draft-ietf-hybi-thewebsocketprotocol-05临时6draft-ietf-hybi-thewebsocketprotocol-06临时7draft-ietf-hybi-thewebsocketprotocol-07临时8draft-ietf-hybi-thewebsocketprotocol-08临时9保留 10保留 11保留 12保留 13RFC6455 11.7 WebSocket 关闭码注册表该规范根据 RFC5226 中规定的原则为 WebSocket 协议创建了一个新的 IANA 注册表,用于 WebSocket 关闭码。作为此注册表的一部分,IANA 包含了一下信息:状态码状态码表示定义在此文档第 7.4 节中 WebSocket 连接关闭的原因。这个状态码是一个在 1000 到 4999(含)之间的整数。含义状态码含义。每一个状态码有一个特定的含义。联系保留状态代码的实体的联系人。关联请求状态码的固定文档和含义定义。对于 1000-2999 的状态码来说是必须的,推荐使用 3000-3999 范围的状态码。WebSocket 关闭状态码根据它的范围有不同的注册要求。使用在这个协议和它的后续的版本或者扩展的请求版本号是受到“标准行为”、“规范要求”(这意味着“指定专家”)或者“IESG 评论” IANA注册表政策限制的,应该在 1000-2999 范围内授权。被类库、框架和应用使用的状态码是受限制于“先到先得”IANA 注册表政策,应该在 3000-3999 范围内授权。4000-4999 范围的状态码是私用的。请求应指明它们是否正在通过扩展、类库、框架或者应用使用请求WebSocket协议的状态代码(或者将来的协议的版本)。IANA已经向注册表中添加了如下初始值。状态码含义联系人关联1000正常关闭hybi@ietf.orgRFC64551001离开hybi@ietf.orgRFC64551002协议错误hybi@ietf.orgRFC64551003不支持的数据类型hybi@ietf.orgRFC64551004保留hybi@ietf.orgRFC64551005没有收到状态码hybi@ietf.orgRFC64551006异常关闭hybi@ietf.orgRFC64551007无效的帧数据hybi@ietf.orgRFC64551008违反政策hybi@ietf.orgRFC64551009消息太大hybi@ietf.orgRFC64551010强制扩展hybi@ietf.orgRFC64551011内部服务器错误hybi@ietf.orgRFC64551015TLS握手hybi@ietf.orgRFC645511.8 WebSocket 操作码注册表该规范根据 RFC5226 中规定的原则为 WebSocket 协议创建了一个新的 IANA 注册表,用于 WebSocket 操作码。作为此注册表的一部分,IANA 包含了一下信息:操作码操作码表示定义在第 5.2 节中的 WebSocket 帧的帧类型。操作码是一个范围在 0 到 15(含)的数字。含义操作码的含义。关联请求操作码的规范。WebSocket 操作码是受到“标准行为”IANA 注册表政策 RFC5266 限制的。IANA 已经向注册表中注册了一下初始值。操作码含义关联0连续帧RFC64551文本帧RFC64552二进制帧RFC64558连接关闭帧RFC64559心跳 Ping 帧RFC645510心跳 Pong 帧RFC645511.9 WebSocket 帧头 bit 字段注册表该规范根据 RFC5226 中规定的原则为 WebSocket 协议创建了一个新的 IANA 注册表,用于 WebSocket 帧头 bit 字段。这个注册表控制分配的 bit 位为第 5.2 节中的 RSV1、RSV2 和 RSV3。这些 bit 位是保留给将来的版本或者文档中的扩展。WebSocket 帧头 bit 字段是受到“标准行为”IANA 注册表政策 RFC5266 限制的。