แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ NTP แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ

แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ, แƒฐแƒแƒ‘แƒ แƒแƒฃแƒ–แƒ”แƒ แƒ”แƒ‘แƒ˜. แƒ“แƒฆแƒ”แƒก แƒ›แƒ˜แƒœแƒ“แƒ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ แƒ˜แƒ›แƒแƒ–แƒ”, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ NTP แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜. แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“, แƒกแƒแƒฃแƒ‘แƒแƒ แƒ˜ แƒ”แƒฎแƒ”แƒ‘แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒก แƒ“แƒ NTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒก. แƒ™แƒแƒ“แƒ˜ แƒ“แƒแƒ˜แƒฌแƒ”แƒ แƒ”แƒ‘แƒ แƒžแƒ˜แƒ—แƒแƒœแƒจแƒ˜, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ›แƒ”แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ› แƒแƒกแƒ”แƒ—แƒ˜ แƒ แƒแƒ›แƒ”แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜ แƒ”แƒœแƒ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก. แƒ›แƒชแƒแƒ“แƒœแƒ”แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒœแƒ˜แƒจแƒœแƒแƒ•แƒ”แƒœ แƒ™แƒแƒ“แƒ˜แƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ”แƒ‘แƒแƒก ntplib แƒ™แƒแƒ“แƒ—แƒแƒœ - แƒ›แƒ” "แƒจแƒ—แƒแƒ’แƒแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜" แƒ•แƒ˜แƒงแƒแƒ•แƒ˜ แƒแƒ›แƒ˜แƒ—.

แƒ แƒ แƒแƒ แƒ˜แƒก แƒ–แƒฃแƒกแƒขแƒแƒ“ NTP? NTP แƒแƒ แƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜ แƒ–แƒฃแƒกแƒขแƒ˜ แƒ“แƒ แƒแƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ—แƒแƒœ แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ”แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ‘แƒ”แƒ•แƒ  แƒ—แƒแƒœแƒแƒ›แƒ”แƒ“แƒ แƒแƒ•แƒ” แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒจแƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, w32tm แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜ Windows-แƒจแƒ˜.

แƒกแƒฃแƒš NTP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก 5 แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒ. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒ•แƒ”แƒ แƒกแƒ˜แƒ 0 (1985, RFC958)), แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒ›แƒแƒซแƒ•แƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒแƒ“ แƒ˜แƒ—แƒ•แƒšแƒ”แƒ‘แƒ. แƒแƒฎแƒšแƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒฃแƒคแƒ แƒ แƒแƒฎแƒแƒšแƒ˜, 1-แƒšแƒ˜ (1988, RFC1059), แƒ›แƒ”-2 (1989, RFC1119), แƒ›แƒ”-3 (1992, RFC1305) แƒ“แƒ แƒ›แƒ”-4 (1996, RFC2030). แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜ 1-4 แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜แƒ แƒ”แƒ แƒ—แƒ›แƒแƒœแƒ”แƒ—แƒ—แƒแƒœ, แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ“แƒ”แƒ‘แƒ˜แƒแƒœ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ”แƒ‘แƒจแƒ˜.

แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒ˜

แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ NTP แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ

แƒœแƒแƒฎแƒขแƒแƒ›แƒ˜แƒก แƒ›แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ”แƒšแƒ˜ (แƒ™แƒแƒ แƒ”แƒฅแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ”แƒšแƒ˜) - แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒก แƒ’แƒแƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒ”แƒ‘แƒแƒก แƒ™แƒแƒแƒ แƒ“แƒ˜แƒœแƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒฌแƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘. แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ:

  • 0 - แƒแƒ แƒแƒœแƒแƒ˜แƒ แƒ˜ แƒจแƒ”แƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ
  • 1 - แƒ“แƒฆแƒ˜แƒก แƒ‘แƒแƒšแƒ แƒฌแƒฃแƒ—แƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก 61 แƒฌแƒแƒ›แƒก
  • 2 - แƒ“แƒฆแƒ˜แƒก แƒ‘แƒแƒšแƒ แƒฌแƒฃแƒ—แƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก 59 แƒฌแƒแƒ›แƒก
  • 3 - แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒฃแƒ›แƒแƒ แƒ—แƒแƒแƒ‘แƒ (แƒ“แƒ แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜)

แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜ (แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜) โ€“ NTP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜ (1-4).

แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜ (แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜) - แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜. แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ 0-แƒ“แƒแƒœ 7-แƒ›แƒ“แƒ”, แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜:

  • 3 - แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜
  • 4 - แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜
  • 5 - แƒ›แƒแƒฃแƒฌแƒงแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜

แƒกแƒขแƒ แƒแƒขแƒฃแƒ›แƒ˜ (แƒคแƒ”แƒœแƒ˜แƒก แƒ“แƒแƒœแƒ”) โ€“ แƒจแƒฃแƒแƒšแƒ”แƒ“แƒฃแƒ แƒ˜ แƒคแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒกแƒ แƒ“แƒ แƒกแƒแƒชแƒœแƒแƒ‘แƒแƒ แƒ แƒกแƒแƒแƒ—แƒก แƒจแƒแƒ แƒ˜แƒก (1 โ€“ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ˜แƒฆแƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒฃแƒจแƒฃแƒแƒšแƒแƒ“ แƒกแƒแƒชแƒœแƒแƒ‘แƒแƒ แƒ แƒกแƒแƒแƒ—แƒ˜แƒกแƒ’แƒแƒœ, 2 โ€“ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ˜แƒฆแƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก 1-แƒšแƒ˜ แƒคแƒ”แƒœแƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ.แƒจ.).
Pool แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฌแƒแƒ แƒ›แƒแƒแƒ“แƒ’แƒ”แƒœแƒก แƒ›แƒแƒฅแƒกแƒ˜แƒ›แƒแƒšแƒฃแƒ  แƒ˜แƒœแƒขแƒ”แƒ แƒ•แƒแƒšแƒก แƒ–แƒ”แƒ“แƒ˜แƒ–แƒ”แƒ“ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก. NTP แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒแƒฅ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒ•แƒแƒšแƒก, แƒ แƒแƒ›แƒšแƒ˜แƒ—แƒแƒช แƒ˜แƒก แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒก, แƒฎแƒแƒšแƒ NTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒ•แƒแƒšแƒก, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ“แƒ แƒแƒกแƒแƒช แƒ˜แƒก แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒก. แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒฃแƒ“แƒ แƒ˜แƒก แƒฌแƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒ˜แƒœแƒแƒ แƒฃแƒš แƒšแƒแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒก.
แƒกแƒ˜แƒ–แƒฃแƒกแƒขแƒ” (แƒกแƒ˜แƒ–แƒฃแƒกแƒขแƒ”) แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฌแƒแƒ แƒ›แƒแƒแƒ“แƒ’แƒ”แƒœแƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒกแƒแƒแƒ—แƒ˜แƒก แƒกแƒ˜แƒ–แƒฃแƒกแƒขแƒ”แƒก. แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒฃแƒ“แƒ แƒ˜แƒก แƒฌแƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒ˜แƒœแƒแƒ แƒฃแƒš แƒšแƒแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒก.
แƒคแƒ”แƒกแƒ•แƒ˜แƒก แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ (แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ“แƒแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒ) โ€“ แƒ“แƒ แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒกแƒแƒแƒ—แƒ˜แƒก แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒก NTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒแƒ›แƒ“แƒ” แƒ›แƒ˜แƒกแƒแƒกแƒ•แƒšแƒ”แƒšแƒแƒ“, แƒฌแƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ—.
แƒคแƒ”แƒกแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ˜แƒกแƒžแƒ”แƒ แƒกแƒ˜แƒ (แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒ) - NTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒกแƒแƒแƒ—แƒ˜แƒก แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜แƒ—.
Ref id (แƒฌแƒงแƒแƒ แƒแƒก แƒ˜แƒ“แƒ”แƒœแƒขแƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜) โ€“ แƒกแƒแƒแƒ—แƒ˜แƒก id. แƒ—แƒฃ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก แƒแƒฅแƒ•แƒก แƒคแƒ”แƒœแƒ 1, แƒ›แƒแƒจแƒ˜แƒœ ref id แƒแƒ แƒ˜แƒก แƒแƒขแƒแƒ›แƒฃแƒ แƒ˜ แƒกแƒแƒแƒ—แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ (4 ASCII แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ). แƒ—แƒฃ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒกแƒฎแƒ•แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก, แƒ›แƒแƒจแƒ˜แƒœ ref id แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒแƒ› แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒก.
แƒ‘แƒแƒšแƒ 4 แƒ•แƒ”แƒšแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒแƒ“แƒ’แƒ”แƒœแƒก แƒ“แƒ แƒแƒก - 32 แƒ‘แƒ˜แƒขแƒ˜ - แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜, 32 แƒ‘แƒ˜แƒขแƒ˜ - แƒฌแƒ˜แƒšแƒแƒ“แƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜.
Reference โ€” แƒฃแƒแƒฎแƒšแƒ”แƒกแƒ˜ แƒกแƒแƒแƒ—แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”.
แƒฌแƒแƒ แƒ›แƒแƒจแƒแƒ‘แƒ โ€“ แƒ“แƒ แƒ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ’แƒแƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜ (แƒจแƒ”แƒ•แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  - แƒ›แƒ”แƒขแƒ˜ แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒฅแƒ•แƒ”แƒ›แƒแƒ—).
แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— โ€“ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ.
แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ โ€“ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒ“แƒแƒœ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ“แƒ แƒ (แƒจแƒ”แƒ•แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ , แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ•แƒ แƒชแƒšแƒแƒ“ แƒฅแƒ•แƒ”แƒ›แƒแƒ—).

แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ•แƒ— แƒ‘แƒแƒšแƒ แƒแƒ  แƒ•แƒ”แƒšแƒก.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜:

แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ™แƒแƒ“แƒ˜

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)

แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ

แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒแƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒจแƒ”แƒ•แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒ‘แƒ˜แƒšแƒฃแƒ แƒ˜, แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜ ะธ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ. In แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒแƒ— แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ“แƒ แƒ แƒšแƒแƒ™แƒแƒšแƒฃแƒ  แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ–แƒ” (แƒฌแƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ 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. แƒ˜แƒžแƒแƒ•แƒœแƒ”แƒ— แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒกแƒ แƒ“แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ“แƒ แƒแƒก แƒจแƒแƒ แƒ˜แƒก:
    Receive - Originate - ((Arrive - Originate) - (Transmit - Receive)) / 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

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ