我正在开发一个完全在单个网络内运行的 .net 解决方案。当用户对系统进行更改时,我想发布公告,让其他人听到并采取相应行动。有没有一种方法可以让我们广播出这样的消息(比如 UDP 可以让你这样做),同时保持有保证的传递(比如 TCP)?

这是在一个小型网络(大约 30 个客户端)上,如果这会有所作为的话。

有帮助吗?

解决方案

几乎所有游戏都需要 UDP 的快速反应特性(以及较小程度的无连接特性)和 TCP 的可靠性。他们所做的就是在 UDP 之上构建自己的可靠协议。这使他们能够将数据包突发到任何地方,并可选择使其可靠。

可靠的数据包系统通常是一个简单的重试直到确认系统,比 TCP 更简单,但有些协议远远超出了 TCP 所能提供的范围。

你的情况听起来很简单。您可能能够自己制定最干净的解决方案 - 只需让每个客户端发回“我听到了”响应,然后让服务器继续尝试,直到收到(或放弃)。

如果您想要更多东西,大多数自定义协议库都是用 C++ 编写的,所以我不确定它们对您有多大用处。然而,我在这里的知识已经有几年了——也许一些协议现在已经被移植了。唔...RakNet 和 enet 是我想到的两个 C/C++ 库。

其他提示

看一眼 sctp 它结合了 tcp 和 udp 功能。有一个窗户 执行 可用的。

你可以使用 传播 进行小组交流。

@epatel - 我赞同 SCTP 建议(我投票了,但还不能评论这里的其他内容)。

SCTP 具有许多出色的功能和灵活性。您可以将连接细分为多个流,并选择每个流的可靠性以及是否有序。或者,与 部分可靠 扩展,您可以控制每条消息的可靠性。

广播不是你想要的。由于可能并且可能会有连接到该网络的设备不关心您的消息,因此您应该使用多播。与必须发送到网络上的每个客户端并由其处理的广播消息不同,组播消息仅传递给感兴趣的客户端(即那些有意接收这种特定类型的消息并对其采取行动的客户端)。

如果您稍后扩展此系统,以便需要通过大型网络进行路由,则多播可以扩展至此规模,而广播则不能,因此您可以获得稍后可能会欣赏到的可扩展性优势。同时,您可以消除交换机和其他不需要查看这些“某些内容已更改”消息的设备中不必要的开销。

您可能想了解一下 RFC 3208 “PGM 可靠传输协议规范”。

这是摘要:

务实的一般多播(PGM)是可靠的多播运输
需要订购或无序的应用程序协议,
从多个来源传递到无重复的多播数据到
多个接收器。PGM保证该组中的接收器要么从传输和维修中接收所有数据包,要么能够检测到无法恢复的数据包丢失。PGM专门作为具有基本可靠性要求的多播应用程序的可行解决方案。它的中心设计目标是操作的简单性,并适当考虑可扩展性和网络效率。

您可以使用消息代理,例如 ActiveMQ.
将消息发布到主题,并让客户端注册该主题的持久订阅,这样即使他们不在线也不会错过任何消息。

Apache ActiveMQ是与完整的JMS客户端一起用Java编写的消息代理。但是,Apache ActiveMQ旨在通过许多协议(例如Stomp and OpenWire)进行通信,并支持许多不同语言的客户端。

客户端平台支持包括 c# 和 .net

您可以在应用层实现您自己的类似 TCP 的行为。

例如,您将发送 UDP 广播,但随后期望来自每个主机的回复响应。如果您在 X 秒内没有收到响应,则发送另一个响应,依此类推,直到达到某种阈值。如果达到阈值(即主机根本没有反应),然后报错。

不过,要做到这一点,您需要一个预定义的主机列表来期望返回响应。

创建 TCP 服务器。让每个客户端连接。在与客户端的 TCP 协议中,创建每个数据包,其前缀为以下消息总大小的 2 字节。

然后客户打电话 read(max_size=2) 在套接字上确定下一条消息的大小,然后 read(max_size=s) 来收集消息。

您可以获得可靠、有序的消息,而且很简单。您不需要为此使用消息传递框架。

确实 想要调查 实用通用组播:

虽然 TCP 使用 ACK 来确认发送的数据包组(这可能是 多播不经济),PGM 使用否定确认(NAK)的概念。

为了更进一步的 重力潜水, ,您要查找的术语是 可靠的组播. 。还看一下 多路径TCP.

你能做的就是在广播之后 客户 启动 TCP 连接。否则,您只需保留所有客户端的列表并自行启动与每个客户端的连接。

我认为大体上有三种选择:

  1. 您可以创建一个实体(线程、进程、服务器、服务或解决方案中存在的任何东西)来保存订阅者列表并向他们发送单播 UDP 消息,而不是广播 UDP。
  2. 使用 UDP 多播,但您必须编写某种机制来为您提供可靠的传输(即重试、超时等)。这也意味着您必须得到客户的回复。
  3. 如果您不害怕实验性传输协议,您可能会看看 这里 寻求建议。,

Yoy 应该看看 Norm(面向 NACK 的可靠多播)规范。你可以找到 关于规范的信息在这里.

规范协议旨在通过通用IP多播路由和转发服务提供批量数据对象或流的端到端可靠运输。Norm使用选择性的,负面的确认(NACK)机制来运输可靠性,并提供其他协议机制,以进行可靠的多播会话,并在发件人和接收方之间进行有限的“先验”协调

它在军事界有点众所周知。

规范规格。

标准来源

如果可以使用库,为什么要从头开始构建一些东西呢?尤其是对于这么小的项目?

尝试使用 恩卡斯特 它本身使用可靠的多播消息传递 - PGM,是用 .NET 编写的并具有完整源代码。您将获得很好的发布/订阅引擎,并且可以随时使用主题过滤。或者您可以从代码中学习如何执行此操作,并在此基础上构建您自己的扩展。

我认为在这些场景中 TCP 最令人恼火的功能是将传入数据包按其原始顺序排序的能力/方式 - 流的概念。在该字节到达之前,您无法读取该字节。

如果您可以没有它,您就有机会拥有您的协议,快速且可靠,但不适用于数据包排序!管理它们根本不可能,因为在收到丢失数据包的另一个副本之前,您无法对字节进行排序,这是主要的权衡。

进行 RDP 多播。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top