39/ZWS

39/ZWS

ZeroMQ WebSocket

ZeroMQ WebSocket (ZWS) 协议是 ZeroMQ 在 WebSocket 之上的映射。

语言

本文档中的关键词“必须”、“不得”、“要求”、“应”、“不应”、“应该”、“不应该”、“建议”、“可以”和“可选”应按照 RFC 2119 中的描述进行解释(参见“[]()")。

目标

ZeroMQ WebSocket (ZWS) 协议是 ZeroMQ 在 WebSocket (http://tools.ietf.org/html/rfc6455) 之上的映射。

实现

ZWS 连接在客户端和服务器成功完成 WebSockets 握手后开始。ZWS 消息是二进制 websocket 消息(消息操作码必须是二进制)。

握手

ZWS 不定义客户端和服务器之间的连接发起和握手过程。

然而,客户端握手请求必须包含

  • Sec-WebSocket-Protocol 设置为 “ZWS1.0”。
  • 查询字符串参数 “type” 设置为有效的套接字类型。

如果客户端未能包含上述内容,服务器应该关闭连接(使用 BAD REQUEST、WebSocket 关闭控制消息或静默断开 TCP 连接)。以下是有效的握手请求

GET /?type=DEALER HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: ZWS1.0
Sec-WebSocket-Version: 13
Origin: http://example.com

服务器握手响应必须包含

  • Sec-WebSocket-Protocol 设置为 “ZWS1.0”。

以下是有效的服务器握手响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: ZWS1.0

形式文法

以下 ABNF 文法定义了 ZWS/1.0 协议

zws = *connection

connection = identity *messsage

identity = %x00 body

body = *OCTEC

message     = *more-frame final-frame
final-frame = final body
final       = %x00
more-frame  = more body
more        = %x01

帧结构

每个 ZeroMQ 帧映射到一个 WebSockets 消息。一个帧包含一个 MORE 字节(0 或 1)和一个帧体。

MORE 字节指示后续是否还有更多帧。值为 0 表示没有更多帧。值为 1 表示后续还有更多帧。对于仅包含一个帧的消息,MORE 字符必须为 0。

套接字兼容性

ZWS 客户端实现不必实现所有套接字类型,可以选择实现哪些套接字类型。

实现应该强制要求传入连接具有有效的套接字类型,具体取决于接收连接的套接字的类型

  • PAIR 接受来自 PAIR 的连接。
  • PUB 接受来自 SUB 的连接。
  • SUB 接受来自 PUB 的连接。
  • REQ 接受来自 REP 或 ROUTER 的连接。
  • REP 接受来自 REQ 或 DEALER 的连接。
  • DEALER 接受来自 REP, DEALER 或 ROUTER 的连接。
  • ROUTER 接受来自 REQ, DEALER 或 ROUTER 的连接。
  • PULL 接受来自 PUSH 的连接。
  • PUSH 接受来自 PULL 的连接。

任何其他套接字组合应该通过静默断开其他对等方并可能记录错误以供调试的方式来处理。

发布-订阅

XPUB 和 XSUB 套接字在协议层面实现为 PUB 和 SUB 套接字。也就是说,XPUB 和 XSUB 仅是 API 构造。SUB 套接字发送订阅消息时,以 0x01 字节开头,后跟订阅体;发送取消订阅消息时,以 0x00 字节 ‘0’ 开头,后跟订阅体。

端口共享

ZWS 实现可以选择实现端口共享。

如果实现了端口共享,多个套接字可以通过指定资源名绑定到同一个端口。

客户端可以在客户端握手请求中指定资源。

服务器绑定的示例: “ws://*:80/chat”

客户端带有资源的握手请求示例

GET /chat?type=DEALER HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: ZWS1.0
Sec-WebSocket-Version: 13
Origin: http://example.com

安全

ZWS1.0 不尝试提供安全性。

然而,该协议可以通过 SSL 进行隧道传输。

客户端通过指定 wss 而不是 ws 来支持通过 SSL 进行隧道传输,例如 “wss://example.com”。

负载均衡器可能会在到达服务器之前终止 SSL。