2008-10-18 124 views
3

假設我有一個客戶端計數器變量。當我發送一個請求到服務器時,我發送這個變量的值,然後遞增一(對下一個請求到服務器)。服務器獨立地跟蹤此計數器,並檢查以確保客戶端發送的計數比計數的自己(服務器端)副本多1。這一切都很好,但可以考慮以下情況:同步客戶端和服務器之間的變量

  1. 客戶端向服務器發送23。
  2. 服務器接收23,驗證它,並增加了自己的櫃檯23
  3. 服務器返回全好了代碼,客戶端

- 丁

沿着從方式服務器到客戶端,返回碼被損壞。因此,客戶端認爲服務器沒有更新其計數器,因此將客戶端計數器保留爲23.從此之後,客戶端和服務器不同步。

有沒有人知道任何可能的腐敗/錯誤工作的強大計劃?

感謝,
卡梅倫

回答

2

除了使用線性遞增的計數器之外,還可以使用一個好的64位熵或更多的隨機「隨機數」值。當服務器收到來自客戶端的請求時,服務器將檢查該隨機數是否與發送給客戶端的最後一個匹配。如果是,則處理該請求,並且服務器生成新的隨機現時值以在響應中發送。

服務器可以保留最後兩個nonce值發送給客戶端。如果客戶端發送舊值,則服務器會認爲到客戶端的最新消息可能已丟失。

上述方法假定您的目標是防止兩個不同的客戶端使用相同的憑證與服務器通信。使用nonce方法的優點是不容易預測下一個值。

+0

是的,這是我的目標,但在我的具體情況下,數字的可預測性不會成爲問題。我確實想到了nonce的東西,但是方向完全不同;你的解決方案非常乾淨和快速。謝謝! – Cameron 2008-10-18 23:23:43

1

最簡單的答案是使客戶端或服務器資源的所有者之一,而不是讓雙方擁有自己的資源的副本。

如果您使用像TCP這樣的可靠協議,則不必擔心沒有收到客戶端的消息。

做客戶端/服務器工作時要遵循的一件好事是讓所有的操作都是冪等的。也就是說每個函數都可以被調用一次或多次,而沒有任何副作用。在這種情況下,你根本沒有「增量」功能。相反,你會有一個'設置'功能。

1

如果沒有客戶端更新其本地副本,直到服務器確認服務器計數器的更新。

所以:

客戶端計算 客戶端發送下一個值服務器 服務器會檢查下一個值是有效的(不是已經看到)(如果需要) Server更新計數器到下一個值下一個值 服務器通知客戶端接收到下一個值 客戶端將本地計數器更新爲下一個值

如果服務器未收到客戶端更新,則客戶端僅重新發送計算的下一個值。如果客戶端沒有收到下一個值確認,它將重新發送下一個值,但已經看到它的服務器不會更新,但僅僅是承認。最終,客戶端會看到服務器的消息並繼續。這涵蓋了丟失信息的情況。

如果您擔心腐敗,請計算郵件上的校驗和併發送該郵件。重新計算收到的校驗和並將其與發送的校驗和進行比較。但是,通常網絡堆棧會爲你做這件事,所以除非你正在運行你自己的協議,否則我不會太擔心它。

相關問題