![]() |
Ein Time-Server, der dass Time Protokoll gemäß RFC 868
anbietet, teilt auf Anfrage einem Client das aktuelle Datum und die
genaue Uhrzeit mit, die er von seiner Echtzeituhr oder mit einem
Funkuhrempfänger von der Physikalisch-Technischen Bundesanstalt in
Braunschweig empfängt. Die gelieferte Zeit ist damit im Prinzip genau,
hinkt aber dennoch meistens einige Sekunden hinter der aktuellen Zeit
her, da sie zum einen nur im Sekundentakt ermittelt und versendet wird,
und die Zeit für den Versand dieser Information im Internet noch
hinzukommt. Das NTP Protoll (Network Time Protocol,
RFCs 1119 und 1129) ist daher die modernere, aktuell verwendete
Variante von Time-Servern mit genaueren Zeitangaben und Reaktionszeiten.
Test-Server für das Time-Server-Protokoll
Wir haben bei unseren Recherchen im Internet nur wenige "Time-Server" gefunden, also Rechner, die eine Server-Software für dieses Protokoll öffentlich verfügbar machen, z. B.
| Fachhochschule Niederrhein |
time.mg.fh-niederrhein.de,
Port 37 |
| Universität Wien |
ts1.univie.ac.at
(131.130.1.11), Port 37 ts2.univie.ac.at (131.130.1.12), Port 37 |
Die meisten aktuellen Time-Server verwenden das NTP Protokoll, auch
die beiden oben genannten NTP Server der Universität Wien. Diese bieten
jedoch auch noch das alte Time Protokoll gemäß RFC 868 an. In
wieweit auch andere NTP Server das im Weiteren vorzustellende
"antiquierte" Time Protokoll unterstützen, haben wir nicht weiter
untersucht.
Dokumentation gemäß RFC 868
Network Working Group J. Postel - ISI
Request for Comments: 868 K. Harrenstien - SRI
May 1983
Time Protocol This RFC specifies a standard for the ARPA Internet community. Hosts on the ARPA Internet that choose to implement a Time Protocol are expected to adopt and implement this standard. This protocol provides a site-independent, machine readable date and time. The Time service sends back to the originating source the time in seconds since midnight on January first 1900. One motivation arises from the fact that not all systems have a date/time clock, and all are subject to occasional human or machine error. The use of time-servers makes it possible to quickly confirm or correct a system’s idea of the time, by making a brief poll of several independent sites on the network. This protocol may be used either above the Transmission Control Protocol (TCP) or above the User Datagram Protocol (UDP). When used via TCP the time service works as follows: S: Listen on port 37 (45 octal). U: Connect to port 37. S: Send the time as a 32 bit binary number. U: Receive the time. U: Close the connection. S: Close the connection. The server listens for a connection on port 37. When the connection is established, the server returns a 32-bit time value and closes the connection. If the server is unable to determine the time at its site, it should either refuse the connection or close it without sending anything. When used via UDP the time service works as follows: S: Listen on port 37 (45 octal). U: Send an empty datagram to port 37. S: Receive the empty datagram. S: Send a datagram containing the time as a 32 bit binary number. U: Receive the time datagram. The server listens for a datagram on port 37. When a datagram arrives, the server returns a datagram containing the 32-bit time value. If the server is unable to determine the time at its site, it should discard the arriving datagram and make no reply. The Time The time is the number of seconds since 00:00 (midnight) 1 January 1900 GMT, such that the time 1 is 12:00:01 am on 1 January 1900 GMT; this base will serve until the year 2036. For example: the time 2,208,988,800 corresponds to 00:00 1 Jan 1970 GMT, 2,398,291,200 corresponds to 00:00 1 Jan 1976 GMT, 2,524,521,600 corresponds to 00:00 1 Jan 1980 GMT, 2,629,584,000 corresponds to 00:00 1 May 1983 GMT, and -1,297,728,000 corresponds to 00:00 17 Nov 1858 GMT. |
Für eine erneute Zeitabfrage muss also die
Verbindung immer wieder neu hergestellt werden. Eine Anmeldung und
Autorisierung ist nicht notwendig.
Zustandsdiagramm des Time Protokolls
Das Time Protokoll wird daher als zustandsloses Protokoll bezeichnet. Sein Zustandsdiagramm enthält nur die immer vorhandenen Zustände der Verbindungsaufnahme und geht danach automatisch in den Zustand Getrennt zurück.
Beipiel: Delphi-Programm
zur Abfrage der Atomzeit
Das Programm Time1 holt von einem Time-Server, der das Time
Protokoll verwendet, die aktuellen Informationen ("Atomzeit"), rechnet
diese in das aktuelle Datum und Uhrzeit um und setzt bei Bedarf die
Systemzeit des Rechners auf diese Werte.

Beschreibung des Programms
Durch Klicken auf die Schaltfläche BtZeitHolen wird der Clientsocket initialisiert und eine Verbindung mit dem Timer-Server
aufgebaut. Bestätigt dieser die Verbindung, sendet der automatisch die
Atomzeit. Der Clientsocket ruft diese Information unter Verwendung der
Methode ClientSocketRead ab und schließt die Verbindung.
| procedure
TTimeServer.BtZeitHolenClick (Sender: TObject); begin BtZeitHolen.Enabled:= False; ClientSocket.Host:= EdHost.Text; ClientSocket.Port:= 37; ClientSocket.Open; end; procedure TTimeServer.ClientSocketRead (Sender: TObject; Socket: TCustomWinSocket); var Sekunden: Longword; DatumZeit: TDateTime; {= Real} Datum, Uhrzeit: string; begin Sekunden := AtomzeitEmpfangen; ClientSocket.Close; DatumZeit := DatumZeitEntschluesseln (Sekunden); zDatumZeit := DatumZeit; Datum := DateTimeToStr (trunc(zDatumZeit)); Uhrzeit := DateTimeToStr (zDatumZeit); Delete (Uhrzeit,1,Pos(' ',Uhrzeit)); EdSekunden.Text := IntToStr (Sekunden); EdDatum.Text := Datum; EdUhrzeit.Text := Uhrzeit; BtZeitHolen.Enabled := True; end; procedure TTimeServer.BtZeitSetzenClick (Sender: TObject); var NeueSystemzeit: TSystemTime; begin DateTimeToSystemTime (zDatumZeit, NeueSystemzeit); SetLocalTime (NeueSystemzeit); end; { Hilfsmethoden: } function TTimeServer.AtomzeitEmpfangen: Longword; var Zahl: Array [1..4] of Byte; Sekunden: Longword; I: Integer; begin ClientSocket.Socket.ReceiveBuf (Zahl, 4); // Bytes vertauschen for I := 1 to 4 do Sekunden := Sekunden * 256 + Zahl[I]; AtomzeitEmpfangen := Sekunden; // seit dem 01.01.1900 um 00.00 Uhr end; function TTimeServer.DatumZeitEntschluesseln (Sekunden: Longword): TDateTime; var Zeitzone: Real; DatumZeit: TDateTime; begin Zeitzone := 2/24; // Winterzeit: + 1/24, Sommerzeit: + 2/24 Tage DatumZeit := EncodeDate (1900,1,1) { 1.1.1900 } + Sekunden/86400 { + Tage } + Zeitzone; { + Zeitzone gegenüber GMT } DatumZeitEntschluesseln := DatumZeit end; |
Port öffnen Ereignis: Client hat Daten erhalten Atomzeit empfangen, in die Systemzeit umwandeln, Datum und Uhrzeit herausfiltern, Datum und Uhrzeit anzeigen. Schaltfläche: Systemzeit des Rechners aktualisieren Delphi-Zeit in Systemzeit konvertieren und Systemzeit setzen Atomzeit empfangen Atomzeit in Tage (seit 30.12.1899) umrechnen GMT = Greenwich Mean Time |
Methode AtomzeitEmpfangen
Der Time-Server liefert als 32-Bit Information (4 Byte) die Anzahl
der Sekunden, die seit dem 1.1.1900 vergangen sind. Hieraus müssen dann
Datum und Uhrzeit errechnet werden. Das Resultat ist dann eine
32-Bit-Integer-Zahl, die keine negativen Zahlen darstellt: Typ Longword.
Methode DatumZeitEntschluesseln
In Delphi werden Datum und Uhrzeit in einem Gleikommatyp TDateTime = Extended, also als 64-Bit-Gleitkommazahl abgespeichert. TDateTime ist nur ein Alias für den Typ Extended.
| Ganzzahliger Anteil | enthält die Anzahl der seit
30.12.1899 vergangenen Tage |
| Nachkomma-Anteil | enthält die Stunden, Minuten
Sekunden, Millisekunden als Bruchteil eines Tages (1 = 24h, 0.25 = 6h, 1 h = 0.041666... ) |
Die Methode DatumZeitEntschluesseln konvertiert nun die vom
Timer-Server erhaltenen Sekunden, die seit dem 1.1.1900 vergangen sind,
unter Berücksichtigung der Zeitzone und der Winter- bzw. Sommerzeit in
dieses Format.
Für die Umrechnungen benötigte Systemroutinen
| Methode: | Unit: | Beschreibung: |
| function DateTimeToStr (DateTime: TDateTime): string | Sysutils | konvertiert einen TDateTime-Wert in einen String. Hat der Nachkommaanteil des Parameters DateTime den Wert Null, wird die Zeit nicht angezeigt. |
| procedure DateTimeToSystemTime (DateTime: TDateTime; var SystemTime: TSystemTime) |
Sysutils | DateTimeToSystemTime konvertiert einen Wert des Typs TDateTime in den Win32-API-Typ TSystemTime, sodass er in einem API-Funktionsaufruf für 32-Bit-Windows verwendet werden kann. |
| function EncodeDate (Year, Month, Day: Word): TDateTime | Sysutils |
EncodeDate gibt einen Wert des Typs TDateTime zurück, der einem bestimmten Jahr, Monat und Tag entspricht. |
| procedure SetLocalTime (SystemTime: TSystemTime) | Sysutils | Setzt die Systemzeit (= Datum + Uhrzeit) es Rechners auf den im Parameter SystemTime gesetzen Wert |
Genauere Beschreibungen und weitere Routinen findet man in der Hilfedatei von Delphi.
Abschließende Bemerkung:
Ein Zugriff auf einen NTP Server mithilfe der Delphi-Klasse TClientSocket ist nicht möglich, da das modernere NTP Protokoll auf dem UDP/IP Protokoll basiert.