以TCP的可靠性像UDP一样广播
我正在研究一个完全在单个网络内运行的.net解决方案。当用户对系统进行更改时,我想发布一个公告,让其他所有人听到它并采取相应的措施。有没有办法在保持有保证的传递(例如TCP)的情况下广播这样的消息(例如UDP会允许我们发送消息)?
如果这会有所作为,则它位于小型网络(30个客户端)上。
解决方案
回答
进行RDP多播。
回答
我们可以做的是,在广播之后,让客户端启动tcp连接。否则,我们只需要保留所有客户端的列表并自己启动与每个客户端的连接即可。
回答
我认为大致上有三种选择:
- 我们可以创建一个保留订户列表并向其发送单播UDP消息的实体(而不是广播UDP,而可以创建一个实体(线程,进程,服务器,服务或者解决方案中存在的任何事物))。
- 使用UDP多点传送,但我们必须编写某种机制来为我们提供可靠的传送(例如重试,超时等)。这也意味着我们必须从客户那里得到答复。
- 如果我们不担心实验性的传输协议,可以在这里寻求建议。,
回答
我们可以使用Spread进行小组交流。
回答
我们可以在应用程序层实现自己的类似TCP的行为。
因此,例如,我们将发送UDP广播,但随后会期望来自每个主机的答复。如果我们在X秒钟内未收到响应,则发送另一个,依此类推,直到达到某种阈值为止。如果达到阈值(即主机根本没有响应),请报告错误。
但是,要执行此操作,我们需要一个预定义的主机列表,以期望返回响应。
回答
几乎所有游戏都需要UDP的快速响应属性(在较小程度上需要无连接属性)和TCP的可靠性。他们要做的是在UDP之上构建自己的可靠协议。这使他们能够将数据包突发到任何地方,并有选择地使它们可靠。
可靠的数据包系统通常是比TCP更简单的重试直到确认的简单系统,但是有些协议远远超出了TCP所能提供的范围。
情况听起来很简单。我们可能可以自己制作最干净的解决方案,只需使每个客户端发送回"我听到我们"的响应,并让服务器继续尝试直到获得(或者放弃)它。
如果我们需要更多功能,大多数自定义协议库都使用C ++,因此我不确定它们将为我们带来多少使用。但是,我的知识已有数年之久,也许现在已经移植了一些协议。嗯... RakNet和enet是我想到的两个C / C ++库。
回答
看一下结合了tcp和udp功能的sctp。有可用的Windows实施。
回答
Yoy应该看一下Norm(面向NACK的可靠多播)规范。我们可以在此处找到有关Norm的信息。
The NORM protocol is designed to provide end-to-end reliable transport of bulk data objects or streams over generic IP multicast routing and forwarding services. NORM uses a selective, negative acknowledgement (NACK) mechanism for transport reliability and offers additional protocol mechanisms to conduct reliable multicast sessions with limited "a priori" coordination among senders and receivers
它在军事领域有些众所周知。
规范规格。
规范来源
回答
@epatel我赞同SCTP的建议(我投了赞成票,但目前无法发表评论,因此请在此处进行补充)。
SCTP具有许多强大的功能和灵活性。我们可以将连接细分为多个流,并选择每个流的可靠性以及是否有序。另外,通过部分可靠性扩展,我们可以基于每条消息控制可靠性。
回答
广播不是我们想要的。由于可能并且很可能会有连接到该网络的设备不关心消息,因此我们应该使用多播。与广播消息必须发送到网络上的每个客户端并由其进行处理不同,多播消息仅传递给感兴趣的客户端(即,那些有意接收这种特殊类型的消息并对其采取行动的客户端)。
如果以后扩展该系统,以便需要在大型网络上进行路由,则多播可以扩展到该网络,而广播则不能,因此我们将获得可扩展性的好处,以后可能会欣赏。同时,我们消除了交换机和其他不需要查看这些"已更改内容"消息的设备的不必要开销。
回答
我们可能需要研究RFC 3208" PGM可靠传输协议规范"。
这是摘要:
Pragmatic General Multicast (PGM) is a reliable multicast transport protocol for applications that require ordered or unordered, duplicate-free, multicast data delivery from multiple sources to multiple receivers. PGM guarantees that a receiver in the group either receives all data packets from transmissions and repairs, or is able to detect unrecoverable data packet loss. PGM is specifically intended as a workable solution for multicast applications with basic reliability requirements. Its central design goal is simplicity of operation with due regard for scalability and network efficiency.
回答
如果可以使用库,为什么还要从头开始构建某些东西?特别是对于这么小的项目?
尝试使用Emcaster,它本身使用可靠的多播消息传递PGM,由.NET编写,并带有完整的源代码。我们将获得不错的发布/订阅引擎,并且可以随时使用主题过滤。或者,我们可以从代码中学习如何做,并在此基础上自己扩展。
回答
我认为在这些情况下,TCP的最令人讨厌的功能是将传入数据包按其原始顺序排序的能力/方式(即流的概念)。在字节到达之前,我们无法读取该字节。
如果没有它,我们将有机会获得快速,可靠的协议,但不能订购数据包!根本无法管理它们,因为要等到收到丢失数据包的另一个副本后才能对字节进行排序,这是主要的权衡。
回答
创建一个TCP服务器。让每个客户端连接。在与客户端的TCP协议中,使用以下消息的总大小的2字节前缀创建每个数据包。
然后,客户端调用套接字上的" read(max_size = s)"来确定下一条消息的大小,然后调用" read(max_size = s)"来收集该消息。
我们会获得可靠,有序的消息,非常简单。我们不需要为此提供消息传递框架。
回答
我们可以使用Message Broker,例如ActiveMQ。
将消息发布到某个主题,并让客户端注册该主题的持久订阅,这样即使它们不在线也不会丢失任何消息。
Apache ActiveMQ is a message broker written in Java together with a full JMS client. However Apache ActiveMQ is designed to communicate over a number of protocols such as Stomp and OpenWire together with supporting a number of different language specific clients.
客户端平台支持包括cand .net