Te tuhi i tetahi kaihoko NTP ngawari

Kia ora, Habrausers. I tenei ra e hiahia ana ahau ki te korero mo te tuhi i to ake kaihoko NTP ngawari. Ko te tikanga, ka huri te korerorero ki te hanganga o te paatete me te tikanga o te tukatuka i te whakautu mai i te tūmau NTP. Ka tuhia te waehere ki te Python, no te mea ki taku whakaaro kaore he reo pai ake mo enei mea. Ka kite nga Kaipupuri i te rite o te waehere me te waehere ntplib - I "whakaawe" ahau.

Na he aha te NTP? Ko te NTP he kawa mo te taunekeneke me nga kaitoro wa tika. Ka whakamahia tenei kawa i roto i te maha o nga miihini hou. Hei tauira, ko te ratonga w32tm i nga matapihi.

E 5 nga putanga o te kawa NTP katoa. Ko te tuatahi, ko te putanga 0 (1985, RFC958)), ka kiia he tawhito. Inaianei kei te whakamahia nga mea hou, 1st (1988, RFC1059), 2nd (1989, RFC1119), 3rd (1992, RFC1305) me te 4th (1996, RFC2030). Ko nga Putanga 1-4 he hototahi ki a raatau ano; he rereke noa iho i roto i nga mahi a te tūmau hātepe.

Hōputu Pākete

Te tuhi i tetahi kaihoko NTP ngawari

Tohu pekepeke (tohu whakatika) - he tau e tohu ana i te whakatupato mo te ruruku tuarua. Te tikanga:

  • 0 – karekau he whakatikatika
  • 1 – he 61 hēkona te meneti whakamutunga o te rā
  • 2 – he 59 hēkona te meneti whakamutunga o te rā
  • 3 - rahunga tūmau (kua mutu te tukutahi)

Tau tau (tau putanga) – NTP kawa putanga tau (1-4).

aratau (mode) — aratau whakahaere a te kaituku putea. Uara mai i te 0 ki te 7, te nuinga noa:

  • 3 – kiritaki
  • 4 – tūmau
  • 5 - aratau haapurororaa

Raupapa (taumata paparanga) - te maha o nga paparanga takawaenga i waenga i te tūmau me te karaka tohutoro (1 - ka tango tika te tūmau i nga raraunga mai i te karaka tohutoro, 2 - ka tangohia e te tūmau nga raraunga mai i te tūmau me te taumata 1, me etahi atu).
Pool he tauoti kua hainatia e tohu ana i te waahi morahi i waenga i nga karere karapīpiti. Ka tohua e te kiritaki NTP ki konei te waahi e tatari ana ia ki te pooti i te tūmau, ka tohua e te tūmau NTP te waahi e tumanakohia ana kia pootihia. He rite te uara ki te hauruarua o nga hēkona.
(te tika) he tauoti kua hainatia e tohu ana i te tika o te karaka punaha. He rite te uara ki te hauruarua o nga hēkona.
whakaroa pakiaka (te roa o te tūmau) – ko te wa e tika ana mo nga panui karaka kia tae atu ki te tūmau NTP, hei tau hekona ira-mau.
Te marara pakiaka (te horahanga o te tūmau) - te horahanga o nga panui karaka a te tūmau NTP hei maha hēkona me te tohu pūmau.
Ref id (id puna) – maataki id. Mena he stratum 1 te tūmau, ko te ref id te ingoa o te karaka ngota (4 nga tohu ASCII). Ki te whakamahi te tūmau i tētahi atu tūmau, kei roto i te ref id te wāhitau o tēnei tūmau.
Ko nga mara whakamutunga e 4 e tohu ana i te wa - 32 paraka - te wahanga tauoti, 32 paraka - te wahanga hautau.
tohutoro — nga panui karaka hou i runga i te tūmau.
Takenga – te wa i tukuna ai te kete (kua whakakiia e te kaimau - he korero kei raro iho nei).
riro – te wa i riro mai ai te kete i te tūmau.
tare – te wa o te tuku i te kete mai i te tūmau ki te kiritaki (kua whakakiia e te kiritaki, he korero kei raro nei).

E kore matou e whakaaro ki nga mara whakamutunga e rua.

Me tuhi to maatau kete:

Waehere kete

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

Ki te tuku (ka whiwhi) i tetahi kete ki te tūmau, me kaha ki te huri ki te raupapa paita.
Mo tenei mahi (me te whakamuri), ka tuhia e matou nga mahi e rua - pack() me te wetewete ():

mahi mōkihi

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))

wetewete mahi

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

Mo te hunga mangere, hei tono - waehere ka huri i te kete ki te aho ataahua

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)

Te tuku kete ki te tūmau

Me tuku he putea kua whakakiia nga mara ki te tūmau putanga, aratau и tare. Ko te tare me tohu e koe te wa o naianei i runga i te miihini rohe (te maha o nga hēkona mai i te Hanuere 1, 1900), putanga - tetahi o te 1-4, aratau - 3 (aratau kiritaki).

Ko te tūmau, i te whakaae ki te tono, ka whakakiia nga mara katoa o te paatete NTP, ka kape ki te mara Takenga uara mai tare, i tae mai i roto i te tono. He mea ngaro ki ahau he aha e kore e taea e te kiritaki te whakakii i te uara o tona wa i roto i te mara Takenga. Ko te mutunga, ka hoki mai te kete, e 4 nga uara o te wa i tukuna mai ai te tono (Takenga), te wa i tae mai ai te tono a te tūmau (riro), te wa i tukuna ai e te tūmau te whakautu (tare) me te wa i tae mai ai te whakautu a te kiritaki - tae (kaore i roto i te kete). Ma te whakamahi i enei uara ka taea e taatau te whakarite i te waa tika.

Te tuku me te whiwhi waehere

# 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)

Te tukatuka raraunga mai i te tūmau

Ko te tukatuka raraunga mai i te tūmau he rite tonu ki nga mahi a te rangatira o Ingarangi mai i te raru tawhito o Raymond M. Smullyan (1978): “Kotahi tangata karekau he wati, engari he karaka pakitara tika i te kainga, i etahi wa ka warewarehia e ia. ki te hau. I tetahi ra, ka wareware ki te wiri ano i tana wati, ka haere ia ki te tirotiro i tana hoa, ka noho i te ahiahi ki a ia, ka hoki mai ki te kainga, ka taea e ia te whakanoho tika i te mataaratanga. I pehea ia ki te mahi i tenei ki te kore e mohiotia te wa haerenga? Teie te pahonoraa: “Ia faarue ana‘e oia i te fare, e taviri te hoê taata i ta ’na uati e e haamana‘o oia i te huru o te mau rima. I te taenga mai ki tetahi hoa me te wehe i nga manuhiri, ka tuhia e ia te wa o tana taenga mai me tana haerenga. Ma tenei ka taea e ia te mohio ki te roa o tana haerenga. Ka hoki ki te kainga me te titiro ki te karaka, ka whakatauhia e te tangata te roa o tana ngaro. Ma te tango mai i tenei wa i te wa i whakapaua e ia ki te toro, ka kitea e te tangata te wa e haere ana ki reira me te hoki mai. Ma te taapiri i te hawhe o te wa i runga i te huarahi ki te wa e wehe ai nga manuhiri, ka whai waahi ia ki te mohio ki te wa e tae mai ai ki te kainga me te whakatika i nga ringaringa o tana mataaratanga kia rite ki a ia.

Kimihia te wa e mahi ana te tūmau i runga i tētahi tono:

  1. Kimihia te wa haerenga o te kete mai i te kiritaki ki te tūmau: ((Tae mai - Taketake) - (Whakawhiti - Whiwhi)) / 2
  2. Kimihia te rerekētanga i waenga i te wā kiritaki me te wā tūmau:
    Whiwhi - Taketake - ((Ka tae - Taketake) - (Whakawhiti - Whiwhi)) / 2 =
    2 * Whiwhi - 2 * Taketake - Tae + Taketake + Tuku - Whiwhi =
    Whiwhi – Taketake – Tae + Tuku

Ka taapirihia e matou te hua o te uara ki te waa o te rohe me te pai ki te ora.

Putanga o te hua

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)

Whai hua hono.

Source: will.com

Tāpiri i te kōrero