本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
帧
ZMTP 连接以问候和 READY 命令开始,之后承载由帧组成的消息;本 crate 的一条消息是三帧:名称、消息头、载荷。
以文字阅读本图
- ZMTP 连接,双方对端: 问候 签名、3.0 版本、NULL 机制; READY 命令 Socket-Type,套接字有身份时还有 Identity; 消息 由帧组成,除最后一帧外都带 MORE 标志
- 本 crate 的一条消息: 第 0 帧 名称; 第 1 帧 消息头; 第 2 帧 载荷
- 问候 签名、3.0 版本、NULL 机制 → READY 命令 Socket-Type,套接字有身份时还有 Identity: 双向
- READY 命令 Socket-Type,套接字有身份时还有 Identity → 消息 由帧组成,除最后一帧外都带 MORE 标志: 双向
- 消息 由帧组成,除最后一帧外都带 MORE 标志 → 本 crate 的一条消息: 一条消息
- 名称是 UTF-8 文本,消息头是 name: value 行, 载荷是编解码器写出的字节
ZMTP 是每个 ZeroMQ 套接字底下的协议。双方对端各自发送问候,其中包含协议版本和安全机制。zeromq 客户端以 3.0 版本和 NULL 机制问候,这种机制既不认证也不加密。随后每个对端发送一个带有自身套接字类型的 READY 命令。如果两种类型不能配对,连接就此结束。
一条消息是一组帧。除最后一帧外,每一帧都带 MORE 标志,接收方由此知道一条消息在哪里结束。套接字要么交出整条消息,要么什么也不交出。
本 crate 在每条消息中放入三帧。第 0 帧是名称,第 1 帧是消息头,第 2 帧是载荷。任何语言的对端都可以用一次多部分发送组成这样一条消息,见线上格式。只有两帧的消息按名称和载荷读取,没有消息头。
载荷帧就是编解码器写出的缓冲区,而不是它的副本。本 crate 的每个发布者都接收运行时编码好的字节,而帧拥有自己的字节,因此缓冲区直接成为帧。
请求与回复
以文字阅读本图
- ROUTER 读到的请求: 身份 来自对端; 名称; 消息头; 载荷
- ROUTER 发出的回复: 身份 来自 reply-to; reply; 消息头; 载荷
- 身份 来自对端 → 处理器看到的消息头 reply-to: zmq-reply:<十六进制身份>: 变成
- 处理器看到的消息头 reply-to: zmq-reply:<十六进制身份> → 身份 来自 reply-to: 为回复寻址
- ROUTER 去掉身份帧, 请求方的 DEALER 收到其余三帧
应答方的 ROUTER 读到的请求,在三帧前面带着请求方的身份。本 crate 把这个身份变成 reply-to 消息头,即 zmq-reply: 后接十六进制的身份,处理器的回复就发往那里。应答方挂载一个转换,为每次投递指定这个目的地。
回程的帧依次是身份、字面名称 reply、消息头和载荷。ROUTER 把它们发给身份所指的连接,并去掉身份。
请求通过它自己的 DEALER 发出,带着自己的随机身份,因此一个回答只能到达提出它的那个请求。请求带有 correlation-id 消息头,调用方设置了它就保留原值。带有相同 id 的回复完成这个请求。信封一页列出了这些消息头。