kopf
brlogo
fensterobenrechts
   
   
fensteruntenblau
   
 
header
 

bt_backward   bt_index   bt_forward

Das Time Protokoll

 

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.
 

 

Funktionsweise dieses Protokolls

 

  1. Der Clientsocket meldet sich am Time-Server an.
  2. Der Server sendet über den Socket die aktuelle Atomzeit codiert als als  4 x 8-Bit-Wert an den Clientsocket - und schließt unmittelbar danach die Socketverbindung.
  3. Im Clientsocket wird das Ereignis OnRead ausgewertet, um die 32-Bit-Information aus dem Puffer des eigenen Sockets auszulesen, gemäß dem oben im Protokoll angegebenen Algorithmus' zu dekodieren und im Client-Programm anzuzeigen.

 

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.

 

time_10

 

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.

 

time_20

 

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.

 

  • Der Typ Longint ist nicht geeignet, da die größte darstellbare positive Zahl Maxint überschritten wird und daher eine negative Anzahl von Sekunden geliefert würde.
  • Eine weitere Klippe: Die 4 Bytes werden in falscher Reihenfolge empfangen. In der Methode werden sie daher zuerst in einem Byte-Feld zwischengespeichert und anschließen in umgekehrter Reihenfolge stellenwertrichtig zur Longword-Zahl zusammengesetzt.

 

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.

 

IcoDelphi7_36  Download Programm Time1 (Delphi 7):  Time1.zip

 

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.

 

   bt_top  

 


(FvSG 30.1.2006)
 
 
Thursday, 23. November 2017 / 14:05:00