เชเช• เชธเชฐเชณ NTP เช•เซเชฒเชพเชฏเช‚เชŸ เชฒเช–เชตเซเช‚

เชนเซ‡เชฒเซ‹ เชนเซ‡เชฌเซเชฐเชพเช‰เชเชฐเซเชธ. เช†เชœเซ‡ เชนเซเช‚ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชธเชฐเชณ NTP เช•เซเชฒเชพเชฏเช‚เชŸเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซเช‚ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚. เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เชตเชพเชคเชšเซ€เชค เชชเซ‡เช•เซ‡เชŸเชจเซ€ เชฐเชšเชจเชพ เช…เชจเซ‡ NTP เชธเชฐเซเชตเชฐ เชคเชฐเชซเชฅเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชคเซ‡ เชคเชฐเชซ เชตเชณเชถเซ‡. เช•เซ‹เชก python เชฎเชพเช‚ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เช•เชพเชฐเชฃ เช•เซ‡, เชฎเชพเชฐเชพ เชฎเชคเซ‡, เช†เชตเซ€ เชตเชธเซเชคเซเช“ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆ เชตเชงเซ เชธเชพเชฐเซ€ เชญเชพเชทเชพ เชจเชฅเซ€. เชœเชพเชฃเช•เชพเชฐเซ‹ ntplib เช•เซ‹เชก เชธเชพเชฅเซ‡ เช•เซ‹เชกเชจเซ€ เชธเชฎเชพเชจเชคเชพ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเชถเซ‡ - เชนเซเช‚ เชคเซ‡เชจเชพเชฅเซ€ "เชชเซเชฐเซ‡เชฐเชฟเชค" เชนเชคเซ‹.

เชคเซ‹ เช•เซ‹เชˆเชชเชฃ เชฐเซ€เชคเซ‡ NTP เชถเซเช‚ เช›เซ‡? NTP เช เชธเชฎเชฏ เชธเชฐเซเชตเชฐ เชธเชพเชฅเซ‡ เชตเชพเชคเชšเซ€เชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เช›เซ‡. เช† เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช˜เชฃเชพ เช†เชงเซเชจเชฟเช• เชฎเชถเซ€เชจเซ‹เชฎเชพเช‚ เชฅเชพเชฏ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชตเชฟเชจเซเชกเซ‹เช เชชเชฐ w32tm เชธเซ‡เชตเชพ.

NTP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เช•เซเชฒ 5 เชตเชฐเซเชเชจ เช›เซ‡. เชชเซเชฐเชฅเชฎ, เชธเช‚เชธเซเช•เชฐเชฃ 0 (1985, RFC958) เชนเชพเชฒเชฎเชพเช‚ เช…เชชเซเชฐเชšเชฒเชฟเชค เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชจเชตเชพเชจเซ‹ เชนเชพเชฒเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡, 1 เชฒเซ€ (1988, RFC1059), 2เชœเซ€ (1989, RFC1119), เชคเซเชฐเซ€เชœเซ€ (3, RFC1992) เช…เชจเซ‡ เชšเซ‹เชฅเซ€ (1305, RFC4). เช†เชตเซƒเชคเซเชคเชฟเช“ 1996-2030 เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชธเซเชธเช‚เช—เชค เช›เซ‡, เชคเซ‡เช“ เชซเช•เซเชค เชธเชฐเซเชตเชฐเชจเชพ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธเชฎเชพเช‚ เช…เชฒเช— เชชเชกเซ‡ เช›เซ‡.

เชชเซ‡เช•เซ‡เชŸ เชซเซ‹เชฐเซเชฎเซ‡เชŸ

เชเช• เชธเชฐเชณ NTP เช•เซเชฒเชพเชฏเช‚เชŸ เชฒเช–เชตเซเช‚

เชฒเซ€เชช เชธเซ‚เชšเช• (เชธเซเชงเชพเชฐเชฃเชพ เชธเซ‚เชšเช•) เช เชเช• เชธเช‚เช–เซเชฏเชพ เช›เซ‡ เชœเซ‡ เชฒเซ€เชช เชธเซ‡เช•เชจเซเชกเชจเซ€ เชšเซ‡เชคเชตเชฃเซ€ เชธเซ‚เชšเชตเซ‡ เช›เซ‡. เช…เชฐเซเชฅ:

  • 0 - เช•เซ‹เชˆ เชธเซเชงเชพเชฐเซ‹ เชจเชฅเซ€
  • 1 - เชฆเชฟเชตเชธเชจเซ€ เช›เซ‡เชฒเซเชฒเซ€ เชฎเชฟเชจเชฟเชŸเชฎเชพเช‚ 61 เชธเซ‡เช•เชจเซเชกเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡
  • 2 - เชฆเชฟเชตเชธเชจเซ€ เช›เซ‡เชฒเซเชฒเซ€ เชฎเชฟเชจเชฟเชŸเชฎเชพเช‚ 59 เชธเซ‡เช•เชจเซเชก เชนเซ‹เชฏ เช›เซ‡
  • 3 - เชธเชฐเซเชตเชฐ เชจเชฟเชทเซเชซเชณเชคเชพ (เชธเชฎเชจเซเชตเชฏเชจเชจเซ‹ เชธเชฎเชฏ เชธเชฎเชพเชชเซเชค)

เชธเช‚เชธเซเช•เชฐเชฃ เชจเช‚เชฌเชฐ (เชธเช‚เชธเซเช•เชฐเชฃ เชจเช‚เชฌเชฐ) โ€“ NTP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชธเช‚เชธเซเช•เชฐเชฃ เชจเช‚เชฌเชฐ (1-4).

เชธเซเชฅเชฟเชคเชฟ (เชฎเซ‹เชก) - เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเชจเชพเชฐเชจเซเช‚ เช“เชชเชฐเซ‡เชถเชจ เชฎเซ‹เชก. 0 เชฅเซ€ 7 เชฎเซ‚เชฒเซเชฏ, เชธเซŒเชฅเซ€ เชธเชพเชฎเชพเชจเซเชฏ:

  • 3 - เช—เซเชฐเชพเชนเช•
  • 4 - เชธเชฐเซเชตเชฐ
  • 5 - เชฌเซเชฐเซ‹เชกเช•เชพเชธเซเชŸ เชฎเซ‹เชก

เชธเซเชŸเซเชฐเซ‡เชŸเชฎ (เชฒเซ‡เชฏเชฐเชฟเช‚เช— เชฒเซ‡เชตเชฒ) - เชธเชฐเซเชตเชฐ เช…เชจเซ‡ เชธเช‚เชฆเชฐเซเชญ เช˜เชกเชฟเชฏเชพเชณ เชตเชšเซเชšเซ‡เชจเชพ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชธเซเชคเชฐเซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ (1 - เชธเชฐเซเชตเชฐ เชธเซ€เชงเชพ เชธเช‚เชฆเชฐเซเชญ เช˜เชกเชฟเชฏเชพเชณเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชฒเซ‡ เช›เซ‡, 2 - เชธเชฐเซเชตเชฐ เชธเซเชคเชฐ 1 เชธเชพเชฅเซ‡ เชธเชฐเซเชตเชฐเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชฒเซ‡ เช›เซ‡, เชตเช—เซ‡เชฐเซ‡).
เชธเชฎเซเชšเซเชšเชฏ เชธเชณเช‚เช— เชธเช‚เชฆเซ‡เชถเชพเช“ เชตเชšเซเชšเซ‡เชจเชพ เชฎเชนเชคเซเชคเชฎ เช…เช‚เชคเชฐเชพเชฒเชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเชคเซเช‚ เชธเชพเช‡เชจ เช•เชฐเซ‡เชฒ เชชเซ‚เชฐเซเชฃเชพเช‚เช• เช›เซ‡. NTP เช•เซเชฒเชพเชฏเช‚เชŸ เช…เชนเซ€เช‚ เชคเซ‡ เช…เช‚เชคเชฐเชพเชฒเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชคเซ‡ เชธเชฐเซเชตเชฐเชจเซ‡ เชฎเชคเชฆเชพเชจ เช•เชฐเชตเชพเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เซ‡ เช›เซ‡, เช…เชจเซ‡ NTP เชธเชฐเซเชตเชฐ เชคเซ‡ เช…เช‚เชคเชฐเชพเชฒเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชคเซ‡ เชฎเชคเชฆเชพเชจ เชฅเชตเชพเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เซ‡ เช›เซ‡. เชฎเซ‚เชฒเซเชฏ เชธเซ‡เช•เชจเซเชกเชจเชพ เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชฒเช˜เซเช—เชฃเช• เชœเซ‡เชŸเชฒเซเช‚ เช›เซ‡.
เชถเซเชฆเซเชงเชคเชพ (เชšเซ‹เช•เชธเชพเช‡) เช เชธเชฟเชธเซเชŸเชฎ เช˜เชกเชฟเชฏเชพเชณเชจเซ€ เชšเซ‹เช•เชธเชพเชˆเชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเชคเซ€ เชธเชพเช‡เชจ เช•เชฐเซ‡เชฒ เชชเซ‚เชฐเซเชฃเชพเช‚เช• เช›เซ‡. เชฎเซ‚เชฒเซเชฏ เชธเซ‡เช•เชจเซเชกเชจเชพ เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชฒเช˜เซเช—เชฃเช• เชœเซ‡เชŸเชฒเซเช‚ เช›เซ‡.
เชฎเซ‚เชณ เชตเชฟเชฒเช‚เชฌ (เชธเชฐเซเชตเชฐ เชฒเซ‡เชŸเชจเซเชธเซ€) เช เช˜เชกเชฟเชฏเชพเชณเชจเซ‡ NTP เชธเชฐเซเชตเชฐ เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเชตเชพเชฎเชพเช‚ เชœเซ‡ เชธเชฎเชฏ เชฒเชพเช—เซ‡ เช›เซ‡ เชคเซ‡ เชธเซ‡เช•เชจเซเชกเซ‹เชจเซ€ เชจเชฟเชถเซเชšเชฟเชค-เชฌเชฟเช‚เชฆเซ เชธเช‚เช–เซเชฏเชพ เชคเชฐเซ€เช•เซ‡ เช›เซ‡.
เชฐเซเชŸ เชตเชฟเช•เซเชทเซ‡เชช (เชธเชฐเซเชตเชฐ เชธเซเช•เซ‡เชŸเชฐ) - เชธเซ‡เช•เชจเซเชกเชจเซ€ เชจเชฟเชถเซเชšเชฟเชค-เชฌเชฟเช‚เชฆเซ เชธเช‚เช–เซเชฏเชพ เชคเชฐเซ€เช•เซ‡ NTP เชธเชฐเซเชตเชฐ เช˜เชกเชฟเชฏเชพเชณเชจเซเช‚ เชธเซเช•เซ‡เชŸเชฐ.
เชธเช‚เชฆเชฐเซเชญ เช†เชˆเชกเซ€ (เชธเซเชคเซเชฐเซ‹เชค เช†เชˆเชกเซ€) โ€“ เช˜เชกเชฟเชฏเชพเชณ เช†เชˆเชกเซ€. เชœเซ‹ เชธเชฐเซเชตเชฐเชฎเชพเช‚ เชธเซเชŸเซเชฐเซ‡เชŸเชฎ 1 เชนเซ‹เชฏ, เชคเซ‹ เชฐเซ‡เชซ id เช เช…เชฃเซ เช˜เชกเชฟเชฏเชพเชณเชจเซเช‚ เชจเชพเชฎ เช›เซ‡ (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) เชจเซ€ เชœเซ‚เชจเซ€ เชธเชฎเชธเซเชฏเชพเชฎเชพเช‚เชฅเซ€ เช…เช‚เช—เซเชฐเซ‡เชœ เชธเชœเซเชœเชจเชจเซ€ เช•เซเชฐเชฟเชฏเชพเช“ เชœเซ‡เชตเซ€ เชœ เช›เซ‡: โ€œเชเช• เชตเซเชฏเช•เซเชคเชฟ เชชเชพเชธเซ‡ เช•เชพเช‚เชกเชพ เช˜เชกเชฟเชฏเชพเชณ เชจ เชนเชคเซ€, เชชเชฐเช‚เชคเซ เช˜เชฐเชฎเชพเช‚ เชเช• เชธเชšเซ‹เชŸ เชฆเชฟเชตเชพเชฒ เช˜เชกเชฟเชฏเชพเชณ เชนเชคเซ€, เชœเซ‡ เชคเซ‡เชฃเซ‡ เช•เซเชฏเชพเชฐเซ‡เช• เชชเชตเชจ เช•เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเซ€ เช—เชฏเชพ. เชเช• เชฆเชฟเชตเชธ, เชซเชฐเซ€เชฅเซ€ เช˜เชกเชฟเชฏเชพเชณ เชšเชพเชฒเซ เช•เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเซ€ เช—เชฏเซ‹, เชคเซ‡ เชคเซ‡เชจเชพ เชฎเชฟเชคเซเชฐเชจเซ‡ เชฎเชณเชตเชพ เช—เชฏเซ‹, เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชธเชพเช‚เชœ เชตเชฟเชคเชพเชตเซ€, เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เช˜เชฐเซ‡ เชชเชพเช›เซ‹ เช†เชตเซเชฏเซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เชฃเซ‡ เช˜เชกเชฟเชฏเชพเชณเชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเซ€. เชœเซ‹ เชฎเซเชธเชพเชซเชฐเซ€เชจเซ‹ เชธเชฎเชฏ เช…เช—เชพเช‰เชฅเซ€ เชœเชพเชฃเชคเซ‹ เชจ เชนเชคเซ‹ เชคเซ‹ เชคเซ‡เชฃเซ‡ เช† เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซเชฏเซเช‚? เชœเชตเชพเชฌ เช›เซ‡: โ€œเช˜เชฐ เช›เซ‹เชกเซ€เชจเซ‡, เชตเซเชฏเช•เซเชคเชฟ เช˜เชกเชฟเชฏเชพเชณ เชฌเช‚เชง เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชนเชพเชฅเชจเซ€ เชธเซเชฅเชฟเชคเชฟ เชฏเชพเชฆ เชฐเชพเช–เซ‡ เช›เซ‡. เชฎเชฟเชคเซเชฐ เชชเชพเชธเซ‡ เช†เชตเชตเซเช‚ เช…เชจเซ‡ เชฎเชนเซ‡เชฎเชพเชจเซ‹เชจเซ‡ เชตเชฟเชฆเชพเชฏ เช†เชชเชตเซ€, เชคเซ‡ เชคเซ‡เชจเชพ เช†เช—เชฎเชจ เช…เชจเซ‡ เชชเซเชฐเชธเซเชฅเชพเชจเชจเซ‹ เชธเชฎเชฏ เชจเซ‹เช‚เชงเซ‡ เช›เซ‡. เช† เชคเซ‡เชจเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เช•เซ‡เชŸเชฒเซ‹ เชธเชฎเชฏ เชฆเซ‚เชฐ เชนเชคเซ‹. เช˜เชฐเซ‡ เชชเชพเช›เชพ เชซเชฐเซเชฏเชพ เช…เชจเซ‡ เช˜เชกเชฟเชฏเชพเชณ เชœเซ‹เชคเชพ, เชตเซเชฏเช•เซเชคเชฟ เชคเซ‡เชจเซ€ เช—เซ‡เชฐเชนเชพเชœเชฐเซ€เชจเซ€ เช…เชตเชงเชฟ เชจเช•เซเช•เซ€ เช•เชฐเซ‡ เช›เซ‡. เช† เชธเชฎเชฏเชฎเชพเช‚เชฅเซ€ เชคเซ‡เชฃเซ‡ เชฎเซเชฒเชพเช•เชพเชค เชฒเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเชคเชพเชตเซ‡เชฒเซ‹ เชธเชฎเชฏ เชฌเชพเชฆ เช•เชฐเซ€เชจเซ‡, เชตเซเชฏเช•เซเชคเชฟ เชคเซเชฏเชพเช‚ เช…เชจเซ‡ เชชเชพเช›เชณเชจเชพ เชฐเชธเซเชคเชพ เชชเชฐ เชตเชฟเชคเชพเชตเซ‡เชฒเซ‹ เชธเชฎเชฏ เชถเซ‹เชงเซ€ เช•เชพเชขเซ‡ เช›เซ‡. เชฐเชธเซเชคเชพ เชชเชฐ เชตเชฟเชคเชพเชตเซ‡เชฒเชพ เชธเชฎเชฏเชจเซ‹ เช…เชกเชงเซ‹ เชธเชฎเชฏ เชฎเชนเซ‡เชฎเชพเชจเซ‹เชจเซ‡ เช›เซ‹เชกเชตเชพเชจเชพ เชธเชฎเชฏ เชธเชพเชฅเซ‡ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡, เชคเซ‡เชจเซ‡ เช˜เชฐเซ‡ เชชเชนเซ‹เช‚เชšเชตเชพเชจเซ‹ เชธเชฎเชฏ เชถเซ‹เชงเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡ เชฎเซเชœเชฌ เชคเซ‡เชจเซ€ เช˜เชกเชฟเชฏเชพเชณเชจเชพ เชนเชพเชฅ เช—เซ‹เช เชตเชตเชพเชจเซ€ เชคเช• เชฎเชณเซ‡ เช›เซ‡.

เชตเชฟเชจเช‚เชคเซ€ เชชเชฐ เชธเชฐเซเชตเชฐ เช•เชพเชฎ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เชนเชคเซเช‚ เชคเซ‡ เชธเชฎเชฏ เชถเซ‹เชงเซ‹:

  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)

เช‰เชชเชฏเซ‹เช—เซ€ ััั‹ะปะบะฐ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹