说我有一个客户端计数器变量。当我向服务器发送请求时,我发送此变量的值,然后将其递增1(对于服务器的下一个请求)。服务器独立跟踪此计数器,并检查以确保客户端发送的计数比计数的自身(服务器端)副本多1。这一切都很好,但考虑以下情况:

  1. 客户端将23发送给服务器。
  2. 服务器收到23,验证它,并将自己的计数器增加到23。
  3. 服务器将All-Okay代码返回给客户端
  4. - 丁 -

    从服务器到客户端的过程中,返回代码已损坏。因此,客户端认为服务器没有更新其计数器,因此将客户端计数器保留为23.从此时起,客户端和服务器不同步。

    是否有人知道任何可能在面对此类可能的损坏/错误时起作用的强大方案?

    谢谢,结果 卡梅伦

有帮助吗?

解决方案

您可以使用随机的“随机数”来代替使用线性增加的计数器。好的64位熵或更多的值。当服务器收到来自客户端的请求时,服务器会检查nonce是否与它发送给客户端的最后一个相匹配。如果是,则处理请求并且服务器生成新的随机现时值以在响应中发送。

服务器可以保留最后两个nonce值以发送给客户端。如果客户端发送旧值,则服务器会假定客户端的最新消息可能已丢失。

上述方法假定您的目标是阻止两个不同的客户端使用相同的凭据与服务器通信。使用nonce方法的优点是无法轻易预测下一个值。

其他提示

简单的答案是使客户端或服务器之一成为资源的所有者,而不是让它们拥有自己的资源副本。

如果你正在使用像TCP这样的可靠协议,你不必担心消息没有到达客户端。

在进行客户端/服务器工作时要遵循的一件好事就是使所有操作都是幂等的。也就是说,每个函数可以被调用一次或多次而没有任何副作用。在这种情况下,您根本就没有“增量”功能。相反,你有一个'设置'功能。

在服务器确认更新服务器计数器之前,如何不让客户端更新其本地副本。

所以:

客户端计算下一个值 客户端向服务器发送下一个值 服务器检查下一个值是否有效(尚未看到) 服务器更新计数器到下一个值(如果需要) 服务器通知客户端已收到下一个值 客户端将本地计数器更新为下一个值

如果服务器未收到客户端更新,则客户端仅重新发送计算的下一个值。如果客户端没有收到下一个值确认,它将重新发送下一个值,但已经看到它的服务器不会更新,而只是确认。最终,客户端看到服务器的消息并继续。这包括丢失消息的情况。

如果您担心损坏,请计算邮件的校验和并发送。在收到时重新计算校验和并将其与发送的校验和进行比较。通常,网络堆栈会为您执行此操作,因此除非您运行自己的协议,否则我不会过分担心它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top