WebSocket 协议的理论基础
WebSocket 协议是建立在 TCP/IP 网络连接之上的,这些网络连接的特征是 IP 地址(或替换它的域名)和端口号。HTTP/HTTPS 协议,我们已经在关于 网络功能的章节中实践过的 HTTP/HTTPS 协议,就是基于相同的原理工作的。其中,标准端口号是 80(用于不安全的连接)和 443(用于安全的连接)。WebSocket 没有专用的端口号,所以 Web 服务提供商可以选择任何可用的端口号。我们所有的例子都将使用 9000 端口。
将 URL 指定为 WebSocket 协议前缀时,我们使用 ws(用于非安全连接)和 wss(用于安全连接)。
就数据传输而言,WebSocket 格式比 HTTP 更高效,因为它使用的控制数据少得多。
WebSocket 服务的初始连接建立完全重复一个HTTP/HTTPS Web 页面请求:你需要发送一个带有专门准备的标头的 GET 请求。这些标头的一个特征是存在文本行:
Connection: Upgrade
|
以及一些报告 WebSocket 协议版本和特殊随机生成的字符串的附加行。客户端和服务器之间“握手”过程中涉及的密钥。
Sec-WebSocket-Key: ...
|
实际上,“握手”意味着服务器检查客户机请求的那些选项的可用性,并以标准的 HTTP 标头作为响应,确认切换到 WebSocket 模式或拒绝。拒绝的最简单的原因可能是,如果你试图通过 WebSocket 连接到一个简单的 Web 服务器,其中没有提供 WebSocket 服务器或者不支持所需的版本。
WebSocket 协议的当前版本的代号为 Hybi 和 13 号。更早、更简单的版本 Hixie 可能有助于向后兼容。在下文中,我们将只使用 Hybi,尽管 Hixie 实现也包括在内。
服务器响应中的以下 HTTP 标头表示连接成功:
HTTP/1.1 101 Switching Protocols
|
这里的 Sec-WebSocket-Accept 字段由服务器根据 Sec-WebSocket-Key 计算和填充,以确认符合协议。所有这些都受规范的约束 RFC6455 也将在我们的 MQL 项目中得到支持。
为清晰起见,下图显示了该过程:

客户端和服务器之间通过 WebSocket 协议进行交互
建立 WebSocket 连接后,客户机和服务器可以交换打包到特殊块中的信息:帧和消息。一条消息可以由一个或多个帧组成。根据规范,帧大小被限制为天文数字 263 字节(9223372036854775807 ~ 9.22艾字节!),但是特定的实现当然可能具有更普通的限制,因为这种理论限制对于在一个分组中发送似乎是不实际的。
在任何时候,客户端或服务器都可以终止连接,只要事先“礼貌地说再见”(见下文)或简单地关闭网络套接字。
帧可以是不同的类型,如每个帧开头的标头(4 到 16 个字节)所指定的。作为参考,我们先列出操作码(它们存在于标头的第一个字节)和不同类型帧的用途。
- 0 连续帧(继承前一帧的特性);
- 1 带文本信息的帧;
- 2 带二进制信息的帧;
- 8 - 请求关闭并确认关闭连接的帧(发送用于“礼貌告别”);
- 9 ping 帧,可由任一端定期发送,以确保连接得到物理保存;
- 10 pong 帧,为响应 ping 帧而发送。
消息中的最后一帧在标头中用一个特殊的位来标记。当然,当消息由一帧组成时,它也是最后一帧。有效载荷的长度也在标头中传递。