Frage

Sagen, dass ich eine clientseitige Zählvariable haben. Wenn ich eine Anfrage an den Server senden, ich diese Variable den Wert senden, es dann um eins zu erhöhen (für die nächste Anfrage an den Server). Der Server verfolgt diesen Zähler selbstständig und überprüft, um sicherzustellen, dass die Zählung durch den Client gesendet 1 mehr als seine eigene (serverseitig) Kopie des Grafen. Das ist alles schön und gut, aber bedenken Sie die folgende Situation:

  1. Der Client sendet, sagen wir, 23 an den Server.
  2. Der Server 23 empfängt, überprüft er, und erhöht seinen eigenen Zähler bis 23.
  3. Der Server liefert den All-OK-Code an den Client

-aber -

Auf dem Weg vom Server zum Client, wird der Return-Code beschädigt. Der Kunde so denkt, dass der Server nicht seine Zähler aktualisieren, und so verlässt die clientseitige Zähler bei 23. Von diesem Punkt an, der Client und Server sind nicht synchron.

Kennt jemand irgendwelche robuste Systeme, die angesichts solcher möglicher Korruption / Fehler?

funktionieren würde

Danke,
Cameron

War es hilfreich?

Lösung

Statt einen linear ansteigenden Zähler zu verwenden, können Sie einen zufälligen „Nonce“ Wert von gut 64 Bit Entropie oder mehr verwenden. Wenn der Server eine Anforderung von dem Client empfängt, prüft der Server, ob der nonce die letzte passt es den Client gesendet. Wenn ja, dann wird die Anforderung verarbeitet und der Server erzeugt einen neuen Zufall Nonce Wert in der Antwort zu senden.

Der Server kann die letzten beiden Nonce Werte halten an den Client zu senden. Wenn der Kunde den alten Wert sendet, dann wird der Server geht davon aus, dass die jüngste Nachricht an den Client verloren haben könnte.

Das obige Verfahren geht davon aus, dass Ihr Ziel ist, zwei verschiedene Clients zu verhindern, dass die gleichen Anmeldeinformationen verwenden, mit dem Server zu kommunizieren. Der Vorteil der nonce Methode besteht darin, dass der nächste Wert nicht leicht vorhergesagt werden kann.

Andere Tipps

Die einfache Antwort ist eine der Client oder Server der Besitzer der Ressource zu machen, anstatt beide machen ihre eigene Kopie der Ressource besitzen.

Wenn Sie ein zuverlässiges Protokoll wie TCP verwenden aber Sie müssen sich keine Sorgen über die Nachricht an den Client nicht bekommen.

Eine gute Sache zu folgen, wenn obwohl tut Client / Server-Arbeit ist alle Operationen zu machen idempotent. Das heißt jede Funktion ein oder mehrmals ohne irgendwelche Nebenwirkungen genannt werden könnte. In diesem Fall würden Sie nicht eine ‚Zuwachs‘ Funktion haben. Stattdessen würden Sie haben eine ‚Set‘ Funktion.

Wie wäre es nur der Client nicht mit seiner lokalen Kopie aktualisieren, bis der Server die Aktualisierung des Servers Zähler erkennt.

So:

Client berechnet nächsten Wert Client sendet nächsten Wert Server Server überprüft, dass im nächsten Wert gültig ist (nicht schon gesehen) Server-Updates Zähler auf den nächsten Wert (falls erforderlich) Server benachrichtigt Client, dass im nächsten Wert empfangen wurde Client aktualisiert lokale Zähler auf den nächsten Wert

Wenn der Server nicht das Client-Update erhält, sendet der Kunde lediglich den nächsten Wert berechnet. Wenn der Kunde der nächste Wert Bestätigung nicht empfängt, wird es den nächsten Wert erneut senden, aber der Server hat es bereits aktualisiert nicht gesehen, sondern nur anerkennt. Schließlich sieht der Client die Nachricht des Servers und fährt fort. Dies deckt den Fall der verlorenen Nachrichten.

Wenn Sie besorgt über die Korruption sind, eine Prüfsumme für die Nachricht berechnen und das auch senden. Neu berechnen die Prüfsumme beim Empfang und vergleichen Sie es mit dem einen gesendet. Im Allgemeinen wird das Netzwerk-Stack tut dies für Sie, obwohl, so würde ich nicht zu viel Sorgen machen, wenn Ihr ein eigenes Protokoll ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top