2010-07-30 5 views
5

Ich habe eine Anwendung, die aus zahlreichen Systemen besteht, die UDP-Clients an entfernten Standorten verwenden. Alle Clients senden UDP-Pakete zur Verarbeitung an einen zentralen Ort. In meiner Anwendung ist es wichtig, dass der zentrale Standort weiß, zu welcher Zeit das Paket vom entfernten Standort gesendet wurde.UDP-Verzögerungspotenzial

Wäre es aus Sicht des Designs "sicher" anzunehmen, dass der zentrale Standort die Pakete bei ihrer Ankunft mit einem Zeitstempel versehen und diese als "Sendezeit" verwenden könnte? Da die App UDP verwendet, sollten die Pakete entweder sofort ankommen oder gar nicht ankommen? Die andere Möglichkeit wäre, eine Art Zeitsynchronisierung für jeden entfernten Standort einzurichten. Der Nachteil dabei ist, dass ich dann ständig sicherstellen müsste, dass die Zeitsynchronisierung an jedem von möglicherweise hunderten entfernten Standorten funktioniert.

Meine Frage ist, ob Timestamping der UDP-Pakete an der zentralen Stelle, um "Sendezeit" zu bestimmen, ein potenzieller Fehler ist. Kann es zu Verzögerungen mit UDP kommen?

+3

Wie genau soll es sein? Bis auf die Minute? Zweite? Millisekunde? –

+1

Bis auf die Sekunde. – Mike

+1

Ich weiß überhaupt nichts über Netzwerkprogrammierung, also werfe ich das als Option aus, aber ich frage mich, ob Sie annehmen könnten, dass es eine Verzögerung gibt und leicht kompensieren kann? So etwas wie ein Handshake-Verfahren ... wenn also ein Remote-Client eine Verbindung zum zentralen Standort herstellt, wird er vielleicht 1000 Mal gepingt und Sie behalten ein Wörterbuch ? Ich bin sicher, es ist keine großartige Lösung, aber es scheint sicher besser, als keine Verzögerung zu unterstellen. – NickHalden

Antwort

3

Für die Sekundenauflösung können Sie das Zeitstempeln verwenden, wenn Sie das Paket erhalten, aber Sie müssen immer noch eine Sequenznummer verwenden, um neu geordnete oder duplizierte Pakete zu blockieren.

Dies kann Ihre Gegenstellen weniger komplex machen, da sie keine batteriegestützte Uhr oder Synchronisationstechniken benötigen.

Für Millisekunden Auflösung möchten Sie die Umlaufzeit (RTT) berechnen und verwenden Sie diesen Offset auf die Uhr am Empfänger.

Wenn Sie das PTP-Protokoll (Precise Time Protocol) nicht in einer kontrollierten Umgebung verwenden, können Sie der Uhr von Remote-Hosts niemals vertrauen.

+0

"Wenn Sie das PTP-Protokoll (Precise Time Protocol) nicht in einer kontrollierten Umgebung verwenden, können Sie der Uhr von Remote-Hosts niemals vertrauen." Dies ist genau der Grund, warum ich begann, die Host-Zeit zu verwenden, um jedes Paket zu stempeln. Selbst mit all meinen entfernten Hosts, die NTP verwenden, gibt es Zeitdrifts, die mit ein paar Sekunden gleichzusetzen sind. – Mike

1

Es gibt immer eine Verzögerung bei der Übertragung, und UDP-Pakete haben keine garantierte Zustellung, noch werden sie garantiert in der Reihenfolge ankommen.

Brauchen mehr Informationen über den Kontext, um eine bessere Lösung zu empfehlen.

0

Eine Option wäre, dass die Client-Uhren mit einer externen Atomuhr synchronisiert werden. Um dies zu gewährleisten und Ihr UDP robuster zu machen, kann der Server alle Pakete ablehnen, die "spät" ankommen (wie durch den Unterschied in der Uhr des Servers - auch extern synchronisiert - und dem Paket-Zeitstempel) bestimmt ist.

Wenn Ihr Server Pakete packt, kann er dem Client melden, dass er (möglicherweise) nicht mehr synchron ist, damit er sich erneut synchronisieren kann.

Wenn Ihr Server keine Pakete abfängt, wird Ihr gesamtes System aufgrund fehlender oder fehlender bestückter Pakete auf jeden Fall ausfallen.