为啥 zmq 将多条消息打包到一个 TCP 帧中?
Posted
技术标签:
【中文标题】为啥 zmq 将多条消息打包到一个 TCP 帧中?【英文标题】: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 通常不保证任何有限的传输时间,因此如果底层连接碰巧很慢和/或不可靠,则可能需要相当长的时间才能到达您的数据
【参考方案1】:
问:“我如何确定我的消息何时发送?”
欢迎来到 Zen-of-Zero 的 ZeroMQ 艺术。
您有零机会知道被分派发送的消息何时最终到达线路级别。
这是概念的属性,而不是错误。它在文档中明确解释,因为 API v2.0+(并且很可能永远保持如此)。公平地补充一点,对zmq_context
-instance 内部性的一些见解可能来自最近的 API 版本中可用的socket_monitor
。
如果您从未与ZeroMQ 合作过,可以在这里先看看"ZeroMQ - Principles in less than Five Seconds"在深入了解更多细节之前
【讨论】:
以上是关于为啥 zmq 将多条消息打包到一个 TCP 帧中?的主要内容,如果未能解决你的问题,请参考以下文章