跳到主要内容

IANA 注意事项

本文的主要内容为 WebSocket 的 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 中定义了 Meaning。
URI 协议 Meaning这个方案的唯一操作就是使用 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 协议。
ContactRFC 6455

11.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 中定义了 Meaning。
URI 协议 Meaning这个方案的唯一操作就是使用 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 协议。
安全性注意事项见”安全性注意事项”一节。
ContactRFC 6455

11.2 注册“WebSocket”协议升级关键值​

这一节描述一个在 HTTP 升级凭证注册的关键值,在 RFC2817 定义。

选项描述
凭证名称WebSocket
ContactRFC 6455

11.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(含)之间的整数。
Meaning状态码 Meaning。每一个状态码有一个特定的 Meaning。
联系保留状态代码的实体的联系人。
Contact请求状态码的固定文档和 Meaning 定义。对于 1000-2999 的状态码来说是必须的,推荐使用 3000-3999 范围的状态码。

WebSocket 关闭状态码根据它的范围有不同的注册要求。使用在这个协议和它的后续的版本或者扩展的请求版本号是受到“标准行为”、“规范要求”(这意味着“指定专家”)或者“IESG 评论” IANA 注册表政策限制的,应该在 1000-2999 范围内授权。被类库、框架和应用使用的状态码是受限制于“先到先得”IANA 注册表政策,应该在 3000-3999 范围内授权。4000-4999 范围的状态码是私用的。请求应指明它们是否正在通过扩展、类库、框架或者应用使用请求 WebSocket 协议的状态代码(或者将来的协议的版本)。

IANA 已经向注册表中添加了如下初始值。

状态码Meaning联系人Contact
1000正常关闭hybi@ietf.orgRFC6455
1001离开hybi@ietf.orgRFC6455
1002协议错误hybi@ietf.orgRFC6455
1003不支持的数据类型hybi@ietf.orgRFC6455
1004保留hybi@ietf.orgRFC6455
1005没有收到状态码hybi@ietf.orgRFC6455
1006异常关闭hybi@ietf.orgRFC6455
1007无效的帧数据hybi@ietf.orgRFC6455
1008违反政策hybi@ietf.orgRFC6455
1009消息太大hybi@ietf.orgRFC6455
1010强制扩展hybi@ietf.orgRFC6455
1011内部服务器错误hybi@ietf.orgRFC6455
1015TLS 握手hybi@ietf.orgRFC6455

11.8 WebSocket 操作码注册表​

该规范根据 RFC5226 中规定的原则为 WebSocket 协议创建了一个新的 IANA 注册表,用于 WebSocket 操作码。

作为此注册表的一部分,IANA 包含了一下信息:

选项描述
操作码操作码表示定义在第 5.2 节中的 WebSocket 帧的帧类型。操作码是一个范围在 0 到 15(含)的数字。
Meaning操作码的 Meaning。
Contact请求操作码的规范。

WebSocket 操作码是受到“标准行为”IANA 注册表政策 RFC5266 限制的。

IANA 已经向注册表中注册了一下初始值。

操作码MeaningContact
0连续帧RFC6455
1文本帧RFC6455
2二进制帧RFC6455
8连接关闭帧RFC6455
9心跳 Ping 帧RFC6455
10心跳 Pong 帧RFC6455

11.9 WebSocket 帧头 bit 字段注册表​

该规范根据 RFC5226 中规定的原则为 WebSocket 协议创建了一个新的 IANA 注册表,用于 WebSocket 帧头 bit 字段。这个注册表控制分配的 bit 位为第 5.2 节中的 RSV1、RSV2 和 RSV3。

这些 bit 位是保留给将来的版本或者文档中的扩展。

WebSocket 帧头 bit 字段是受到“标准行为”IANA 注册表政策 RFC5266 限制的。