ZeroMQ消息传输协议 (v2.0)

2023-05-16

因为项目上在和其他团队联调时需要抓包分析消息正确性的问题,因此在网络上查找了一下关于ZeroMQ的协议资料。找到如下文章(原文)。另外这里有一篇对ZeroMQ实现讲的比较深的文章,有兴趣也可以看看:全网仅此一篇!万字详解ZeroMQ的zmq_msg_t消息处理、多部分消息、及消息接口。

ZeroMQ消息传输协议(ZMTP)是一种传输层协议,用于通过连接的传输层(如TCP)在两个对等体之间交换消息。本文档描述了ZMTP/2.0。

目标

ZeroMQ消息传输协议(ZMTP)是一种传输层协议,用于通过连接的传输层(如TCP)在两个对等体之间交换消息。本文档描述了ZMTP/2.0。

理论上,ZMTP应该定义实现之间完全可互操作的行为。但是,部分必要的语义只在libzmq的代码和参考手册中定义。我们希望随着时间的推移,这些语义将被正确地提取、抽象、文档化,并通过独立的代码进行验证。

实现

正式的语法

以下ABNF语法定义了ZMTP/2.0协议:

zmtp        = *connection

connection  = greeting *message

greeting    = signature revision socket-type identity
signature   = %xFF 8%x00 %x7F
revision    = %x01

socket-type = PAIR | PUB | SUB | REQ | REP | DEALER | ROUTER | PULL | PUSH
PAIR        = %X00
PUB         = %X01
SUB         = %X02
REQ         = %X03
REP         = %X04
DEALER      = %X05
ROUTER      = %X06
PULL        = %X07
PUSH        = %X08

identity    = final-short body
final-short = %x00 OCTET
body        = *OCTET

message     = *more-frame final-frame
final-frame = final body
final       = final-short | final-long
final-long  = %x02 8OCTET
more-frame  = more body
more        = more-short | more-long
more-short  = %x01 OCTET
more-long   = %x03 8OCTET

分帧 (Framing)

ZMTP将TCP流分隔为“帧(frame)”。为了便于构造,消息可以由多个帧组成。一个帧由一个标志(flag)字段、一个长度(length)字段和一个等于长度字段值的长度的帧体组成。长度不包括标志字段,也不包括本身,因此空帧的长度为0。

标志字段由包含各种控制标志的单个byte(8-bit)组成。位0是最低有效位(最右边的位):

  • 第0位 (MORE): 后面还有帧。值为0表示没有更多的帧(即这就是最后帧)。值为1表示后面会有更多帧。对于由单帧组成的消息,MORE位必须为0。
  • 第1位 (LONG): 长消息。值为0表示将消息长度只占单个字节。值为1表示按网络字节顺序将消息长度编码为64位无符号整数。
  • 第2-7位: 保留。第2-7位保留将来使用,且必须为零。

下图显示了长度为0到255字节(短帧,长度只占一个字节)的最终帧的布局:

            +-----------------+
 Octet 0    | 0 0 0 0 0 0 0 0 |
            +-----------------+
 Octet 1    | Length          |
            +-----------------+- ... -----------------+
 Octets 2+  | Body                      Length octets |
            +------------------- ... -----------------+

下图显示了长格式(LONG,body超过255个字节)最终帧的布局:

            +-----------------+
 Octet 0    | 0 0 0 0 0 0 1 0 |
            +-----------------+
 Octets 1-8 | Length                       8 octets   |
            +------------------ ... ------------------+
 Octets 9+  | Body                      Length octets |
            +------------------ ... ------------------+

套接字的兼容性

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

  • 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套接字发送订阅消息为一个字节%x01,后面跟着订阅主体;取消订阅消息为一个字节%x00,后面跟着订阅主体。

向后的互操作性

ZMTP/2.0使用单个字节来表示协议修订号(revision)。ZMTP/2.0被认为是该协议的第1版。ZMTP/1.0(参见“13/ZMTP - ZeroMQ消息传输协议”)没有任何版本信息。但是,实现可以检测ZMTP/1.0实现并与之互操作。

如果实现不希望向后兼容ZMTP/1.0对等点,那么它应该使用上面语法中定义的签名。为了检测并与ZMTP/1.0对等体互操作,一个实现应该在打开TCP套接字后立即:

  • 发送一个10字节的签名,由“%xFF长度%x7F”组成,其中“长度”是发送者身份(ID)的长度(0或更多字节)加上1。长度必须是8字节的网络字节顺序。
  • 读来自对端的第一个字节。
  • 如果这个字节不是%FF,那么这个对端正在使用ZMTP/1.0。
  • 如果这个字节是%FF,那么我们再读取9个字节,并检查最后一个字节(第10个)。如果最低位是0,那么对端使用ZMTP/1.0。
  • 如果最低位不为0,则对端使用ZMTP/2.0或更高版本。我们再读取两个字节,它们表示协议修订(revision)和对端的套接字类型。然后,我们可以使用ZMTP/2.0帧语法对该连接上的所有后续帧进行编码/解码。
  • 当我们检测到对端是ZMTP/1.0时,我们已经发送了10个字节,对端将其解释为标识帧的开始。我们继续发送标识帧的主体(0个或多个字节)。从那时起,我们使用ZMTP/1.0帧语法对该连接上的所有帧进行编码和解码。

安全

ZMTP/2.0在安全性方面没有做任何尝试,应用程序可以在安全性之上进行分层。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZeroMQ消息传输协议 (v2.0) 的相关文章

随机推荐

  • 正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用

    今天朋友问我一个问题 xff0c 是这样子的 xff0c 通过正则表达式匹配html标签input包含hidden的字符串 xff0c 具体如下 xff1a 34 lt input type 61 34 hidden 34 id 61 34
  • cmake源码安装

    Data 2017 12 1 Author cjh Theme cmake源码安装 在玩TI AM5728时 xff0c 要用到cmake编译程序 xff0c 无奈开发板又不能用apt get只好自己源码安装了 cmake源码下载 解压源码
  • Ubuntu下逻辑坏道解决方案

    一 逻辑坏道修复方法 逻辑坏道 服务器硬盘相比其他部件是较容易坏的 xff0c 如突然断电 大量频繁写入都会加速硬盘的老化 xff0c 下面介绍一些判断硬盘状况和修复的方法 发现硬盘坏道 dmesg 当有硬盘坏道时 xff0c 通常在dme
  • 解决本地无法ssh连接ubuntu虚拟机

    1 保证双方都能互相ping通 本地 Windows 查看ip xff1a ipconfig ubuntu虚拟机查看ip span class token function ifconfig span 2 保证ubuntu虚拟机安装了ssh
  • 70、在js中为什么0.1+0.2不等于0.3

    并不是所有小数都可以用 完整 的二进制来表示的 xff0c 比如十进制 0 1 在转换成二进制小数的时候 xff0c 是一串无限循环的二进制数 xff0c 计算机是无法表达无限循环的二进制数的 xff0c 毕竟计算机的资源是有限 因此 xf
  • Outlook 2013/2016 显示“正在启动...“ 无法进入Outlook的解决方案

    因上次非正常关闭 xff0c 导致Outlook 2016启动时 xff0c 一直处于启动界面 xff0c 无法进入主界面正常工作 刚开始Outlook 2016启动界面显示的是 34 正在处理 34 查询网上各种方法 xff0c 安全启动
  • H265 CTU、CU、PU、TU划分的特点及要求

    目录 H265 CTU CU PU TU划分的特点及要求大小及划分模式常见问题1 Spec里对于CTU大小的规定在哪 xff1f 2 Spec对于TU大小的规定在哪 xff1f 3 Spec里对于M 2 M 2的划分方式的规定在哪里 xff
  • Oracle VM VirtualBox虚拟机使用问题总结

    我本机的配置是Ubuntu 18 04 43 Oracle VM VirtualBox虚拟机 6 1 12 43 虚拟win7操作系统 xff0c 对虚拟机了解甚少 xff0c 以下仅为一些实践中的经验 xff1a 一 升级后屏幕分辨率问题
  • C语言中string函数详解

    PS xff1a 本文包含了大部分strings函数的说明 xff0c 并附带举例说明 本来想自己整理一下的 xff0c 发现已经有前辈整理过了 xff0c 就转了过来 修改了原文一些源码的问题 xff0c 主要是用char 字义字符串的问
  • MP3的帧结构

    原文地址 xff1a http www eefocus com jjbearustc blog 07 09 3716 3e901 html MP3帧包括以下4个部分 xff1a 1 帧头 xff1a 比特流中包含同步和状态信息的部分 2 错
  • git am PATCH 失败的处理方法

    参考 xff1a http www cnblogs com domainfei articles 2433504 html http blog sina com cn s blog 5372b1a301015y0n html 英文原文地址
  • AAC帧格式及编码介绍

    参考资料 xff1a AAC以adts格式封装的分析 xff1a http wenku baidu com view 45c755fd910ef12d2af9e74c html aac编码介绍 xff1a http wenku baidu
  • 基于ubuntu14.04的Mobilenet_SSD环境搭建

    Data 2017 11 22 Author cjh Theme 基于ubuntu14 04的Mobilenet SSD环境搭建 Caffe for SSD xff1a https github com weiliu89 caffe tre
  • [open vSwitch]查看OVS端口ofport编号及对应虚拟机MAC

    在用open vSwitch做实验时 xff0c 我们经常需要知道OVS port对应的ofport编号 xff0c 这个比较容易 xff0c 用 ovs ofctl show bridge 就能得到 如 root 64 vaio ovs
  • 4、基于51单片机智能语音识别小车控制 语音口令说话控制系统设计

    毕设帮助 开题指导 技术解答 xff08 有偿 xff09 见文末 目录 摘要 一 硬件方案 二 设计功能 三 实物图 四 原理图 五 PCB图 六 程序源码 七 资料包括 摘要 随着电子工业的发展 xff0c 具有语音控制功能的小车越来越
  • H264中的SPS、PPS提取与作用

    牛逼的视频会议网站 xff1a http wmnmtm blog 163 com blog m 61 0 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 4
  • Linux系统备份与还原

    在 使用Ubuntu之前 xff0c 相信很多人都有过使用Windows系统的经历 如果你备份过Windows系统 xff0c 那么你一定记忆犹新 xff1a 首先需要找到一个备份工 具 通常都是私有软件 xff0c 然后重启电脑进入备份工
  • ip能ping开但是不能远程登陆

    刚刚安装ftp时玩将防火墙开启了 然后退出ssh再登陆时就登陆不上去了 出现 xff1a ip能ping开但是不能远程登陆 xff1b telnet ip 也不通 以为使系统问题 xff0c 但是想想刚刚的操作还是防火墙 解决方法 xff1
  • 如何检索CPCI-S

    1 打开Web of Science www webofknowledge com 2 选择数据库大类 xff1a Web of Science核心合集 xff1b 3 会议论文 xff0c 需要选择web of science数据库中的一
  • ZeroMQ消息传输协议 (v2.0)

    因为项目上在和其他团队联调时需要抓包分析消息正确性的问题 xff0c 因此在网络上查找了一下关于ZeroMQ的协议资料 找到如下文章 原文 另外这里有一篇对ZeroMQ实现讲的比较深的文章 xff0c 有兴趣也可以看看 xff1a 全网仅此