【发布时间】:2018-01-15 13:58:17
【问题描述】:
背景:我正在开发一个小游戏,利用玩家的延迟做lag compensation。该游戏是开源的,因此目前对系统进行逆向工程并延迟响应时间以人为增加报告的延迟是一项非常容易的任务,从而可能导致不公平的优势。
我目前的延迟检索策略是:
- 每个固定间隔我都会向玩家发送一条标记为“ping”的消息。 (这与 ICMP 无关)
- 此 ping 消息包含一个特殊的“ping”操作码和一个带有序列号的负载
- 一旦客户端收到所述消息,他会发回一条带有“pong”操作码和具有相同序列号的有效负载
- 当服务器收到标记为“pong”的消息时,它会计算发送和接收之间经过的时间。这是往返时间
- 我们的延迟是 rtt / 2
在伪代码中
服务器:
function now() {
return current UTC time in millis
}
i = 0
function nextSequence() {
return i++
}
sendingTimestamps = []
function onPingEvent() {
id = nextSequence()
sendingTimestamps[id] = now()
sendPingMessage(id)
}
function onPongReceived(id) {
received = now()
sent = sendingTimestamps[id]
rtt = received - sent
latency = rtt / 2
}
客户:
function onPingReceived(id) {
sendPongMessage(id)
}
如您所见,客户很容易在其代码中添加延迟来夸大其报告的延迟。
有没有更好的方法来让客户延迟以减少他们作弊的空间?
【问题讨论】:
-
ping 报告的延迟仅适用于 ICMP。我怀疑您在游戏中使用 ICMP,因此 ICMP 延迟可能与您使用的协议中的延迟没有直接关系。这就像测量您在一条道路上的交通速度,但试图将其应用于具有不同交通条件的不同道路。那样不行。
-
你是对的,但我没有使用 ICMP ping。我通过 websocket 向客户端发送一条 TCP 消息,客户端在同一个套接字上再次响应,该套接字也用于其余的通信。编辑了问题以提及这一点。
-
那你就不应该叫它ping。 Ping 是多年前创建的一个应用程序,它使用 ICMP echo 和 ICMP echo reply 来确定是否可以访问主机。您通过将其命名为与其他事物相同来混淆事物。
-
@RonMaupin 好点。
delay会是一个更好的名字吗? -
抱歉打扰了,但测量延迟的目的是什么?延迟补偿应该依赖于时间戳而不是测量的数据包延迟,后者可能会在很宽的范围内动态变化。服务器开始在其一侧模拟世界并向所有客户端发送命令 START。客户端启动模拟世界并计算其创建的滴答声。每当客户端发生任何事件时,客户端都会将其与时间戳一起发送到服务器。就像“用户在第 183 点按火”。
标签: networking latency exploit anti-cheat