如果我理解正确的话,你的主要问题不是TCP本身(因为所描述的情形也可能发生使用UDP)相关的,但你的消息的年表和固定的时间表还没有被伪造。
所以,你要避免的唯一情况是:
STARTED send at 09:00:00 and received at 09:00:30 (higher latency)
FINISHED send at 09:10:00 and received at 09:10:01 (lower latency)
,因为它看起来到服务器,就好像有只花了9.5构建虚拟建筑分钟。但客户端没有作弊,只是第一条消息比第二条消息有更高的延迟。
其他的方式就没有问题:
STARTED send at 09:00:00 and received at 09:00:01 (lower latency)
FINISHED send at 09:10:00 and received at 09:10:30 (higher latency)
或
STARTED send at 09:00:00 and received at 09:00:10 (equal latency)
FINISHED send at 09:10:00 and received at 09:10:10 (equal latency)
如至少10分钟的两个消息的接收之间经过。
不幸的是没有办法,以确保客户不使用时间戳或欺骗等。如果您的客户端在消息中写入时间戳或者协议为您执行了它,则无关紧要。有两个原因:
- 即使你的客户不作弊,客户端和 服务器的系统时钟可能不同步
- 写在网络数据包的所有数据都只是字节,可以是操纵。有人可以使用RAW套接字并伪造整个TCP层
所以唯一可以肯定的是服务器收到消息的时间。一个简单的解决方案是,如果服务器认为接收到FINISHED消息时没有足够的时间,则发送包含留给客户端的时间的某种重试消息。所以客户可以调整施工动画,然后再发送FINISHED消息,这取决于剩下多少时间。
为什么还在乎呢?你知道房子什么时候开始建造,让服务器在10分钟后向客户端发送消息。 – serakfalcon 2014-09-01 14:05:00
房屋建造可以被打断,并且/或者具有不同工作速度的其他工人可以在之后开始建造。对于用户来说,它应该看起来尽可能平滑,不需要修改服务器的构建时间,所以服务器只会乐观地进行验证,而不是惩罚诚实的客户端,从而更好地让客户端进行欺骗。另一个原因是我不希望服务器运行单独的任务来确定何时将“完成构建”发送给可能未连接的客户端。如果没有其他选择,我可能不得不这样做,但我想寻找一种方法来首先限制客户滞后模糊。 – 2014-09-01 14:18:30
如果你只是想减少滞后和不打扰客户作弊。比我推荐使用UDP,因为它在大多数情况下是真正的异步和比TCP更快的。由于你不想传输文件,但是很短的信息,它可能是你的游戏的最佳选择(就像大多数其他多人游戏一样)。 – 2014-09-01 14:27:27