рдПрдХ рд╕рд╛рдзрд╛рд░рдг NTP рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрдирд╛

рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░рд╛рдпреБрдЬрд╝рд░реАред рдЖрдЬ рдореИрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдкрдиреЗ рд╕рд╛рдзрд╛рд░рдг рдПрдирдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПред рдореВрд▓ рд░реВрдк рд╕реЗ, рд╣рдо рдкреИрдХреЗрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ NTP рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдХреЛрдб рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рднрд╛рд╖рд╛ рдмрд╕ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ ntplib рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреА рд╕рдорд╛рдирддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ - рдореИрдВ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ "рдкреНрд░реЗрд░рд┐рдд" рдерд╛ред

рддреЛ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ NTP рд╣реИ? рдПрдирдЯреАрдкреА - рд╕рдЯреАрдХ рд╕рдордп рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ред рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЖрдзреБрдирд┐рдХ рдорд╢реАрдиреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ w32tm рд╕реЗрд╡рд╛ред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ NTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ 5 рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд╣рд▓рд╛, 0 рд╕рдВрд╕реНрдХрд░рдг (1985, RFC958) рдЕрдкреНрд░рдЪрд▓рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдирдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, 1 (1988, RFC1059), рджреВрд╕рд░рд╛ (1989, RFC1119), рддреАрд╕рд░рд╛ (1992, RFC1305) рдФрд░ 4th (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 = "!BB bb 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 


рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ (рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ) рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ (рдФрд░ рд░рд┐рд╡рд░реНрд╕) рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗрдВрдЧреЗ - рдкреИрдХ () рдФрд░ рдЕрдирдкреИрдХ ():

рдкреИрдХ рд╕рдорд╛рд░реЛрд╣
 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)) 


рдкреИрдХреЗрдЬ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ рдХреЗ рднрд┐рдиреНрдирд╛рддреНрдордХ рднрд╛рдЧ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ get_fraction () рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
get_fraction ()
 def get_fraction(number, precision): return int((number - int(number)) * 2 ** precision) 


рдЕрдирдкреИрдХ рдлрдВрдХреНрд╢рди
 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 (рдХреНрд▓рд╛рдЗрдВрдЯ рдореЛрдб)ред

рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд░реНрд╡рд░ рдПрдирдЯреАрдкреА рдкреИрдХреЗрдЯ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЕрдиреБрд░реЛрдз рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдорд╛рди рдХреЛ рдореВрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдХреЗ рднрд░рддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд░рд╣рд╕реНрдп рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдореВрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдкрдиреЗ рд╕рдордп рдХреЗ рдореВрд▓реНрдп рдХреЛ рддреБрд░рдВрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рднрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЬрдм рдкреИрдХреЗрдЯ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкрд╛рд╕ 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) рдХреЗ рдкреБрд░рд╛рдиреЗ рдХрд╛рд░реНрдп рд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдЬреНрдЬрди рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ: "рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкрд╛рд╕ рдШрдбрд╝реА рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл рдПрдХ рд╕рдЯреАрдХ рджреАрд╡рд╛рд░ рдШрдбрд╝реА рдереА рдЬрд┐рд╕реЗ рд╡рд╣ рдХрднреА-рдХрднреА рд╢реБрд░реВ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддрд╛ рдерд╛ред рдПрдХ рдмрд╛рд░, рдШрдбрд╝реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╣ рдЕрдкрдиреЗ рджреЛрд╕реНрдд рд╕реЗ рдорд┐рд▓рдиреЗ рдЧрдпрд╛, рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рд╢рд╛рдо рдмрд┐рддрд╛рдИ рдФрд░ рдЬрдм рд╡рд╣ рдШрд░ рд▓реМрдЯрд╛, рддреЛ рдЙрд╕рдиреЗ рдШрдбрд╝реА рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдмреА рд╣рд╛рд╕рд┐рд▓ рдХреАред рдЕрдЧрд░ рдпрд╛рддреНрд░рд╛ рд╕рдордп рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рдерд╛, рддреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛? " рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╣реИ: тАЬрдШрд░ рдЫреЛрдбрд╝рдХрд░, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдШрдбрд╝реА рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рде рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВред рдПрдХ рджреЛрд╕реНрдд рдХреЗ рдкрд╛рд╕ рдЖрдХрд░ рдФрд░ рдореЗрд╣рдорд╛рдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╡рд╣ рдЕрдкрдиреЗ рдЖрдиреЗ рдФрд░ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХрд┐рддрдирд╛ рджреМрд░рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдШрд░ рд▓реМрдЯрдиреЗ рдФрд░ рдШрдбрд╝реА рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЕрдкрдиреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЕрд╡рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдордп рд╕реЗ рдШрдЯрд╛рдХрд░, рдЬреЛ рдЙрд╕рдиреЗ рдпрд╛рддреНрд░рд╛ рдкрд░ рдмрд┐рддрд╛рдпрд╛ рдерд╛, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдХреА рдпрд╛рддреНрд░рд╛ рдореЗрдВ рдмрд┐рддрд╛рдП рд╕рдордп рдХреЛ рд╕реАрдЦрддрд╛ рд╣реИред рдореЗрд╣рдорд╛рдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд╕рдордп рдХреА рдпрд╛рддреНрд░рд╛ рдореЗрдВ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рдЖрдзреЗ рд╕рдордп рдХреЛ рдЬреЛрдбрд╝рдХрд░, рдЙрдиреНрд╣реЗрдВ рдШрд░ рдЖрдиреЗ рдХрд╛ рд╕рдордп рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдШрдбрд╝реА рдХреЗ рд╣рд╛рдереЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИред тАЭ

рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рдкрд░ рд╕рд░реНрд╡рд░ рдХрд╛ рдХрд╛рдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ:

  1. рд╣рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рд╕рд░реНрд╡рд░ рддрдХ рдкреИрдХреЗрдЯ рдкрд╛рде рдЯрд╛рдЗрдо рдорд┐рд▓рддрд╛ рд╣реИ: ((рдЖрдЧрдорди - рдЙрддреНрдкрддреНрддрд┐) - (рд╕рдВрдЪрд╛рд░ - рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ) - 2
  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) 


рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ ред

Source: https://habr.com/ru/post/hi448060/


All Articles