通过ZMQ发送时,用于更长字符串的字节数是多少?

时间:2018-04-23 19:19:22

标签: zeromq distributed-system pyzmq jeromq

我正在使用Python和Java的ZeroMQ / ZMQ并且有一个问题。发送较短的字符串时,ZMQ使用此处描述的一个字节(http://zguide.zeromq.org/page:all#A-Minor-Note-on-Strings

  

然后进入线路的是一个长度(一个字节表示更短   字符串)和字符串内容作为单个字符。

有人知道发送更长字符串时使用了多少字节吗?

1 个答案:

答案 0 :(得分:0)

  

通过ZMQ发送时,用于更长字符串的字节数是多少?

这取决于地狱更多的东西,而不仅仅是字符串本身:

您的帖子确实是指历史文字 - zguide页。

虽然这在ZeroMQ v.2.x早期确实是一个非常有用的第一读源,但今天我们生活在,涵盖了许多版本,从v.2.1 +,3.x, 4.x,4.2是2018年至Q2期间最后一个稳定的API版本。

在接收者实际设置/接受链接设置和 .recv() 之前,没有人可以先验猜测消息发送方使用的API版本 - 相应的消息。在v4.0 API之后依赖基于C-lang的 s_recv() -helper技巧并不是一个可靠的方向。

在python中,许多协议硬连线的细节仍然超出你的视线,但是有一些字节映射,完全像在公布的ZeroMQ RFC / ZMTP规范中所灌输的仁慈的独裁统治一样被填充。< / p>

如果我们事先无法猜测或知道,我们可以......?

是的,我们可以试验一下。最佳设置受控实验。

节点A:发件人
可以是pythonic,作为发送者:
- 设置 REQ -archetype AccessNode (详见 "ZeroMQ Hierarchy in less than a five seconds" ,<登记/> - 使用随机生成的静态标识设置 .setsockopt( zmq.IDENTITY, ... )
- 设置 .setsockopt( zmq.REQ_RELAXED, 1 )
- .bind() 将其添加到已选择的运输类的已知端点上 - 启动 xrange() - 生成器控制的 for L in xrange( 1, int( 1E+9 ) ) -loop .send() -s - 加载有效负载 .send( r"{0:}|{1:}".format( str( L ), L * r"*" ) ) - 为REP方面处理相应的.recv()&#34;回答&#34;,
- 根据发送方侧的套接字容量和发送更多有效负载的能力,检查错误状态并调整time.sleep() - s / re-loops

节点B:接收器| MitM-sniffer
应该尽可能低级别,以便解组RFC / ZMTP有线协议,因此python离开候选列表。其他选项可能包括线级嗅探器,如果所选的传输类允许(ipc://vmci://不允许)

  • 设置 ROUTER -archetype AccessNode,
  • .connect() 它已知道节点A使用的传输类端点,
  • 启动.recv() - 消息,

如果您的实验已正确获取/嗅探了有关已知有效负载组合的符合ZMTP标准的传输大小的有线级详细信息,那么您的问题将在 string上获得可重复,可验证,定量更正的记录 -size到message-size mapping-function。

奖励点:对于那些确实感兴趣的人。 。 。

接下来,重新运行上面的受控白盒实验,现在有了节点A:发件人 - 将其行为扩展为{随机|确定性地} {改变|改变它自己的配置
(或将这两个选项映射到一对相同的有效载荷上 - .send() - s)
.setsockopt( zmq.REQ_CORRELATE, { on | off } ) 在其 for -loop内,并记录预期输出中观察到的变化。

就API v.4.2.x在2018年至第二季度允许的情况而言,这为最终答案增加了最后的答案。

相关问题