1

我一直在为自己的游戏开发项目编写自己的网络引擎。这需要具有不可靠、可靠和有序可靠消息的选项。然而,我还不能确定可靠和有序可靠协议所必需的所有机制。

UDP 上的可靠层所需的机制是什么?额外的细节表示赞赏。

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

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

这影响了我的架构,使其具有带有序列和时间戳的可靠消息标头、回显接收到的序列和时间戳的确认消息、用于根据地址跟踪适当重传时间的系统以及 a) 接收消息并将它们排队以供用户接收的线程, b) 确认可靠消息,以及 c) 用过期的重传定时器重传未确认的消息。

注意: 可靠的 UDP 与 TCP 不同。甚至有序可靠的 UDP 也不等同于 TCP。我并不是暗地里不知道我真的想要 TCP。此外,在有人玩语义游戏之前,是的……可靠的 UDP 是“矛盾的”。这是一个基于 UDP 的层,可实现可靠的交付。

4

3 回答 3

2

您可能想看看这个问题的答案:当您需要可靠的 UDP 时,您使用什么?

我会将“流量控制”添加到您的列表中。您希望能够根据您获得的往返时间来控制您在特定链接上发送的数据量,否则您将淹没链接并丢弃数据报。

于 2011-02-20T08:41:46.373 回答
1

请注意,根据整个协议,可能可以省去重传计时器。例如,参见Quake 3 网络协议

在 Q3 中,仅发送可靠的数据包,直到看到 ack。

于 2013-07-31T13:37:45.993 回答
0

你为什么要重新发明 TCP?它提供了您最初陈述的所有功能,并且已经证明可以正常工作。

编辑 - 由于您的评论表明您有最初未说明的其他要求,因此您应该考虑使用多个套接字的混合模型是否比尝试在单个应用层协议中满足所有这些标准更好。

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

SCTP 支持:

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

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

于 2011-02-19T22:53:48.810 回答