我目前正在构建一个快节奏的多人游戏,其中安全性是一个大问题。
我已经在Java中使用UDP实现了stop-and-wait(一种临时措施,为简单起见)。
然而,我担心恶意方可能分别向发送方或接收方发送错误的消息或消息,使序列号不同步 - 实际上导致消息丢失(使游戏崩溃!)或发件人无限重新发送。
在我的应用程序中,每个参与者都由RSA公钥标识,因此我可以为每个消息添加一个签名的哈希以进行身份验证......但这会大大增加标头大小并使我的架构层有些混乱。
这是一种常见的方法吗?这个问题有很好的解决方案吗?
答案 0 :(得分:1)
乔纳森说的话。一般来说,在使用UDP时,您需要提供自己的防止乱序或丢弃数据包的方法。除了使用TCP之外,没有“标准”方法来处理这个问题。正如您所说,您可以在每个数据包上验证客户端的身份 - 但请记住,验证客户端的身份,即使是像RSA这样的东西 - 也无法帮助您抵御恶意客户端。他们可以连接到游戏服务器,验证自己,并开始发送垃圾。毕竟,他们是他们所说的人。
对于大多数游戏服务器设计,对于我(虽然有限)的理解,通常服务器具有“滴答”的概念 - 客户端可以注册某些事件发生在滴答内,并且服务器强制执行规则客户发送。但是当滴答结束时,服务器接收的与该滴答相对应的任何事件都将被丢弃。这增加了一个race元素,它不会增加系统的实际安全性,但会添加一个使其更难的元素。
当然,任何类似这样的系统都是“安全”的,因为客户端无法欺骗它们的来源本质上需要做一个TLS隧道,我认为这不符合你的性能要求。