Clock Skew
Clock Skew 的核心概念是兩台機器對「現在幾點」的認知有落差,任何跨機器比較時間的機制都要為這個落差保留容忍範圍。它影響的是時效性判斷的邊界:Replay Attack 的新鮮度窗口、憑證的有效期起訖、以及依時間戳排序的事件流,都建立在雙方時鐘足夠接近這個前提上。
概念位置
Clock Skew 位在分散式系統的時間假設層。單機系統的時間是單一來源,比較大小即可;跨機器之後「同一時刻」需要被定義,而每台機器的時鐘各自漂移,NTP 同步只把偏差收斂到一個範圍而非消除它。
它與 Idempotency Key 的分工是:需要判斷「先後」時依賴時間、需要判斷「是否為同一個」時依賴識別值。用時間戳當去重依據會在時鐘回撥時產生重複,這是把兩種責任混在同一個欄位上的結果。
可觀察訊號與例子
需要正視時鐘偏移的訊號是驗證邏輯出現「時間差在 N 秒內才接受」這類判斷,而 N 是憑經驗填的。這個值若小於實際偏移,正常請求會間歇性被拒;若遠大於實際偏移,時效檢查的防護價值就下降。
典型的可觀察現象是失敗率與部署節點相關:某幾台機器發出的請求持續被拒,其他機器正常,而請求內容並無差異。這種分布指向時鐘而非邏輯。
虛擬機從快照還原、容器在資源競爭下被暫停、以及跨時區部署時把本地時間當成 UTC 使用,都會讓偏移遠超過 NTP 的正常收斂範圍。
設計責任
設計時要把容忍值的來源寫下來,讓它可以被重新計算:量測實際的偏移分布取上界,再決定要不要蓋過尖峰事件。這是一個二選一的決定,不是憑感覺加一個餘裕 —— 要涵蓋快照還原、容器被暫停這類分鐘級偏移,容忍值就得放寬到那個量級;不涵蓋,就把容忍值壓在 NTP 正常收斂的範圍內,改由監控在偏移超標時把該節點移出輪替。前者容忍值大、攻擊窗口跟著大,後者反過來,取捨點是該端點的操作後果。容忍值寫成常數而不記錄依據時,後續沒有人敢動它。接收外部推送的端點還有第二個量會撐開下界——對方的最大重試退避間隔,在時間戳於事件產生時簽的設計下它常常主導,換算見 7.35 簽章對接的驗證收斂。
時間戳的單位與時區要在介面規格裡明確定義。秒與毫秒的混用、以及本地時間與 UTC 的混用,產生的偏差量級遠大於真正的時鐘漂移。
所有參與時間比較的機器都要納入時間同步監控,並在偏移超過容忍值的一定比例時告警。等到請求開始被拒才發現,排查方向通常會先指向認證邏輯。