我怎么知道我已经收到了哪些 UDP 数据包?
How do I know which UDP packets I have already received?
我正在使用带有 UDP 的客户端-服务器模型制作游戏。以下是我目前的实施方式:
- 所有数据包都包含一个序列号和一个标志,指定它们是否 "important"。
- 重要的消息类型需要确认,如果没有收到确认,将在延迟后重新发送。
- 大多数消息类型是 "unimportant" - 也就是说,它们不需要确认,如果收到的此类消息的序列号比最新消息的序列号旧,则会被丢弃。
我的困境是:如果 "important" 消息到达两次,我只想处理一次。但是,如果不在内存中保留不断扩展的列表,我怎么知道我已经收到了它?
想法
- 请记住收到的最后 X "important" 条消息 - 收到非常旧的消息的可能性很小(不理想,因为它不是 100% 可靠)。
- 将 TCP 用于 "important" 消息(由于同时管理 2 个协议所涉及的复杂性和开销,并不理想)。
- 为 "important" 条消息设置一个单独的序列号,并确保这些消息始终按顺序接收,因此只需要记住最近的消息(我倾向于这样做)。
- 还有其他想法吗?
为 "important" 条消息(从零开始)和以下变量设置单独的序列号:
- 一个变量
min_recv
,表示你收到了从0到min_recv
的所有"important"条消息(排除);
- 您已经收到的 "important" 序列号列表。
在任何时候(例如在收到另一个 "important" 消息后),您将其序列号存储在列表中;然后你可以检查你是否可以压缩列表:
while list contains `min_recv`:
remove `min_recv` from list
increment min_recv
这样你消耗的内存最少,因为即使你收到乱序的重要消息(并且列表的大小会开始增长),最终你也会收到丢失的消息,因为它会丢失重传,清空列表
使用#3。您正在确认重要消息这一事实提供了一种确保按顺序接收它们的机制,即不要确认一个乱序的消息,只需记住您确认的最后一个消息的序列号。
我正在使用带有 UDP 的客户端-服务器模型制作游戏。以下是我目前的实施方式:
- 所有数据包都包含一个序列号和一个标志,指定它们是否 "important"。
- 重要的消息类型需要确认,如果没有收到确认,将在延迟后重新发送。
- 大多数消息类型是 "unimportant" - 也就是说,它们不需要确认,如果收到的此类消息的序列号比最新消息的序列号旧,则会被丢弃。
我的困境是:如果 "important" 消息到达两次,我只想处理一次。但是,如果不在内存中保留不断扩展的列表,我怎么知道我已经收到了它?
想法
- 请记住收到的最后 X "important" 条消息 - 收到非常旧的消息的可能性很小(不理想,因为它不是 100% 可靠)。
- 将 TCP 用于 "important" 消息(由于同时管理 2 个协议所涉及的复杂性和开销,并不理想)。
- 为 "important" 条消息设置一个单独的序列号,并确保这些消息始终按顺序接收,因此只需要记住最近的消息(我倾向于这样做)。
- 还有其他想法吗?
为 "important" 条消息(从零开始)和以下变量设置单独的序列号:
- 一个变量
min_recv
,表示你收到了从0到min_recv
的所有"important"条消息(排除); - 您已经收到的 "important" 序列号列表。
在任何时候(例如在收到另一个 "important" 消息后),您将其序列号存储在列表中;然后你可以检查你是否可以压缩列表:
while list contains `min_recv`:
remove `min_recv` from list
increment min_recv
这样你消耗的内存最少,因为即使你收到乱序的重要消息(并且列表的大小会开始增长),最终你也会收到丢失的消息,因为它会丢失重传,清空列表
使用#3。您正在确认重要消息这一事实提供了一种确保按顺序接收它们的机制,即不要确认一个乱序的消息,只需记住您确认的最后一个消息的序列号。