[linux] Regarding: ntp servers bereikbaar

Paul Slootman paul+nospam op wurtel.net
Di Apr 14 13:50:43 CEST 2020


On Tue 14 Apr 2020, paai wrote:
> 
> > Mijn 1e stap zou zijn: kies een vaste NTP server. Als je xs4all klant
> > bent, ntp.xs4all.nl, dan krijg je altijd dezelfde IP adres (daarachter
> > kunnen natuurlijk meerdere servers zitten, maar daar kun je ook niks aan
> > doen). Je kunt ook je router IP proberen, soms willen die ook wel als
> > NTP server spelen
> > 
> > 2e stap: Gebruik tcpdump of wireshark om NTP verkeer te loggen. Dan kun
> > je zien of je daadwerkelijk antwoord krijgt, en of er ook correcte
> > tijden in die antwoorden zitten. Ik verwacht van wel, en dat die Arduino
> > libs misschien bepaalde variaties / opties niet ondersteunen.
> 
> dat is een heel eind buiten mijn comfort zone...

Jij was toch van nieuwe dingen leren? :-)

> Is ntp op de ene of andere manier gevoelig voor timing? Of dat hij niet
> antwoordt als je te vaak pollt?

Uiteraard is het gevoelig voor timing...
En je moet inderdaad niet te vaak pollen, dan loop je tegen een
begrenzing aan.

Maar je hoeft de tijd toch niet op de microsec nauwkeurig te hebben?
Ik heb even tcpdump voor je gedaan, dan kun je zien wat er langs komt;
eerst een request vanaf de lokale doos, en antwoord van de NTP server:

# tcpdump -vni eth0 port 123
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
13:44:41.984859 IP (tos 0x0, ttl 64, id 61147, offset 0, flags [DF], proto UDP (17), length 76)
    172.18.1.11.33171 > 172.18.1.1.123: NTPv4, length 48
	Client, Leap indicator: clock unsynchronized (192), Stratum 0 (unspecified), poll 3 (8s), precision -6
	Root Delay: 1.000000, Root dispersion: 1.000000, Reference-ID: (unspec)
	  Reference Timestamp:  0.000000000
	  Originator Timestamp: 0.000000000
	  Receive Timestamp:    0.000000000
	  Transmit Timestamp:   3795853481.984825637 (2020/04/14 13:44:41)
	    Originator - Receive Timestamp:  0.000000000
	    Originator - Transmit Timestamp: 3795853481.984825637 (2020/04/14 13:44:41)
13:44:41.985177 IP (tos 0xb8, ttl 64, id 13625, offset 0, flags [DF], proto UDP (17), length 76)
    172.18.1.1.123 > 172.18.1.11.33171: NTPv4, length 48
	Server, Leap indicator:  (0), Stratum 2 (secondary reference), poll 3 (8s), precision -18
	Root Delay: 0.006591, Root dispersion: 0.026367, Reference-ID: 46.243.26.34
	  Reference Timestamp:  3795852766.162367424 (2020/04/14 13:32:46)
	  Originator Timestamp: 3795853481.984825637 (2020/04/14 13:44:41)
	  Receive Timestamp:    3795853481.984198910 (2020/04/14 13:44:41)
	  Transmit Timestamp:   3795853481.984330356 (2020/04/14 13:44:41)
	    Originator - Receive Timestamp:  -0.000626727
	    Originator - Transmit Timestamp: -0.000495281

Je moet dus simpel de "Transmit Timestamp" pakken en die gebruiken.
Het complete NTP protocol is enorm ingewikkeld en er zijn maar een paar
mensen op aarde die het helemaal snappen (dus er wordt al langere tijd
zorgen gemaakt over de toekomst van NTPd maar dat terzijde), maar een
enkele response packet is voor jouw toepassing ruim voldoende.

De vraag is nu: hoe verzend je een fatsoenlijk query packet waarop de
server wel antwoord wilt sturen... geen idee of dan al de transmit
timestamp enigzins kloppend moet zijn.

Alternatief zou ook wel de DHCP lease kunnen zijn, volgens mij staat
daar ook in wanneer de lease in gaat (dat is dus "nu").

Paul


Meer informatie over de Linux maillijst