【问题标题】:Why does zmq pack several messages to one TCP frame?为什么 zmq 将多条消息打包到一个 TCP 帧中?
【发布时间】:2020-05-16 15:41:06
【问题描述】:

我使用带有ZMQ_DONTWAIT 标志的ZMQ_PUSH 套接字发送消息。每条消息间隔 300 毫秒(所以我严重怀疑我的线程调度是否如此关闭)。然而,有时会有几条(到目前为止最多 7 条)消息被打包到同一个 TCP 帧中,但我在 tcpdump 中看不到任何重新传输或重新连接。

为什么会这样?我如何确定我的消息何时发送?

【问题讨论】:

  • en.wikipedia.org/wiki/Nagle%27s_algorithm 通常假设 tcp 每帧一条消息也是错误的,因为它是基于连接的协议,而不是基于消息的
  • 好吧,但我想我可以假设每 2.1 秒至少有 1 个 TCP 帧
  • 我最好的猜测是 ZMQ 中的一个错误,这不会是第一次。
  • TCP 是一种流协议,在应用层没有帧/数据包/消息。任意数量的send() 调用可以对应于任意数量的recv() 调用,并且您不能假设您的数据以您发送的顺序可靠传输。 TCP 通常不保证任何有限的传输时间,因此如果底层连接碰巧很慢和/或不可靠,则可能需要相当长的时间才能到达您的数据

标签: c++ c sockets zeromq


【解决方案1】:

“我如何确定我的消息何时发送?”

欢迎来到 Zen-of-Zero 的 ZeroMQ 艺术。

您有零机会知道被分派发送的消息何时最终到达线路级别。

这是概念的属性,而不是错误。它在文档中明确解释,因为 API v2.0+(并且很可能永远保持如此)。公平地补充一点,对zmq_context-instance 内部性的一些见解可能来自最近的 API 版本中可用的socket_monitor


如果您从未与ZeroMQ 合作过,
可以在这里先看看"ZeroMQ - Principles in less than Five Seconds"
在深入了解更多细节之前



【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多