เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ NTP เด•เตเดฒเดฏเดจเตเดฑเต เดŽเดดเตเดคเตเดจเตเดจเต

เดนเดฒเต‹, เดนเดฌเตเดฐเตŒเดธเต‡เดดเตเดธเต. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ NTP เด•เตเดฒเดฏเดจเตเดฑเต เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด‡เดจเตเดจเต เดžเดพเตป เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดŸเดฟเดธเตเดฅเดพเดจเดชเดฐเดฎเดพเดฏเดฟ, เดธเด‚เดญเดพเดทเดฃเด‚ เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เด˜เดŸเดจเดฏเดฟเดฒเต‡เด•เตเด•เตเด‚ NTP เดธเต†เตผเดตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเดฏเดฟเดฒเต‡เด•เตเด•เตเด‚ เดคเดฟเดฐเดฟเดฏเตเด‚. เด•เต‹เดกเต เดชเตˆเดคเตเดคเดฃเดฟเตฝ เดŽเดดเตเดคเดชเตเดชเต†เดŸเตเด‚, เด•เดพเดฐเดฃเด‚ เด…เดคเตเดคเดฐเด‚ เด•เดพเดฐเตเดฏเด™เตเด™เตพเด•เตเด•เต เดฎเดฟเด•เดšเตเดš เดญเดพเดทเดฏเดฟเดฒเตเดฒเต†เดจเตเดจเต เดŽเดจเดฟเด•เตเด•เต เดคเต‹เดจเตเดจเตเดจเตเดจเต. ntplib เด•เต‹เดกเตเดฎเดพเดฏเตเดณเตเดณ เด•เต‹เดกเดฟเดจเตเดฑเต† เดธเดพเดฎเตเดฏเด‚ เด†เดธเตเดตเดพเดฆเด•เตผ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด‚ - เดžเดพเตป เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต โ€œเดชเตเดฐเดšเต‹เดฆเดฟเดคเดจเดพเดฏเดฟโ€.

เด…เดชเตเดชเต‹เตพ เดŽเดจเตเดคเดพเดฃเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ NTP? เด•เตƒเดคเตเดฏเดฎเดพเดฏ เดธเดฎเดฏ เดธเต†เตผเดตเดฑเตเด•เดณเตเดฎเดพเดฏเตเดณเตเดณ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด†เดฃเต NTP. เดˆ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดชเดฒ เด†เดงเตเดจเดฟเด• เดฎเต†เดทเต€เดจเตเด•เดณเดฟเดฒเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดตเดฟเตปเดกเต‹เดธเดฟเดฒเต† w32tm เดธเต‡เดตเดจเด‚.

NTP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เด†เด•เต† 5 เดชเดคเดฟเดชเตเดชเตเด•เดณเตเดฃเตเดŸเต. เด†เดฆเตเดฏ เดชเดคเดฟเดชเตเดชเต 0 (1985, RFC958)), เดจเดฟเดฒเดตเดฟเตฝ เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดŸเดคเดพเดฏเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต. เด‡เดชเตเดชเต‹เตพ เดชเตเดคเดฟเดฏเดต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, 1st (1988, RFC1059), 2nd (1989, RFC1119), 3rd (1992, RFC1305), 4th (1996, RFC2030). 1-4 เดชเดคเดฟเดชเตเดชเตเด•เตพ เดชเดฐเดธเตเดชเดฐเด‚ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต; เด…เดต เดธเต†เตผเดตเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจ เด…เตฝเด—เต‹เดฐเดฟเดคเด™เตเด™เดณเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เดตเตเดฏเดคเตเดฏเดพเดธเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดชเดพเด•เตเด•เต‡เดœเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเต

เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ NTP เด•เตเดฒเดฏเดจเตเดฑเต เดŽเดดเตเดคเตเดจเตเดจเต

เด•เตเดคเดฟเดชเตเดชเต เดธเต‚เดšเด•เด‚ (เดคเดฟเดฐเตเดคเตเดคเตฝ เดธเต‚เดšเด•เด‚) - เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดเด•เต‹เดชเดจเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดจเดฎเตเดชเตผ. เด…เตผเดคเตเดฅเด‚:

  • 0 - เดคเดฟเดฐเตเดคเตเดคเดฒเตเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ
  • 1 - เดฆเดฟเดตเดธเดคเตเดคเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจ เดฎเดฟเดจเดฟเดฑเตเดฑเดฟเตฝ 61 เดธเต†เด•เตเด•เตปเดกเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต
  • 2 - เดฆเดฟเดตเดธเดคเตเดคเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจ เดฎเดฟเดจเดฟเดฑเตเดฑเดฟเตฝ 59 เดธเต†เด•เตเด•เตปเดกเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต
  • 3 - เดธเต†เตผเดตเตผ เดคเด•เดฐเดพเตผ (เดธเดฎเดฏเด‚ เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ)

เดชเดคเดฟเดชเตเดชเต เดจเดฎเตเดชเตผ (เดชเดคเดฟเดชเตเดชเต เดจเดฎเตเดชเตผ) - NTP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดชเดคเดฟเดชเตเดชเต เดจเดฎเตเดชเตผ (1-4).

เดซเดพเดทเตป (เดฎเต‹เดกเต) - เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดšเตเดšเดฏเดพเดณเตเดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดจ เดฐเต€เดคเดฟ. 0 เดฎเตเดคเตฝ 7 เดตเดฐเต†เดฏเตเดณเตเดณ เดฎเต‚เดฒเตเดฏเด‚, เดเดฑเตเดฑเดตเตเด‚ เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฏเดคเต:

  • 3 - เด•เตเดฒเดฏเดจเตเดฑเต
  • 4 - เดธเต†เตผเดตเตผ
  • 5 - เดชเตเดฐเด•เตเดทเต‡เดชเดฃ เดฎเต‹เดกเต

เดธเตเดŸเตเดฐเดพเดฑเตเดฑเด‚ (เดฒเต‡เดฏเดฑเดฟเด‚เด—เต เดฒเต†เดตเตฝ) - เดธเต†เตผเดตเดฑเดฟเดจเตเด‚ เดฑเดซเดฑเตปเดธเต เด•เตเดฒเต‹เด•เตเด•เตเด‚ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เด‡เดจเตเดฑเตผเดฎเต€เดกเดฟเดฏเดฑเตเดฑเต เดฒเต†เดฏเดฑเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ (1 - เดธเต†เตผเดตเตผ เดฑเดซเดฑเตปเดธเต เด•เตเดฒเต‹เด•เตเด•เดฟเตฝ เดจเดฟเดจเตเดจเต เดจเต‡เดฐเดฟเดŸเตเดŸเต เดกเดพเดฑเตเดฑ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต, 2 - เดฒเต†เดฏเตผ 1 เด‰เดณเตเดณ เดธเต†เตผเดตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดธเต†เตผเดตเตผ เดกเดพเดฑเตเดฑ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต, เดฎเตเดคเดฒเดพเดฏเดต).
เดชเต‚เตพ เดคเตเดŸเตผเดšเตเดšเดฏเดพเดฏ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพเด•เตเด•เดฟเดŸเดฏเดฟเดฒเตเดณเตเดณ เดชเดฐเดฎเดพเดตเดงเดฟ เด‡เดŸเดตเต‡เดณเดฏเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด’เดชเตเดชเดฟเดŸเตเดŸ เดชเต‚เตผเดฃเตเดฃเดธเด‚เด–เตเดฏเดฏเดพเดฃเต. เดŽเตปโ€ŒเดŸเดฟโ€Œเดชเดฟ เด•เตเดฒเดฏเดจเตเดฑเต เดธเต†เตผโ€Œเดตเดฑเดฟเดจเต† เดชเต‹เตพ เดšเต†เดฏเตเดฏเดพเตป เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจ เด‡เดŸเดตเต‡เดณ เด‡เดตเดฟเดŸเต† เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดŽเตปโ€ŒเดŸเดฟโ€Œเดชเดฟ เดธเต†เตผโ€Œเดตเตผ เดชเต‹เตพ เดšเต†เดฏเตเดฏเตเดฎเต†เดจเตเดจเต เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจ เด‡เดŸเดตเต‡เดณ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดฎเต‚เดฒเตเดฏเด‚ เดธเต†เด•เตเด•เตปเดกเตเด•เดณเตเดŸเต† เดฌเตˆเดจเดฑเดฟ เดฒเต‹เด—เดฐเดฟเดคเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฃเต.
เด•เตƒเดคเดค (เด•เตƒเดคเตเดฏเดค) เดŽเดจเตเดจเดคเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เตเดฒเต‹เด•เตเด•เดฟเดจเตเดฑเต† เด•เตƒเดคเตเดฏเดคเดฏเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏ เดชเต‚เตผเดฃเตเดฃเดธเด‚เด–เตเดฏเดฏเดพเดฃเต. เดฎเต‚เดฒเตเดฏเด‚ เดธเต†เด•เตเด•เตปเดกเตเด•เดณเตเดŸเต† เดฌเตˆเดจเดฑเดฟ เดฒเต‹เด—เดฐเดฟเดคเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฃเต.
เดฑเต‚เดŸเตเดŸเต เด•เดพเดฒเดคเดพเดฎเดธเด‚ (เดธเต†เตผเดตเตผ เด•เดพเดฒเดคเดพเดฎเดธเด‚) - เด•เตเดฒเต‹เด•เตเด•เต เดฑเต€เดกเดฟเด‚เด—เตเด•เตพ เดŽเตปโ€ŒเดŸเดฟโ€Œเดชเดฟ เดธเต†เตผโ€Œเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เดŽเดคเตเดคเดพเตป เดŽเดŸเตเด•เตเด•เตเดจเตเดจ เดธเดฎเดฏเด‚, เดธเต†เด•เตเด•เตปเดกเตเด•เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เดชเต‹เดฏเดฟเดจเตเดฑเต เดจเดฎเตเดชเดฑเดพเดฏเดฟ.
เดฑเต‚เดŸเตเดŸเต เดกเดฟเดธเตเดชเตผเดทเตป (เดธเต†เตผเดตเตผ เดธเตโ€Œเดชเตเดฐเต†เดกเต) - NTP เดธเต†เตผเดตเตผ เด•เตเดฒเต‹เด•เตเด•เต เดฑเต€เดกเดฟเด‚เด—เตเด•เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เดชเต‹เดฏเดฟเดจเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเต†เด•เตเด•เตปเดกเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚.
เดฑเต†เดซเต เดเดกเดฟ (เด‰เดฑเดตเดฟเดŸ เดเดกเดจเตเดฑเดฟเดซเดฏเตผ) - เด•เตเดฒเต‹เด•เตเด•เต เดเดกเดฟ. เดธเต†เตผเดตเดฑเดฟเดจเต เดธเตเดŸเตเดฐเดพเดฑเตเดฑเด‚ 1 เด†เดฃเต†เด™เตเด•เดฟเตฝ, ref 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

เดธเต†เตผเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดฏเตโ€Œเด•เตเด•เดพเดจเตเด‚ (เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚) เดžเด™เตเด™เตพเด•เตเด•เต เด…เดคเต เด’เดฐเต เดฌเตˆเดฑเตเดฑเต เด…เดฑเต‡ เด†เด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเดพเตป เด•เดดเดฟเดฏเดฃเด‚.
เดˆ (เด’เดชเตเดชเด‚ เดฑเดฟเดตเต‡เดดเตเดธเต) เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดžเด™เตเด™เตพ เดฐเดฃเตเดŸเต เดซเด‚เด—เตเดทเดจเตเด•เตพ เดŽเดดเตเดคเตเด‚ - เดชเดพเด•เตเด•เต () เด‰เด‚ เด…เตบเดชเดพเด•เตเด•เต ():

เดชเดพเด•เตเด•เต เดซเด‚เด—เตเดทเตป

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•