UDP上可靠层的必要机制是什么?

时间:2011-02-19 22:49:43

标签: sockets udp reliability

我一直致力于为自己的游戏开发方项目编写自己的网络引擎。这需要具有不可靠,可靠和有序可靠消息的选项。但是,我没有能够确定可靠和有序可靠协议所需的所有机制。

UDP上可靠层的必要机制是什么?其他细节表示赞赏。

到目前为止,我认为这些都是要求:

  • 确认收到带有序列号的消息。
  • 重新传输时间到期后重新发送未确认的消息。
  • 跟踪每个目的地的往返时间,以便计算适当的重新传输时间。
  • 识别并删除重复的数据包。
  • 处理循环的溢出序列号。

这对我的架构产生了影响,使其具有带有序列和时间戳的可靠消息头,确认回显接收序列和时间戳的消息,基于地址跟踪适当重传时间的系统,以及a)接收消息并对其进行排队的线程用户收据,b)确认可靠的消息,c)用过期的重传定时器重新发送未确认的消息。

注意: 可靠的UDP与TCP不同。即使订购的可靠UDP也与TCP不同。我并不是暗地里没有意识到我真的想要TCP。此外,在某人玩语义游戏之前,是的......可靠的UDP是“矛盾的”。这是一个UDP层,可以实现可靠的传输。

3 个答案:

答案 0 :(得分:2)

您可能想看一下这个问题的答案:What do you use when you need reliable UDP?

我会在您的列表中添加“流量控制”。您希望能够控制您在特定链接上发送的数据量,具体取决于您获得的往返时间,或者您将淹没链接并将数据报扔掉。

答案 1 :(得分:1)

请注意,根据整体协议,可以省去重传计时器。例如,请参阅Quake 3 network protocol

在Q3中,只有在发现确认时才会发送可靠数据包。

答案 2 :(得分:0)

你为什么要重新发明TCP?它提供了您最初声明的所有功能,并且已经证明可以很好地运行。

编辑 - 由于您的评论显示您有其他要求未提及,因此您应该考虑使用多个套接字的混合模型是否优于在单个应用层协议中尝试满足所有这些条件。

实际上,您真正需要的是SCTP

SCTP支持:

  1. 基于消息(而非字节流)传输
  2. 单个netsock套接字上的多个流
  3. 订购或无序接收数据包
  4.   

    ... SCTP中的消息排序是可选的;接收应用程序可以选择按接收顺序处理消息,而不是按发送顺序处理消息