什么是消息边界?

Posted

技术标签:

【中文标题】什么是消息边界?【英文标题】:What is a message boundary? 【发布时间】:2012-03-22 17:49:39 【问题描述】:

以下上下文中的“消息边界”是什么?

TCP 和 UDP 之间的一个区别是 UDP 保留消息 边界。

我了解 TCPUDP 之间的区别,但不确定“消息边界” 的定义。由于 UDP 在每个单独的数据包中都包含了目的地和端口信息,难道是这个给消息一个“边界”

【问题讨论】:

【参考方案1】:

不,消息边界与目的地或端口无关。 “消息边界”是通过协议发送的两条消息之间的分隔。 UDP 保留消息边界。如果通过 UDP 发送“FOO”然后“BAR”,另一端将收到两个数据报,一个包含“FOO”,另一个包含“BAR”。

如果您通过 TCP 发送“FOO”然后“BAR”,则不会保留消息边界。另一端可能会得到“FOO”,然后是“BAR”。或者它可能会得到“FOOBAR”。或者它可能会得到“F”,然后是“OOB”,然后是“AR”。 TCP 不会尝试保留应用程序消息边界——它只是每个方向的字节流。

【讨论】:

在 TCP 中,流/缓冲区是按顺序发送还是接收?我不会在“FOO”之前得到“BAR”,否则每个字节可能会混合成“ORAFBO”之类的东西? @KMC: Wikipedia TCP: TCP 提供可靠的、有序字节流传送 [..] @KMC 它可能会或可能不会在网络上按顺序传输(实际上会这样,但没有法律要求),但是,它将按顺序呈现给接收应用程序. 在接收端,它如何确保它已经完全读取了请求消息的内容,可能跨越多个recv调用,而不混合从下一个请求发送的数据。我认为对于 HTTP,“Content-Length”可以用来提示在读取所有标头后还剩下多少字节。对于其他建立在 TCP 之上的应用协议,例如 DNS 或 SMTP,他们是否使用了类似的想法? @hafan96 这就是发送方和接收方中协议实现的工作。它们可以使用长度在前的消息,可以使用边界字符(如每条消息在自己的行中)或其他机制。【参考方案2】:

此上下文中的消息边界只是消息/数据包的开始和结束。使用 TCP 连接,所有消息/数据包都组合成连续的数据流,而使用 UDP,消息以其原始形式提供给您。它们将具有精确的字节大小。

【讨论】:

以上是关于什么是消息边界?的主要内容,如果未能解决你的问题,请参考以下文章

Xmpp 消息边界

Netty——NIO(Selector处理read事件 消息边界问题)代码示例

Netty——NIO(Selector处理read事件 消息边界问题)代码示例

带边界的 MimeMultipart 消息转储

Netty——网络编程 NIO(Selector处理read事件 消息边界问题)代码示例

在 MIME 多部分消息中显式指定边界?