<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          剛填了一個奇怪的坑

          共 3169字,需瀏覽 7分鐘

           ·

          2020-02-11 23:21


          閱讀本文大概需要 3 分鐘。


          最近寫了一個 API Token 的校驗服務,想要增加時效性控制,比如一個 API,超過一段時間(比如 10s)之后,用同樣的參數(shù)再請求就會被服務器禁掉,無法獲取正常數(shù)據(jù),這樣可以保證數(shù)據(jù)的安全。

          怎么增加時效性控制呢?加一個時間的信息就好了,我們可以把時間信息包含在一個 API URL 的額外的參數(shù) token 里面。比如最簡單的,把前端獲取的時間戳進行 Base64 編碼之后作為 token,這個 token 會傳遞給后端,后端會對獲取到的 token 進行解碼,對獲取到的時間戳進行校驗,如果 Token 里面的時間戳和 Server 端的時間戳相差不超過一定的時間閾值(比如 10s),那就正常返回結(jié)果。如果超過一定的時間,服務器就直接返回 401 狀態(tài)碼,不會返回正常數(shù)據(jù),這樣可以保證接口的實時性,進一步保證安全。

          但是現(xiàn)在遇到了一個問題,我一開始把二者的時間差閾值設(shè)置成了 10 秒,在本地測試沒有問題,完全 OK,接口可以正常獲取數(shù)據(jù)。怪的問題來了,我把項目部署到服務器上,發(fā)現(xiàn)怎么著都不行,一直返回 401 狀態(tài)碼。經(jīng)過調(diào)試發(fā)現(xiàn)是前后端在同一時間獲取到的時間戳是不一樣的,足足相差了有 16 秒,服務器獲取的時間戳比客戶端慢了 16s,這導致在同一時刻二者并不能達到閾值條件,導致接口一直不能獲取正常數(shù)據(jù)。

          這到底是是為什么?為啥部署到服務器上之后,時間戳差別這么大呢?

          原因

          其實原因在于,服務器沒有對時間進行校準,時間有偏差,我也是醉了。。

          為了校準時間,我搜尋了過一些相關(guān)的知識,找到了 NTP 服務器相關(guān)問題,這里將時間和 NTP 相關(guān)問題記錄一下。

          時間

          接下來我們先看看時間和時區(qū)相關(guān)的內(nèi)容吧。

          時區(qū)

          按照常識來說,一天被劃分 24 小時,近似球體的地球是 360 度,所以我們使用經(jīng)緯度為坐標,將全球劃分為 24 個時區(qū)。

          國際上規(guī)定,每隔 15 度劃分一個時區(qū),全球可分為 24 個時區(qū)。以本初子午線為基準,從西經(jīng) 7.5° 至東經(jīng) 7.5°,劃分為中時區(qū),或叫零時區(qū),每時區(qū)區(qū)時相差一小時,東加西減。

          下面看看圖,估計大家地理上也學過。

          d0cde257d9825d9095947f0aa394b53e.webp

          東八區(qū)

          格林尼治時間為世界標準時間,即中時區(qū)的時間。又因為東半球(格林尼治以東)的時間比較早,中國的經(jīng)度在 120°E,是位于第八個時區(qū),所以我們是在東八區(qū),我們國家統(tǒng)一也用的東八區(qū)時間作為北京時間。

          UTC 時間

          UTC,全稱為 Coordinated Universal Time,表示協(xié)調(diào)通用時間,根據(jù)原子振蕩周期所計算的物理時鐘,這種計算方式對于時間的計算誤差時很小的。

          GMT 時間

          GMT,全稱為 Greenwich Mean Time,表示的是格林尼治時間,是根據(jù)地球的自轉(zhuǎn)周期計算的標準時間,由于各種不穩(wěn)定因素的影響,計時不是很理想。

          軟件時鐘

          表示的是 Linux 操作系統(tǒng)從 1970 年 01 月 01 日(中時區(qū))開始計算的時間。

          硬件時鐘

          主機硬件上面的時鐘,主要是 BIOS 內(nèi)部時間的記錄的時間。

          時間戳

          時間戳是指格林威治時間 1970 年 01月 01日 00 時 00 分 00 秒(北京時間 1970 年 01 月 01 日 08 時 00 分 00 秒)起至現(xiàn)在的總毫秒數(shù)。

          時間戳不區(qū)分時區(qū),全世界一樣。

          NTP 服務器

          了解了一些時間的定義之后,我們再來了解下 NTP 服務器相關(guān)的內(nèi)容。

          NTP 服務器是干嘛的?

          來看看官方定義:

          NTP(Network Time Protocol)服務器,是用來使計算機時間同步化的一種協(xié)議,它可以使計算機對其服務器或時鐘源(如石英鐘,GPS 等等)做同步化,它可以提供高精準度的時間校正(LAN 上與標準間差小于 1 毫秒,WAN 上幾十毫秒),且可介由加密確認的方式來防止惡毒的協(xié)議攻擊。時間按 NTP 服務器的等級傳播。按照離外部 UTC 源的遠近把所有服務器歸入不同的 Stratum(層)中。

          懂了吧,NTP 服務器就是提供時間信息的,我們通過 NTP 服務器可以獲取當前時間。

          NTP 服務器怎樣同步時間

          那世界上肯定有很多 NTP 服務器吧,它們怎么同步時間的呢?

          下面我們再來看看 NTP 服務器的特性:

          NTP 提供準確時間,首先要有準確的時間來源,這一時間應該是國際標準時間 UTC。NTP 獲得 UTC 的時間來源可以是原子鐘、天文臺、衛(wèi)星,也可以從 Internet 上獲取。這樣就有了準確而可靠的時間源。時間按 NTP 服務器的等級傳播。按照離外部 UTC 源的遠近將所有服務器歸入不同的 Stratum(層)中。Stratum-1 在頂層,有外部 UTC 接入,而 Stratum-2 則從 Stratum-1 獲取時間,Stratum-3 從 Stratum-2 獲取時間,以此類推,但 Stratum 層的總數(shù)限制在 15 以內(nèi)。所有這些服務器在邏輯上形成階梯式的架構(gòu)相互連接,而 Stratum-1 的時間服務器是整個系統(tǒng)的基礎(chǔ)。

          計算機主機一般同多個時間服務器連接, 利用統(tǒng)計學的算法過濾來自不同服務器的時間,以選擇最佳的路徑和來源來校正主機時間。即使主機在長時間無法與某一時間服務器相聯(lián)系的情況下,NTP 服務依然有效運轉(zhuǎn)。

          為防止對時間服務器的惡意破壞,NTP 使用了識別(Authentication)機制,檢查來對時的信息是否是真正來自所宣稱的服務器并檢查資料的返回路徑,以提供對抗干擾的保護機制。

          所以,可以看到,經(jīng)過 Stratum 的層層傳播,各個 NTP 服務器實現(xiàn)了時間同步。

          各個 NTP 服務器的時間基本都是很精確的,我們可以從 NTP 服務器來獲取時間,但由于網(wǎng)絡(luò)時延問題,可能相差一點點。

          NTP 服務器列表

          NTP 全球太多太多了,比如全球、每個大洲、大公司、高校都會有自己的 NTP 服務器。

          例如:

          ?全球:pool.ntp.org?亞洲:asia.pool.ntp.org?北美洲:north-america.pool.ntp.org?中國教育網(wǎng):edu.ntp.org.cn?上交:ntp.sjtu.edu.cn?微軟:time.windows.com?蘋果:time.apple.com

          等等,當然我們也可以自己設(shè)置自己想用的 NTP 服務器。

          NTP 服務器校準

          那么回到我的問題,我的服務器的時間沒有經(jīng)過校準,導致時間差距這么大。所以我可以使用 NTP 服務器對時間進行校準就好了。

          服務器是 Ubuntu 系統(tǒng),校準流程如下。

          首先服務器上安裝 ntpdate:

          sudo apt install ntpdate

          然后校準時間,輸入任意一個 NTP 服務器地址就行了:

          sudo ntpdate time.apple.com

          經(jīng)過校準之后,發(fā)現(xiàn)時間就一致了,問題解決。

          參考

          ?https://baike.baidu.com/item/%E4%B8%AD%E6%97%B6%E5%8C%BA/339115?https://baike.baidu.com/item/NTP%E6%9C%8D%E5%8A%A1%E5%99%A8/8633994?https://blog.csdn.net/qq_36294875/article/details/79491614?https://segmentfault.com/q/1010000021645848/a-1020000021645987?https://www.weibo.com/ttarticle/p/show?id=2309403955443172016290



          崔慶才丨靜覓

          隱形字

          同名公眾號「崔慶才丨靜覓」


          在這里分享自己的一些經(jīng)驗、想法和見解。


          30b603da4966f9323c1f64b290b929b9.webp2eb18510c9101af83e7cad5453c31472.webp

          長按識別二維碼關(guān)注




          好文和朋友一起看~
          瀏覽 68
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  野外打野不雅视频在线播放 | 97精品超碰一区二区三区 | 在线看黄色视频网站 | 偷拍福利视频 | 亚洲天堂电影网 |