āĻšā§āϝāĻžāϞ⧠āĻšā§āϝāĻžāĻŦā§āϰāĻžāϏāĻžāϰā§āϏāĨ¤ āĻāĻ āĻāĻŽāĻŋ āĻāĻĒāύāĻžāϰ āύāĻŋāĻā§āϰ āϏāĻšāĻ NTP āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻāĻŋāĻāĻžāĻŦā§ āϞāĻŋāĻāϤ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻāĻžāĻ. āĻŽā§āϞāϤ, āĻāĻĨā§āĻĒāĻāĻĨāύāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻā§āϰ āĻāĻ āύ āĻāĻŦāĻ NTP āϏāĻžāϰā§āĻāĻžāϰ āĻĨā§āĻā§ āĻā§āĻāĻžāĻŦā§ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻž āĻšāϝāĻŧ āϤāĻžāϰ āĻĻāĻŋāĻā§ āĻĢāĻŋāϰ⧠āϝāĻžāĻŦā§āĨ¤ āĻā§āĻĄāĻāĻŋ āĻĒāĻžāĻāĻĨāύ⧠āϞā§āĻāĻž āĻšāĻŦā§, āĻāĻžāϰāĻŖ, āĻāĻŽāĻžāϰ āĻŽāϤā§, āĻāĻ āϧāϰāύā§āϰ āĻāĻŋāύāĻŋāϏā§āϰ āĻāύā§āϝ āĻāϰ āĻā§āύ āĻāĻžāϞ⧠āĻāĻžāώāĻž āύā§āĻāĨ¤ Connoisseurs ntplib āĻā§āĻĄā§āϰ āϏāĻžāĻĨā§ āĻā§āĻĄā§āϰ āĻŽāĻŋāϞā§āϰ āĻĻāĻŋāĻā§ āĻŽāύā§āϝā§āĻ āĻĻā§āĻŦā§āύ - āĻāĻŽāĻŋ āĻāĻāĻŋ āĻĻā§āĻŦāĻžāϰāĻž "āĻ
āύā§āĻĒā§āϰāĻžāĻŖāĻŋāϤ" āĻšāϝāĻŧā§āĻāĻŋāĨ¤
āϤāĻžāĻ NTP āĻāĻŋ āϝāĻžāĻāĻšā§āĻ? NTP āĻšāϞ āϏāĻŽāϝāĻŧ āϏāĻžāϰā§āĻāĻžāϰā§āϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āĻāϞāĨ¤ āĻāĻ āĻĒā§āϰā§āĻā§āĻāϞ āĻ
āύā§āĻ āĻāϧā§āύāĻŋāĻ āĻŽā§āĻļāĻŋāύ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāύā§āĻĄā§āĻā§āϰ w32tm āĻĒāϰāĻŋāώā§āĻŦāĻžāĨ¤
NTP āĻĒā§āϰā§āĻā§āĻāϞā§āϰ āĻŽā§āĻ ā§ĢāĻāĻŋ āϏāĻāϏā§āĻāϰāĻŖ āϰāϝāĻŧā§āĻā§āĨ¤ āĻĒā§āϰāĻĨāĻŽ āϏāĻāϏā§āĻāϰāĻŖ 0 (1985, RFC958), āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻ āĻĒā§āϰāĻāϞāĻŋāϤ āĻŦāϞ⧠āĻŦāĻŋāĻŦā§āĻāĻŋāϤ āĻšāϝāĻŧāĨ¤ āύāϤā§āύ āϏāĻāϏā§āĻāϰāĻŖāĻā§āϞāĻŋ āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāĻā§āĻā§: āϏāĻāϏā§āĻāϰāĻŖ 1 (1988, RFC1059), āϏāĻāϏā§āĻāϰāĻŖ 2 (1989, RFC1119), āϏāĻāϏā§āĻāϰāĻŖ 3 (1992, RFC1305), āĻāĻŦāĻ āϏāĻāϏā§āĻāϰāĻŖ 4 (1996, RFC2030)āĨ¤ āϏāĻāϏā§āĻāϰāĻŖ 1-4 āĻāĻā§ āĻ āĻĒāϰā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ; āϤāĻžāϰāĻž āĻā§āĻŦāϞ āϤāĻžāĻĻā§āϰ āĻ āĻĒāĻžāϰā§āĻāĻŋāĻ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽā§ āĻāĻŋāύā§āύāĨ¤ āϏāĻžāϰā§āĻāĻžāϰ.
āĻĒā§āϝāĻžāĻā§āĻ āĻŦāĻŋāύā§āϝāĻžāϏ

āϞāĻŋāĻĒ āϏā§āĻāĻ (āϏāĻāĻļā§āϧāύ āϏā§āĻāĻ) āĻāĻŽāύ āĻāĻāĻāĻŋ āϏāĻāĻā§āϝāĻž āϝāĻž āϞāĻŋāĻĒ āϏā§āĻā§āύā§āĻĄ āϏāϤāϰā§āĻāϤāĻž āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰā§āĨ¤ āĻ
āϰā§āĻĨ:
- 0 - āĻā§āύ āϏāĻāĻļā§āϧāύ āύā§āĻ
- 1 - āĻĻāĻŋāύā§āϰ āĻļā§āώ āĻŽāĻŋāύāĻŋāĻā§ 61 āϏā§āĻā§āύā§āĻĄ āĻĨāĻžāĻā§
- 2 - āĻĻāĻŋāύā§āϰ āĻļā§āώ āĻŽāĻŋāύāĻŋāĻā§ 59 āϏā§āĻā§āύā§āĻĄ āĻĨāĻžāĻā§
- 3 - āϏāĻžāϰā§āĻāĻžāϰ āĻŦā§āϝāϰā§āĻĨāϤāĻž (āϏāĻŋāĻā§āĻā§āϰ āϏāĻŽāϝāĻŧ āĻļā§āώ)
āϏāĻāϏā§āĻāϰāĻŖ āύāĻŽā§āĻŦāϰ (āϏāĻāϏā§āĻāϰāĻŖ āύāĻŽā§āĻŦāϰ) â NTP āĻĒā§āϰā§āĻā§āĻāϞ āϏāĻāϏā§āĻāϰāĻŖ āύāĻŽā§āĻŦāϰ (1-4)āĨ¤
āĻŽā§āĻĄ (āĻŽā§āĻĄ) â āĻĒā§āϝāĻžāĻā§āĻ āĻĒā§āϰā§āϰāĻā§āϰ āĻ āĻĒāĻžāϰā§āĻļāύ āĻŽā§āĻĄāĨ¤ āĻŽāĻžāύ 0 āĻĨā§āĻā§ 7, āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻžāϧāĻžāϰāĻŖ:
- 3 - āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ
- 4 - āϏāĻžāϰā§āĻāĻžāϰ
- 5 - āϏāĻŽā§āĻĒā§āϰāĻāĻžāϰ āĻŽā§āĻĄ
āϏā§āĻā§āϰā§āĻāĻžāĻŽ (āϞā§āϝāĻŧāĻžāϰāĻŋāĻ āϞā§āĻā§āϞ) - āϏāĻžāϰā§āĻāĻžāϰ āĻāĻŦāĻ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻāĻĄāĻŧāĻŋāϰ āĻŽāϧā§āϝ⧠āĻŽāϧā§āϝāĻŦāϰā§āϤ⧠āϏā§āϤāϰā§āϰ āϏāĻāĻā§āϝāĻž (1 - āϏāĻžāϰā§āĻāĻžāϰ āϏāϰāĻžāϏāϰāĻŋ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻāĻĄāĻŧāĻŋ āĻĨā§āĻā§ āĻĄā§āĻāĻž āύā§āϝāĻŧ, 2 - āϏāĻžāϰā§āĻāĻžāϰāĻāĻŋ āϏā§āϤāϰ 1 āϏāĻš āϏāĻžāϰā§āĻāĻžāϰ āĻĨā§āĻā§ āĻĄā§āĻāĻž āύā§āϝāĻŧ, āĻāϤā§āϝāĻžāĻĻāĻŋ)āĨ¤
āĻĒā§āϞ āĻā§āϰāĻŽāĻžāĻāϤ āĻŦāĻžāϰā§āϤāĻžāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āϏāϰā§āĻŦāĻžāϧāĻŋāĻ āĻŦā§āϝāĻŦāϧāĻžāύā§āϰ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§āĻŦāĻāĻžāϰ⧠āĻāĻāĻāĻŋ āϏā§āĻŦāĻžāĻā§āώāϰāĻŋāϤ āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻžāĨ¤ NTP āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻāĻāĻžāύ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰ⧠āϝ⧠āĻŦā§āϝāĻŦāϧāĻžāύ⧠āĻāĻāĻŋ āϏāĻžāϰā§āĻāĻžāϰ⧠āĻĒā§āϞ āĻāϰāĻžāϰ āĻāĻļāĻž āĻāϰā§, āĻāĻŦāĻ NTP āϏāĻžāϰā§āĻāĻžāϰ āϏā§āĻ āĻŦāĻŋāϰāϤāĻŋāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰ⧠āϝā§āĻāĻžāύ⧠āĻāĻāĻŋ āĻĒā§āϞ āĻšāĻāϝāĻŧāĻžāϰ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻž āĻāϰā§āĨ¤ āĻŽāĻžāύāĻāĻŋ āϏā§āĻā§āύā§āĻĄā§āϰ āĻŦāĻžāĻāύāĻžāϰāĻŋ āϞāĻāĻžāϰāĻŋāĻĻāĻŽā§āϰ āϏāĻŽāĻžāύāĨ¤
āϏā§āĻĒāώā§āĻāϤāĻž (āύāĻŋāϰā§āĻā§āϞāϤāĻž) āĻšāϞ āĻāĻāĻāĻŋ āϏā§āĻŦāĻžāĻā§āώāϰāĻŋāϤ āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻž āϝāĻž āϏāĻŋāϏā§āĻā§āĻŽ āĻāĻĄāĻŧāĻŋāϰ āύāĻŋāϰā§āĻā§āϞāϤāĻžāϰ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§āĻŦ āĻāϰā§āĨ¤ āĻŽāĻžāύāĻāĻŋ āϏā§āĻā§āύā§āĻĄā§āϰ āĻŦāĻžāĻāύāĻžāϰāĻŋ āϞāĻāĻžāϰāĻŋāĻĻāĻŽā§āϰ āϏāĻŽāĻžāύāĨ¤
āĻŽā§āϞ āĻŦāĻŋāϞāĻŽā§āĻŦ (āϏāĻžāϰā§āĻāĻžāϰ āϞā§āĻā§āύā§āϏāĻŋ) āĻšāϞ āĻāύāĻāĻŋāĻĒāĻŋ āϏāĻžāϰā§āĻāĻžāϰ⧠āĻĒā§āĻāĻāϤ⧠āĻāĻĄāĻŧāĻŋāϰ āϏāĻŽāϝāĻŧ āϞāĻžāĻā§, āϏā§āĻā§āύā§āĻĄā§āϰ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ-āĻŦāĻŋāύā§āĻĻā§ āϏāĻāĻā§āϝāĻž āĻšāĻŋāϏāĻžāĻŦā§āĨ¤
āĻŽā§āϞ āĻŦāĻŋāĻā§āĻā§āϰāĻŖ (āϏāĻžāϰā§āĻāĻžāϰ āϏā§āĻā§āϝāĻžāĻāĻžāϰ) - āϏā§āĻā§āύā§āĻĄā§āϰ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ-āĻŦāĻŋāύā§āĻĻā§ āϏāĻāĻā§āϝāĻž āĻšāĻŋāϏāĻžāĻŦā§ NTP āϏāĻžāϰā§āĻāĻžāϰ āĻāĻĄāĻŧāĻŋāϰ āϏā§āĻā§āϝāĻžāĻāĻžāϰāĨ¤
āϰā§āĻĢ āĻāĻāĻĄāĻŋ (āϏā§āϰā§āϏ āĻāĻāĻĄāĻŋ) â āĻāϝāĻŧāĻžāĻ āĻāĻāĻĄāĻŋāĨ¤ āϝāĻĻāĻŋ āϏāĻžāϰā§āĻāĻžāϰ⧠āϏā§āĻā§āϰā§āϝāĻžāĻāĻžāĻŽ 1 āĻĨāĻžāĻā§, āϤāĻžāĻšāϞ⧠āϰā§āĻĢ āĻāĻāĻĄāĻŋ āĻšāϞ āĻĒāĻžāϰāĻŽāĻžāĻŖāĻŦāĻŋāĻ āĻāĻĄāĻŧāĻŋāϰ āύāĻžāĻŽ (4 ASCII āĻ
āĻā§āώāϰ)āĨ¤ āϝāĻĻāĻŋ āϏāĻžāϰā§āĻāĻžāϰ āĻ
āύā§āϝ āϏāĻžāϰā§āĻāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āϤāĻžāĻšāϞ⧠āϰā§āĻĢ āĻāĻāĻĄāĻŋāϤ⧠āĻāĻ āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻ āĻŋāĻāĻžāύāĻž āĻĨāĻžāĻā§āĨ¤
āĻļā§āώ 4āĻāĻŋ āĻā§āώā§āϤā§āϰ āĻšāϞ āϏāĻŽāϝāĻŧ - 32 āĻŦāĻŋāĻ - āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻž āĻ
āĻāĻļ, 32 āĻŦāĻŋāĻ - āĻāĻā§āύāĻžāĻāĻļ āĻ
āĻāĻļāĨ¤
āĻāϞā§āϞā§āĻ - āϏāĻžāϰā§āĻāĻžāϰ⧠āϏāϰā§āĻŦāĻļā§āώ āĻāĻĄāĻŧāĻŋāĨ¤
āĻā§āĻĒāϤā§āϤāĻŋ - āĻĒā§āϝāĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāύā§āϰ āϏāĻŽāϝāĻŧ (āϏāĻžāϰā§āĻāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰā§āĻŖ - āύā§āĻā§ āĻāĻāĻŋ āĻāϰāĻ)āĨ¤
āύāĻŋāύ - āϝāĻāύ āĻĒā§āϝāĻžāĻā§āĻ āϏāĻžāϰā§āĻāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻā§āĻšā§āϤ āĻšāϝāĻŧ.
āĻĒā§āϰā§āϰāĻŖ āĻāϰāĻž - āϝāĻāύ āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āϏāĻžāϰā§āĻāĻžāϰ āĻĨā§āĻā§ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻā§āϰ āĻāĻžāĻā§ āĻĒāĻžāĻ āĻžāύ⧠āĻšāϝāĻŧā§āĻāĻŋāϞ (āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻāϰāĻžāĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āύā§āĻā§ āĻāϰāĻ āĻāĻŋāĻā§)āĨ¤
āĻļā§āώ āĻĻā§āĻāĻŋ āĻā§āώā§āϤā§āϰ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻž āĻšāĻŦā§ āύāĻž.
āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϝāĻžāĻā§āĻ āϞāĻŋāĻā§āύ:
āĻĒā§āϝāĻžāĻā§āĻ āĻā§āĻĄ
class NTPPacket:
_FORMAT = "!B B b b 11I"
def __init__(self, version_number=2, mode=3, transmit=0):
# Necessary of enter leap second (2 bits)
self.leap_indicator = 0
# Version of protocol (3 bits)
self.version_number = version_number
# Mode of sender (3 bits)
self.mode = mode
# The level of "layering" reading time (1 byte)
self.stratum = 0
# Interval between requests (1 byte)
self.pool = 0
# Precision (log2) (1 byte)
self.precision = 0
# Interval for the clock reach NTP server (4 bytes)
self.root_delay = 0
# Scatter the clock NTP-server (4 bytes)
self.root_dispersion = 0
# Indicator of clocks (4 bytes)
self.ref_id = 0
# Last update time on server (8 bytes)
self.reference = 0
# Time of sending packet from local machine (8 bytes)
self.originate = 0
# Time of receipt on server (8 bytes)
self.receive = 0
# Time of sending answer from server (8 bytes)
self.transmit = transmit
āϏāĻžāϰā§āĻāĻžāϰ⧠āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāϤ⧠(āĻāĻŦāĻ āĻā§āϰāĻšāĻŖ āĻāϰāϤā§), āĻāĻŽāĻžāĻĻā§āϰ āĻ
āĻŦāĻļā§āϝāĻ āĻāĻāĻŋāĻā§ āĻŦāĻžāĻāĻā§āϰ āĻ
ā§āϝāĻžāϰā§āϤ⧠āĻĒāϰāĻŋāĻŖāϤ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻ (āĻāĻŦāĻ āĻŦāĻŋāĻĒāϰā§āϤ) āĻ
āĻĒāĻžāϰā§āĻļāύā§āϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻĻā§āĻāĻŋ āĻĢāĻžāĻāĻļāύ āϞāĻŋāĻāĻŦ - pack() āĻāĻŦāĻ unpack():
āĻĒā§āϝāĻžāĻ āĻĢāĻžāĻāĻļāύ
def pack(self):
return struct.pack(NTPPacket._FORMAT,
(self.leap_indicator << 6) +
(self.version_number << 3) + self.mode,
self.stratum,
self.pool,
self.precision,
int(self.root_delay) + get_fraction(self.root_delay, 16),
int(self.root_dispersion) +
get_fraction(self.root_dispersion, 16),
self.ref_id,
int(self.reference),
get_fraction(self.reference, 32),
int(self.originate),
get_fraction(self.originate, 32),
int(self.receive),
get_fraction(self.receive, 32),
int(self.transmit),
get_fraction(self.transmit, 32))
āĻāύāĻĒā§āϝāĻžāĻ āĻĢāĻžāĻāĻļāύ
def unpack(self, data: bytes):
unpacked_data = struct.unpack(NTPPacket._FORMAT, data)
self.leap_indicator = unpacked_data[0] >> 6 # 2 bits
self.version_number = unpacked_data[0] >> 3 & 0b111 # 3 bits
self.mode = unpacked_data[0] & 0b111 # 3 bits
self.stratum = unpacked_data[1] # 1 byte
self.pool = unpacked_data[2] # 1 byte
self.precision = unpacked_data[3] # 1 byte
# 2 bytes | 2 bytes
self.root_delay = (unpacked_data[4] >> 16) +
(unpacked_data[4] & 0xFFFF) / 2 ** 16
# 2 bytes | 2 bytes
self.root_dispersion = (unpacked_data[5] >> 16) +
(unpacked_data[5] & 0xFFFF) / 2 ** 16
# 4 bytes
self.ref_id = str((unpacked_data[6] >> 24) & 0xFF) + " " +
str((unpacked_data[6] >> 16) & 0xFF) + " " +
str((unpacked_data[6] >> 8) & 0xFF) + " " +
str(unpacked_data[6] & 0xFF)
self.reference = unpacked_data[7] + unpacked_data[8] / 2 ** 32 # 8 bytes
self.originate = unpacked_data[9] + unpacked_data[10] / 2 ** 32 # 8 bytes
self.receive = unpacked_data[11] + unpacked_data[12] / 2 ** 32 # 8 bytes
self.transmit = unpacked_data[13] + unpacked_data[14] / 2 ** 32 # 8 bytes
return self
āĻ āϞāϏ āϞā§āĻā§āĻĻā§āϰ āĻāύā§āϝ, āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻšāĻŋāϏāĻžāĻŦā§ - āĻā§āĻĄ āϝāĻž āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋāĻā§ āĻāĻāĻāĻŋ āϏā§āύā§āĻĻāϰ āϏā§āĻā§āϰāĻŋāĻāϝāĻŧā§ āĻĒāϰāĻŋāĻŖāϤ āĻāϰā§
def to_display(self):
return "Leap indicator: {0.leap_indicator}n"
"Version number: {0.version_number}n"
"Mode: {0.mode}n"
"Stratum: {0.stratum}n"
"Pool: {0.pool}n"
"Precision: {0.precision}n"
"Root delay: {0.root_delay}n"
"Root dispersion: {0.root_dispersion}n"
"Ref id: {0.ref_id}n"
"Reference: {0.reference}n"
"Originate: {0.originate}n"
"Receive: {0.receive}n"
"Transmit: {0.transmit}"
.format(self)
āϏāĻžāϰā§āĻāĻžāϰ⧠āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāύ⧠āĻšāĻā§āĻā§
āϏāĻžāϰā§āĻāĻžāϰ⧠āĻāϰāĻž āĻā§āώā§āϤā§āϰ āϏāĻš āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāύ āϏāĻāϏā§āĻāϰāĻŖ, āĻŽā§āĻĄ и āĻĒā§āϰā§āϰāĻŖ āĻāϰāĻžāĨ¤ āĻĻā§āϝ āĻĒā§āϰā§āϰāĻŖ āĻāϰāĻž āĻāĻĒāύāĻžāĻā§ āĻ āĻŦāĻļā§āϝāĻ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻŽā§āĻļāĻŋāύ⧠āĻŦāϰā§āϤāĻŽāĻžāύ āϏāĻŽāϝāĻŧ āĻāϞā§āϞā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§ (āĻāĻžāύā§āϝāĻŧāĻžāϰāĻŋ 1, 1900 āĻĨā§āĻā§ āϏā§āĻā§āύā§āĻĄā§āϰ āϏāĻāĻā§āϝāĻž), āϏāĻāϏā§āĻāϰāĻŖ - 1-4, āĻŽā§āĻĄ - 3 (āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻŽā§āĻĄ)āĨ¤
āϏāĻžāϰā§āĻāĻžāϰ, āĻ āύā§āϰā§āϧ āĻĒāĻžāĻāϝāĻŧāĻžāϰ āĻĒāϰā§, NTP āĻĒā§āϝāĻžāĻā§āĻā§ āϏāĻŽāϏā§āϤ āĻā§āώā§āϤā§āϰ āĻĒā§āϰāĻŖ āĻāϰā§, āĻā§āώā§āϤā§āϰā§āϰ āĻŽāϧā§āϝ⧠āĻ āύā§āϞāĻŋāĻĒāĻŋ āĻāϰ⧠āĻā§āĻĒāϤā§āϤāĻŋ āĻĨā§āĻā§ āĻŽāĻžāύ āĻĒā§āϰā§āϰāĻŖ āĻāϰāĻž, āϝāĻž āĻ āύā§āϰā§āϧ āĻāϏā§āĻāĻŋāϞ. āĻā§āύ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻ āĻŦāĻŋāϞāĻŽā§āĻŦā§ āĻā§āώā§āϤā§āϰ⧠āϤāĻžāϰ āϏāĻŽāϝāĻŧā§āϰ āĻŽā§āϞā§āϝ āĻĒā§āϰāĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻž āĻāĻāĻž āĻāĻŽāĻžāϰ āĻāĻžāĻā§ āĻāĻāĻāĻŋ āϰāĻšāϏā§āϝ āĻā§āĻĒāϤā§āϤāĻŋ. āĻĢāϞāϏā§āĻŦāϰā§āĻĒ, āϝāĻāύ āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻĢāĻŋāϰ⧠āĻāϏā§, āϤāĻāύ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻā§āϰ 4āĻāĻŋ āϏāĻŽāϝāĻŧā§āϰ āĻŽāĻžāύ āĻĨāĻžāĻā§ - āĻ āύā§āϰā§āϧāĻāĻŋ āĻĒāĻžāĻ āĻžāύā§āϰ āϏāĻŽāϝāĻŧ (āĻā§āĻĒāϤā§āϤāĻŋ), āϝ⧠āϏāĻŽāϝāĻŧ āϏāĻžāϰā§āĻāĻžāϰ āĻ āύā§āϰā§āϧ āĻĒā§āϝāĻŧā§āĻāĻŋāϞ (āύāĻŋāύ), āϏāĻžāϰā§āĻāĻžāϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒāĻžāĻ āĻžāύā§āϰ āϏāĻŽāϝāĻŧ (āĻĒā§āϰā§āϰāĻŖ āĻāϰāĻž) āĻāĻŦāĻ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒā§āϰāĻžāĻĒā§āϤāĻŋāϰ āϏāĻŽāϝāĻŧ - āĻĒā§āĻāĻāĻž (āĻĒā§āϝāĻžāĻā§āĻā§ āύā§āĻ)āĨ¤ āĻāĻ āĻŽāĻžāύ āĻĻāĻŋāϝāĻŧā§ āĻāĻŽāϰāĻž āϏāĻ āĻŋāĻ āϏāĻŽāϝāĻŧ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻĒā§āϝāĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāύ⧠āĻāĻŦāĻ āĻā§āĻĄ āĻā§āϰāĻšāĻŖ
# Time difference between 1970 and 1900, seconds
FORMAT_DIFF = (datetime.date(1970, 1, 1) - datetime.date(1900, 1, 1)).days * 24 * 3600
# Waiting time for recv (seconds)
WAITING_TIME = 5
server = "pool.ntp.org"
port = 123
packet = NTPPacket(version_number=2, mode=3, transmit=time.time() + FORMAT_DIFF)
answer = NTPPacket()
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.settimeout(WAITING_TIME)
s.sendto(packet.pack(), (server, port))
data = s.recv(48)
arrive_time = time.time() + FORMAT_DIFF
answer.unpack(data)
āϏāĻžāϰā§āĻāĻžāϰ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āϰāϏā§āϏāĻŋāĻ
āϏāĻžāϰā§āĻāĻžāϰ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖāĻāĻŋ āϰā§āĻŽāύā§āĻĄ āĻāĻŽ. āϏā§āĻŽāϞāĻŋāϝāĻŧāĻžāύ (1978) āĻāϰ āĻĒā§āϰāĻžāύ⧠āϏāĻŽāϏā§āϝāĻž āĻĨā§āĻā§ āĻāĻāϰā§āĻ āĻāĻĻā§āϰāϞā§āĻā§āϰ āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒā§āϰ āĻ āύā§āϰā§āĻĒ: âāĻāĻ āĻŦā§āϝāĻā§āϤāĻŋāϰ āĻšāĻžāϤ⧠āĻāĻĄāĻŧāĻŋ āĻāĻŋāϞ āύāĻž, āϤāĻŦā§ āĻŦāĻžāĻĄāĻŧāĻŋāϤ⧠āĻāĻāĻāĻŋ āϏāĻ āĻŋāĻ āĻĒā§āϰāĻžāĻā§āϰ āĻāĻĄāĻŧāĻŋ āĻāĻŋāϞ, āϝāĻž āϤāĻŋāύāĻŋ āĻŽāĻžāĻā§ āĻŽāĻžāĻā§ āĻŦāĻžāϤāĻžāϏ āĻāϰāϤ⧠āĻā§āϞ⧠āϝāĻžāĻāĨ¤ āĻāĻāĻĻāĻŋāύ, āĻāĻŦāĻžāϰ āĻāĻĄāĻŧāĻŋ āĻāĻžāϞ⧠āĻāϰāϤ⧠āĻā§āϞ⧠āĻāĻŋāϝāĻŧā§, āϏ⧠āϤāĻžāϰ āĻŦāύā§āϧā§āϰ āϏāĻžāĻĨā§ āĻĻā§āĻāĻž āĻāϰāϤ⧠āĻāĻŋāϝāĻŧā§āĻāĻŋāϞ, āϤāĻžāϰ āϏāĻžāĻĨā§ āϏāύā§āϧā§āϝāĻž āĻāĻžāĻāĻŋāϝāĻŧā§āĻāĻŋāϞ, āĻāĻŦāĻ āϝāĻāύ āϏ⧠āĻŦāĻžāĻĄāĻŧāĻŋ āĻĢāĻŋāϰā§āĻāĻŋāϞ, āϏ⧠āĻāĻĄāĻŧāĻŋāĻāĻŋ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āϏā§āĻ āĻāϰāϤ⧠āĻĒā§āϰā§āĻāĻŋāϞāĨ¤ āĻā§āϰāĻŽāĻŖā§āϰ āϏāĻŽāϝāĻŧ āĻāĻā§ āĻĨā§āĻā§ āĻāĻžāύāĻž āύāĻž āĻĨāĻžāĻāϞ⧠āϤāĻŋāύāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻŋ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āĻāĻŋāϞā§āύ? āĻāϤā§āϤāϰāĻāĻŋ āĻšāϞ: "āĻāϰ āĻā§āĻĄāĻŧā§, āĻāĻāĻāύ āĻŦā§āϝāĻā§āϤāĻŋ āĻāĻĄāĻŧāĻŋāϰ āĻāĻžāĻāĻāĻž āĻŦāύā§āϧ āĻāϰ⧠āĻāĻŦāĻ āĻšāĻžāϤā§āϰ āĻ āĻŦāϏā§āĻĨāĻžāύ āĻŽāύ⧠āϰāĻžāĻā§āĨ¤ āĻŦāύā§āϧā§āϰ āĻāĻžāĻā§ āĻāϏāĻž āĻāĻŦāĻ āĻ āϤāĻŋāĻĨāĻŋāĻĻā§āϰ āĻŦāĻŋāĻĻāĻžāϝāĻŧā§āϰ āϏāĻŽāϝāĻŧ āϤāĻŋāύāĻŋ āϤāĻžāϰ āĻāĻāĻŽāύ āĻāĻŦāĻ āĻĒā§āϰāϏā§āĻĨāĻžāύā§āϰ āϏāĻŽāϝāĻŧ āύā§āĻ āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āϤāĻžāĻā§ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ āϝ⧠āϏ⧠āĻāϤāĻā§āώāĻŖ āĻĻā§āϰ⧠āĻāĻŋāϞāĨ¤ āĻŦāĻžāĻĄāĻŧāĻŋāϤ⧠āĻĢāĻŋāϰ⧠āĻāĻŦāĻ āĻāĻĄāĻŧāĻŋāϰ āĻĻāĻŋāĻā§ āϤāĻžāĻāĻŋāϝāĻŧā§ āĻāĻāĻāύ āĻŦā§āϝāĻā§āϤāĻŋ āϤāĻžāϰ āĻ āύā§āĻĒāϏā§āĻĨāĻŋāϤāĻŋāϰ āϏāĻŽāϝāĻŧāĻāĻžāϞ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰā§āĨ¤ āĻāĻ āϏāĻŽāϝāĻŧ āĻĨā§āĻā§ āĻŦāĻŋāϝāĻŧā§āĻ āĻāϰ⧠āϤāĻŋāύāĻŋ āϝ⧠āϏāĻŽāϝāĻŧāĻāĻž āĻĻā§āĻāϤ⧠āĻāĻŋāϝāĻŧā§āĻāĻŋāϞā§āύ, āϏā§āĻ āĻŦā§āϝāĻā§āϤāĻŋ āϏā§āĻāĻžāύ⧠āĻāĻŦāĻ āĻĒāĻŋāĻāύā§āϰ āϰāĻžāϏā§āϤāĻžāϝāĻŧ āĻāĻžāĻāĻžāύ⧠āϏāĻŽāϝāĻŧ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰā§āĨ¤ āĻ āϤāĻŋāĻĨāĻŋāĻĻā§āϰ āĻŦāĻŋāĻĻāĻžāϝāĻŧā§āϰ āϏāĻŽāϝāĻŧā§āϰ āϏāĻžāĻĨā§ āϰāĻžāϏā§āϤāĻžāϝāĻŧ āĻŦā§āϝāϝāĻŧ āĻāϰāĻž āĻ āϰā§āϧā§āĻ āϏāĻŽāϝāĻŧ āϝā§āĻ āĻāϰ⧠āϤāĻŋāύāĻŋ āĻŦāĻžāĻĄāĻŧāĻŋāϤ⧠āĻāϏāĻžāϰ āϏāĻŽāϝāĻŧ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻžāϰ āĻāĻŦāĻ āϏā§āĻ āĻ āύā§āϝāĻžāϝāĻŧā§ āϤāĻžāϰ āĻāĻĄāĻŧāĻŋāϰ āĻšāĻžāϤ āϏāĻžāĻŽāĻā§āĻāϏā§āϝ āĻāϰāĻžāϰ āϏā§āϝā§āĻ āĻĒāĻžāύāĨ¤
āϏāĻžāϰā§āĻāĻžāϰ āĻ āύā§āϰā§āϧ⧠āĻāĻžāĻ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻā§āĻāĻā§āύ:
- āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻĨā§āĻā§ āϏāĻžāϰā§āĻāĻžāϰ⧠āĻĒā§āϝāĻžāĻā§āĻ āĻā§āϰāĻŽāĻŖā§āϰ āϏāĻŽāϝāĻŧ āĻā§āĻāĻāĻž: ((āĻāĻāĻŽāύ - āĻā§āĻĒāϤā§āϤāĻŋ) - (āĻā§āϰāĻžāύā§āϏāĻŽāĻŋāĻ - āϰāĻŋāϏāĻŋāĻ)) / 2
- āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻāĻŦāĻ āϏāĻžāϰā§āĻāĻžāϰ āϏāĻŽāϝāĻŧā§āϰ āĻŽāϧā§āϝ⧠āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻā§āĻāĻā§āύ:
āĻĒā§āϰāĻžāĻĒā§āϤāĻŋ - āĻā§āĻĒāϤā§āϤāĻŋ - ((āĻāĻāĻŽāύ - āĻā§āĻĒāϤā§āϤāĻŋ) - (āĻĒāϰāĻŋāĻŦāĻšāύ - āĻā§āϰāĻšāĻŖ)) / 2 =
2 * āĻĒā§āϰāĻžāĻĒā§āϤāĻŋ - 2 * āĻā§āĻĒāϤā§āϤāĻŋ - āĻāĻāĻŽāύ + āĻā§āĻĒāϤā§āϤāĻŋ + āĻĒā§āϰā§āϰāĻŖ - āĻā§āϰāĻšāĻŖ =
āĻā§āϰāĻšāĻŖ - āĻā§āĻĒāϤā§āϤāĻŋ - āĻāĻāĻŽāύ + āĻĒā§āϰā§āϰāĻŖ
āĻāĻŽāϰāĻž āϏā§āĻĨāĻžāύā§āϝāĻŧ āϏāĻŽāϝāĻŧā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻžāĻĒā§āϤ āĻŽāĻžāύ āϝā§āĻ āĻāϰāĻŋ āĻāĻŦāĻ āĻā§āĻŦāύ āĻāĻĒāĻā§āĻ āĻāϰāĻŋāĨ¤
āĻĢāϞāĻžāĻĢāϞ āĻāĻāĻāĻĒā§āĻ
time_different = answer.get_time_different(arrive_time)
result = "Time difference: {}nServer time: {}n{}".format(
time_different,
datetime.datetime.fromtimestamp(time.time() + time_different).strftime("%c"),
answer.to_display())
print(result)
āĻĻāϰāĻāĻžāϰ⧠.
āĻāϤā§āϏ: www.habr.com
