網路時間協定

網絡時間協議（Network Time Protocol，縮寫：NTP）是在數據網絡潛伏時間可變的計算機系統之間通過分組交換進行時鐘同步的一個網絡協議，位於OSI模型的應用層。自1985年以來，NTP是目前仍在使用的最古老的互聯網協議之一。NTP由特拉華大學的大衛·米爾斯（David L. Mills）設計。
NTP意圖將所有參與計算機的協調世界時（UTC）時間同步到幾毫秒的誤差內。3它使用Marzullo算法的修改版來選擇準確的時間服務器，其設計旨在減輕可變網絡延遲造成的影響。NTP通常可以在公共互聯網保持幾十毫秒的誤差，並且在理想的局域網環境中可以實現超過1毫秒的精度。不對稱路由和擁塞控制可能導致100毫秒（或更高）的誤差。
該協議通常描述為一種主從式架構，但它也可以用在對等網路中，對等體雙方可將另一端認定為潛在的時間源。20發送和接收時間戳採用用戶數據報協議（UDP）的通訊埠123實現。這也可以使用廣播或多播，其中的客戶端在最初的往返校準交換後被動地監聽時間更新。NTP提供一個即將到來閏秒調整的警告，但不會傳輸有關本地時區或夏時制的信息。
當前協議為版本4（NTPv4），這是一個RFC 5905文檔中的建議標準。它向下兼容指定於RFC 1305的版本3。

**歷史**
David L. Mills。
1979年，網絡時間同步技術在紐約的國家計算機會議上於運行在跨大西洋衛星網絡的互聯網服務上公開演示，這可能是該技術的首次公開演示。該技術後在1981年互聯網工程筆記（IEN）173中描述，並根據RFC 778文檔開發為一個公開協議。該技術首先被部署在一個本地網絡，作為Hello路由協議的一部分，並在Fuzzball（一個用於網絡原型的實驗操作系統，已運行多年）中實現。
現在還有其他的相關網絡工具。這包括Daytime和Time協議用以記錄事件時間，以及互聯網控制消息協議和IP時間戳選項（RFC 781）。更多完整的同步系統，雖然缺乏NTP的數據分析和時鐘規律算法，包括Unix守護進程timed在內的軟件其使用選舉算法為所有客戶端指定服務器。以及數字時間同步服務（Digital Time Synchronization Service，DTSS）使用類似構NTP階層模型的服務器層次結構。
1985年，NTPv0被實現於Fuzzball和Unix，文檔化於RFC 958的NTP數據包頭、和往返延遲和偏移計算都被留存至NTPv4。儘管當時可用的計算機和網絡相對較慢，但在跨大西洋鏈路上也取得了優於100毫秒的精度，在以太網網絡上準確度為幾十毫秒。
1988年，一個更完整的NTPv1協議規範及相關的算法發表在RFC 1059。它利用了RFC 956的文獻中的實驗結果和時鐘濾波算法，並是第一個描述客戶端-服務器和對等網路模型的版本。1991年，NTPv1架構、協議和算法通過大衛·米爾斯在IEEE通信匯刊發佈的一篇文章得到了工程學界的更廣泛關注。
1989年，RFC 1119發佈通過有限狀態機定義的NTPv2，使用偽代碼來描述其操作。它引入了一個管理協議和加密認證方案，它們留存至NTPv4。社區批評NTP的設計缺乏形式正確性原則。他們的替代設計包括Marzullo算法，其修改版本已及時添加到NTP。這個時代的大多數算法也大部分留存至NTPv4。
1992年，RFC 1305定義了NTPv3。該RFC包括一個對所有錯誤來源的分析，從參考時鐘至最終客戶端，這使幫助度量和選擇最佳服務器成為可能（在其中幾個候選者反對的情況下）。廣播模式被引入。
在接下來的幾年裡，隨著新特性的添加和算法的改進，顯然還需要一個新的協議版本。2010年，RFC 5905發佈了一個對NTPv4的建議規範，但該協議自那時以來已經顯著改變，截至2014年，更新的RFC尚未發佈。在Mills從特拉華大學退休後，該參考實現目前由Harlan Stenn保持為一個開放源代碼項目。

**時鐘層**
美國海軍天文臺備用主時鐘Schriever AFB (Colorado)是一個第0層的NTP源
黃色箭頭表示直接連接；紅色箭頭表示網絡連接。
NTP使用一個分層、半分層的時間源系統。該層次的每個級別被稱為“stratum”，頂層分配為數字0。一個通過階層n同步的服務器將運行在階層n + 1。數字表示與參考時鐘的距離，用於防止層次結構中的循環依賴性。階層並不總是指示質量或可靠性；在階層3的時間源得到比階層2時間源更高的時間質量也很常見。電信系統對時鐘層使用不同的定義。以下提供了階層0、1、2、3的簡要描述。
 階層0（Stratum 0）
 這些是高精度計時設備，例如原子鐘（如銫、銣）、GPS時鐘或其他無線電時鐘。它們生成非常精確的脈衝秒信號，觸發所連接計算機上的中斷和時間戳。階層0設備也稱為參考（基準）時鐘。
 階層1
 這些與階層0設備相連、在幾微秒誤差內同步系統時鐘的計算機。階層1服務器可能與其他階層1服務器對等相連，以進行完整性檢查和備份。它們也被稱為主要（primary）時間服務器。
 階層2
 這些計算機通過網絡與階層1服務器同步。提供階層2的計算機將查詢多個階層1服務器。階層2計算機也可能與其他階層2計算機對等相連，為對等組中的所有設備提供更健全穩定的時間。
 階層3
 這些計算機與階層2的服務器同步。它們使用與階層2相同的算法進行對等和數據採樣，並可以自己作為服務器擔任階層4計算機，以此類推。
階層的上限為15；階層16被用於標識設備未同步。每臺計算機上的NTP算法相互構造一個貝爾曼-福特算法最短路徑生成樹，以最小化所有客戶端到階層1服務器的累積往返延遲。20

**時間戳**
NTP使用64位元的時間戳，其中32位元表示秒，32位元表示秒的小數，給出一個每232秒（136年）才會翻轉的時間尺度，理論分辨率2−32秒（233皮秒）。NTP以1900年1月1日作為開始時間，因此第一次翻轉將在2036年2月7日發生。
NTP的未來版本可能將時間表示擴展到128位元：其中64位元表示秒，64位元表示秒的小數。當前的NTPv4格式支持“時代數字”（Era Number）和“時代偏移”（Era Offset），正確使用它們應該有助於解決日期翻轉問題。據Mills稱：“64位元的秒小數足以分辨光子以光速通過電子所需的時間。64位元的秒足以提供明確的時間表示，直到宇宙變暗。”

**時鐘同步算法**
300px
典型的NTP客戶端將定期輪詢不同網絡上的三個或更多服務器。為同步其時鐘，客戶端必須計算其時間偏移量和來回通訊延遲。時間偏移“θ”定義為：
，
往返延遲“δ”為：
，
其中：
t0 是請求數據包傳輸的客戶端時間戳，
t1 是請求數據包回覆的服務器時間戳，
t2 是響應數據包傳輸的服務器時間戳
t3 是響應數據包回覆的客戶端時間戳。19
“θ”和“δ”的值通過過濾器並進行統計分析。異常值被剔除，並從最好的三個剩餘候選中導出估算的時間偏移。然後調整時鐘頻率以逐漸減小偏移，創建一個反饋迴路。20
當客戶端和服務器之間的輸入和輸出路由都具有對稱的標稱延遲時，同步是正確的。如果路由沒有共同的標稱延遲，則將差異取半作為測量誤差。

**軟件實現**
查詢第二層服務器狀態的NTP管理協議實用工具ntpq。

**參考實現**
NTP參考實現連同協議的開發已持續發展了20多年。隨著新功能的添加，向後兼容性仍保持不變。它包含幾個敏感的算法，尤其是時鐘規律，在同步到使用不同算法的服務器時可能會發生錯誤。該軟件已移植到幾乎各個計算平臺，包括個人計算機。13它在Unix上運行名為ntpd的守護進程，或在Windows上運行為一個Windows服務。15支持參考時鐘，並且以與遠程服務器相同的方式對偏移進行過濾和分析，儘管它們通常更頻繁地輪詢。19

**SNTP**
一個複雜度更低的NTP實現，使用相同協議，但不需要長時間儲存狀態，也稱簡單網絡時間協議（Simple Network Time Protocol，SNTP）。被某些嵌入式系統和不需要高精度時間的應用所採用。

**Windows時間服務**
從Windows 2000起的所有Microsoft Windows版本都包括Windows時間服務（W32Time），其具有將計算機時鐘同步到NTP服務器的能力。
W32Time服務最初是為實現Kerberos第五版的身份驗證協議，它需要誤差5分鐘內正確時間值以防止重放攻擊。Windows 2000和Windows XP中只實現了簡單的NTP，並在幾個方面違反了NTP第3版的標準。從Windows Server 2003和Windows Vista開始，已包括符合完整NTP的實現。微軟稱W32Time服務不能可靠地將同步時間保持在1至2秒的範圍內。如果需要更高的精度，微軟建議使用其他NTP實現。
Windows 10 與 Windows Server 2016 由版本 1607 開始，提供高精度的系統時間，支持1ms的時間精度。

**Ntimed**
一個新的NTP客戶端ntimed由Poul-Henning Kamp在2014年開始編寫。新的實現由Linux基金會贊助，作為參考實現的一個替代，因為它決定更容易地從頭開始編寫新的實現，而不是修復現有大型代碼庫的現有問題。截至2015年6月，它尚未正式發佈，但ntimed可以可靠地同步時鐘。ntimed在Debian和FreeBSD上工作，但也被移植到Windows和Mac OS。

**閏秒**
在閏秒事件的當天，ntpd從配置文件、附加參考時鐘或遠程服務器收到通知。因為時間必須是單調遞增，所以閏秒的插入方式為：23:59:59、23:59:60、00:00:00。雖然時鐘實際上在事件期間停止，但任何查詢系統時間的進程都會使它增加微小的量，以保持事件的順序。如果必要，在序列中刪除閏秒的形式為：23:59:58、00:00:00，跳過23:59:59。

**2038年問題**

**安全問題**
2014年底，幾個安全問題被發現。在以前，研究人員發現NTP服務器可能受到中間人攻擊的影響，除非數據包被加密和簽名以驗證身份。但這所涉及的計算量在繁忙的服務器上可能是不切實際的，尤其是容易遭遇阻斷服務攻擊。NTP消息欺騙可以被用來偏移客戶端計算機上的時鐘，並配合過期的加密密鑰來完成其他攻擊。可能受到偽造NTP消息影響的服務包括TLS、DNSSEC、各類緩存方案（例如DNS緩存）、比特幣以及許多持久登錄方案。
有著25年以上歷史的NTP代碼庫中的參考實現中只發現了幾個其他的安全問題，但最近出現的幾個引起了人們的強烈關注。該協議正在對其整個歷史進行修訂和審查。截至2011年1月，在NTP規範中沒有安全修訂，也沒有在CERT協調中心的報告。幾年來，該參考實現的當前代碼庫已經被多個來源進行安全審計，在當前發佈的軟件中沒有已知的高風險漏洞。
多種NTP服務器誤用和濫用實踐的存在導致了對網絡時間協議（NTP）服務器的破壞或劣化。
NTP已經被用於分佈式拒絕服務（DDoS）攻擊，方法是將一個具有偽造的返回地址的小的查詢發送到NTP服務器。類似DNS放大攻擊，服務器將以比攻擊者發送數據量大很多倍的數據量回復給偽造的目標。為了避免參與攻擊，服務器可以配置為忽略外部查詢，或者升級到4.2.7p26或更高版本。
一個緩衝區溢位漏洞已經被發現，並自2014年12月19日提供補丁。漏洞覆蓋NTP第四版所有版本，自4.2.8修復。蘋果公司首次使用自動更新功能解決該問題，不過這僅適用最近的MacOS版本。在10.6.8版本中，用戶可以手動修復服務器版本，以及普通用戶可以在系統首選項-日期和時間中關閉自動更新時間。研究人員認為該協議的設計是相當好的，缺陷出現在協議的實現中。某些錯誤很基礎，例如例程中缺少返回語句，這可能導致某些運行在root權限下的NTP版本被利用以無限制的訪問系統。守護進程不使用root權限的系統（例如BSD）不受此缺陷的影響。

**參見**
 Allan variance- 時鐘網絡- 原子時- NITZ- NTP pool- Ntpdate- OpenNTPD- 精確時間協議（IEEE 1588 PTP）

**備註**

**參考資料**

**拓展閱讀**
 title=Definitions of Managed Objects for Network Time Protocol Version 4 (NTPv4)- title=Network Time Protocol (NTP) Server Option for DHCPv6

**外部鏈接**
  公共NTP服務器列表 date=20210502023506  -  NTP節點鏡像群 date=20210426072900 -  IETF NTP working group date=20210226194158 -  Time and NTP paper date=20210308054911 -  NTP Survey 2005-  Current NIST leap seconds file compatible with ntpdfix-attempted=yes - David L. Mills,  A Brief History of NTP Time: Confessions of an Internet Timekeeper date=20210308041751 -  Keith Marzullo's homepage date=20090508010450 -  NTP Server Test Online Tool date=20170512013400