網路時間協定

歷史

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架構、協定和演算法通過David L. Mills在IEEE Transactions on Communications發布的一篇文章得到了工程學界的更廣泛關注。
1989年，RFC 1119發布通過有限狀態機定義的NTPv2，使用虛擬碼來描述其操作。它引入了一個管理協定和加密認證方案，它們留存至NTPv4。社群批評NTP的設計缺乏形式正確性原則。他們的替代設計包括Marzullo演算法，其修改版本已及時添加到NTP。這個時代的大多數演算法也大部分留存至NTPv4。
1992年，RFC 1305定義了NTPv3。該RFC包括一個對所有錯誤來源的分析，從參考時鐘至最終用戶端，這使幫助度量和選擇最佳伺服器成為可能（在其中幾個候選者反對的情況下）。廣播模式被引入。
在接下來的幾年裡，隨著新特性的添加和演算法的改進，顯然還需要一個新的協定版本。2010年，RFC 5905發布了一個對NTPv4的建議規範，但該協定自那時以來已經顯著改變，截至2014年，更新的RFC尚未發布。在Mills從德拉瓦大學退休後，該參考實現目前由Harlan Stenn保持為一個開放原始碼專案。

時間戳

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

參考實現

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

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 Server 2016現在在某些操作條件下支援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。

安全問題

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）不受此缺陷的影響。