地球分為東西十二個區(qū)域,共計(jì) 24 個時區(qū),以格林威治作為全球標(biāo)準(zhǔn)時間(即GMT 時間,0時區(qū)),東部時區(qū)以格林威治時區(qū)進(jìn)行加法,而西時區(qū)則以格林威治時間作減法。但地球的軌道并非正圓,在加上自轉(zhuǎn)速度逐年遞減,時間會有誤差。在計(jì)算時間的時,最準(zhǔn)確是使用“原子震蕩周期”所計(jì)算的物理時鐘。這種時鐘被稱為標(biāo)準(zhǔn)時間,即UTC時間(Coordinated Universal Time)。UTC 的準(zhǔn)確性毋庸置疑,美國的 NIST F-1 原子鐘 2000 年才將產(chǎn)生 1 秒誤差。
實(shí)際生產(chǎn)生活中,使用原子時鐘這種準(zhǔn)確的計(jì)時似乎缺少必要性,我們更多關(guān)注的是參與活動的各個個體在相同的時間環(huán)境下對話。例如,當(dāng)我們說明天早上8:00開會的時候,我們并不在乎原子時鐘真實(shí)的計(jì)時情況,只要參會的所有個體對“明天早上8:00”這個時間具有相同的認(rèn)知即可。這里時間同步是個非常重要的概念,如果某位同仁手表慢了半小時,那它對“早上8:00”的理解就比其他人要慢半小時,最終會導(dǎo)致ta開會遲到。同樣的道理,我們在影視劇中經(jīng)常能看到特種作戰(zhàn)小組在執(zhí)行特別任務(wù)前一般都要先完成組員之間的時間同步,避免組員之間在時間上的認(rèn)知差異給任務(wù)帶來不必要的麻煩,甚至危及生命。
NTP(Network Time Protocol,網(wǎng)絡(luò)時間協(xié)議)是由RFC 1305定義的時間同步協(xié)議,用于分布式設(shè)備(比如電腦、手機(jī)、智能手表等)進(jìn)行時間同步,避免人工校時的繁瑣和由此引入的誤差,方便快捷地實(shí)現(xiàn)多設(shè)備時間同步。NTP校時服務(wù)基于UDP傳輸協(xié)議進(jìn)行報(bào)文傳輸,工作端口默認(rèn)為123/udp。
1. NTP的工作原理
NTP的實(shí)現(xiàn)過程如圖所示,假如設(shè)備A和設(shè)備B本地時間存在差異(設(shè)備A早上10點(diǎn),設(shè)備B早上11點(diǎn)),現(xiàn)在設(shè)備A欲通過NTP和設(shè)備B在時間上保持同步:

- 設(shè)備A向設(shè)備B發(fā)送NTP報(bào)文,報(bào)文包含發(fā)出時設(shè)備A本地時間,記為
;
- 設(shè)備B受到NTP報(bào)文向其中添加接收到報(bào)文時設(shè)備B的本地時間,記為
;
- 設(shè)備B響應(yīng)NTP請求并向A發(fā)送NTP授時報(bào)文,報(bào)文包含報(bào)文從設(shè)備B發(fā)出時設(shè)備B的本地時間,記為
;
- 設(shè)備A收到設(shè)備B的響應(yīng)后根據(jù)報(bào)文內(nèi)容修正本地時間,我們將報(bào)文到達(dá)A時A的本地時間記為
.
這樣可以輕松計(jì)算出來:
設(shè)備B響應(yīng)時長
網(wǎng)絡(luò)傳輸延時(雙向)
現(xiàn)假設(shè)設(shè)備A和設(shè)備B之間的時間差位,易得:
通過上式計(jì)算出.
設(shè)備A就能根據(jù)調(diào)整本地時間,實(shí)現(xiàn)和設(shè)備B的時間同步。
2. NTP 網(wǎng)絡(luò)結(jié)構(gòu)
NTP的目的是在一個同步子網(wǎng)中,通過NTP協(xié)議將主時間服務(wù)器的時鐘信息傳送到其他二級時間服務(wù)器,實(shí)現(xiàn)二級時間服務(wù)器和主時間服務(wù)器的時鐘同步。這些服務(wù)器按層級關(guān)系連接,每一級稱為一個層數(shù)(stratum),如主時間服務(wù)器層數(shù)為 stratum 1,二級時間服務(wù)器層數(shù)為 stratum 2,以此類推。時鐘層數(shù)越大,準(zhǔn)確性越低。
注意:準(zhǔn)確性指相對于主時間服務(wù)器而言。

在NTP網(wǎng)絡(luò)結(jié)構(gòu)中,有以下幾個概念:
- 同步子網(wǎng): 如上圖,由主時間服務(wù)器、二級時間服務(wù)和客戶端組成的互連網(wǎng)絡(luò)。
- 主時間服務(wù)器:指直接通過線纜或無線電同步到標(biāo)準(zhǔn)參考時鐘的設(shè)備,標(biāo)準(zhǔn)參考時鐘通常指RadioClock或衛(wèi)星定位系統(tǒng)或原子時鐘。
- 二級時間服務(wù)器:通過主時間服務(wù)器或子網(wǎng)中其他二級服務(wù)器獲得時鐘同步,并向外提供時鐘同步服務(wù)的設(shè)備。二級時間服務(wù)器通過 NTP 將時間信息傳送到局域網(wǎng)內(nèi)部的其它主機(jī)。
- 客戶端:從主時間服務(wù)器或二級服務(wù)器獲得時鐘同步,但不提供時鐘同步服務(wù),比如手機(jī)和普通家用電腦中的網(wǎng)絡(luò)校時程序。
- 層數(shù): 層數(shù)是對時鐘同步的一個分級標(biāo)準(zhǔn),取值范圍1~16,代表了時鐘的精確度,數(shù)值越小說明在拓?fù)浣Y(jié)構(gòu)上離主時間同步服務(wù)器越近,精度越高。1表示最高精度,16表示未同步。
在正常情況下,同步子網(wǎng)中的主時間服務(wù)器和二級時間服務(wù)器呈現(xiàn)出一種分層主從結(jié)構(gòu)。在這種分層結(jié)構(gòu)中,主時間服務(wù)器位于根部,二級時間服務(wù)器向葉子節(jié)點(diǎn)靠近,層數(shù)遞增,準(zhǔn)確性遞減,降低的程度取決于網(wǎng)絡(luò)路徑和本地時鐘的穩(wěn)定性。
3. NTP 報(bào)文格式
NTP有兩種不同類型的報(bào)文,一種是時鐘同步報(bào)文,另一種是控制報(bào)文。控制報(bào)文僅用于需要網(wǎng)絡(luò)管理的場合,它對于時鐘同步功能來說并不是必需的,這里不做介紹。
時鐘同步報(bào)文封裝在UDP報(bào)文中,其格式如圖所示:

各主要字段解釋如下:
- LI (Leap Indicator) : 長度為2比特,值為“11”時表示告警狀態(tài),時鐘未被同步。為其他值時NTP本身不做處理。
- VN (Version Number): 長度為3比特,表示NTP的版本號.
- Mode:長度為3比特,表示NTP的工作模式。不同的值所表示的含義分別是:0未定義、1表示主動對等體模式、2表示被動對等體模式、3表示客戶模式、4表示服務(wù)器模式、5表示廣播模式或組播模式、6表示此報(bào)文為NTP控制報(bào)文、7預(yù)留給內(nèi)部使用。
- Stratum:系統(tǒng)時鐘的層數(shù),取值范圍為1~16,它定義了時鐘的準(zhǔn)確度。層數(shù)為1的時鐘準(zhǔn)確度最高,準(zhǔn)確度從1到16依次遞減,層數(shù)為16的時鐘處于未同步狀態(tài),不能作為參考時鐘。
- Poll:輪詢時間,即兩個連續(xù)NTP報(bào)文之間的時間間隔。
- Precision:系統(tǒng)時鐘的精度。
- Root Delay:本地到主參考時鐘源的往返時間。
- Root Dispersion:系統(tǒng)時鐘相對于主參考時鐘的最大誤差。
- Reference Identifier:參考時鐘源的標(biāo)識。
- Reference Timestamp:系統(tǒng)時鐘最后一次被設(shè)定或更新的時間。
- Originate Timestamp:NTP請求報(bào)文離開發(fā)送端時發(fā)送端的本地時間。
- Receive Timestamp:NTP請求報(bào)文到達(dá)接收端時接收端的本地時間。
- Transmit Timestamp:應(yīng)答報(bào)文離開應(yīng)答者時應(yīng)答者的本地時間。
- Authenticator:驗(yàn)證信息。
其中,NTP發(fā)送和接收的報(bào)文數(shù)據(jù)包類似,通常只需要前48個字節(jié)就能進(jìn)行授時和校時服務(wù)。下面分別是抓包獲取的NTP請求數(shù)據(jù)包和回復(fù)數(shù)據(jù)包示例(僅前48個字節(jié)):
- 請求數(shù)據(jù)包:
1B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ------------頭部
D0 AF 5F F5 23 D7 08 00---------------Originate Timestamp ()出發(fā)時間戳有效位為8 bytes
- 回復(fù)數(shù)據(jù)包:
1C 02 00 EC 00 00 06 EA 00 00 0C A2 C0 A8 33 CA----數(shù)據(jù)包頭部,共16 bytes
D0 AF 5E A3 F5 BD 72 BC---------------Reference Timestamp
D0 AF 5F F5 23 D7 08 00---------------Originate Timestamp ()
D0 AF 61 D7 CD 2E F9 11---------------Receive Timestamp ()
D0 AF 61 D7 CD 2F F4 BA---------------Transmit Timestamp ()
收到數(shù)據(jù)包后,接收端本地再產(chǎn)生一個時間戳()。
這里,每個返回?cái)?shù)據(jù)前4字節(jié)為秒的整數(shù)部分,后4字節(jié)為秒的小數(shù)部分。
4. NTP工作模式
設(shè)備可以采用多種NTP工作模式進(jìn)行時間同步:
- 單播C/S模式
- 對等體模式
- 廣播模式
- 組播模式
- 多播模式
4.1 單播C/S模式
單播C/S模式運(yùn)行在同步子網(wǎng)層數(shù)較高的層級上,客戶端需要預(yù)先知道時間服務(wù)器IP或域名并定期向服務(wù)器發(fā)送時間同步請求報(bào)文,報(bào)文中的 Mode字段設(shè)置為 3(客戶模式)。服務(wù)器端收到報(bào)文后會自動工作在服務(wù)器模式,并發(fā)送應(yīng)答報(bào)文,報(bào)文中的Mode字段設(shè)置為4(服務(wù)器模式)??蛻舳耸盏綉?yīng)答報(bào)文后,進(jìn)行時鐘過濾和選擇,并同步到優(yōu)選的服務(wù)器??蛻舳瞬还芊?wù)器端是否可達(dá),也不管服務(wù)器端所在的層數(shù)。在這種模式下,客戶端會同步到服務(wù)器,但不會修改服務(wù)器的時鐘。服務(wù)器則在客戶端發(fā)送請求之間無需保留任何狀態(tài)信息??蛻舳烁鶕?jù)本地情況自由管理發(fā)送報(bào)文的時間間隔。

4.2 對等體模式
對等體模式運(yùn)行在同步子網(wǎng)較低層級上,主動對等體和被動對等體實(shí)現(xiàn)時鐘相互同步。這里有兩個概念:主動對等體和被動對等體。
- 主動對等體:指對等體模式下,同步報(bào)文主動發(fā)起方。
-
被動對等體:指對等體模式下,同步報(bào)文被動回應(yīng)方。
對等體模式圖例
如上圖所示,對等體模式工作步驟如下:
1.主動對等體和被動對等體首先交互Mode字段為3(客戶端模式)和4(服務(wù)器模式)的NTP報(bào)文,這一步主要是獲得通信時延。
- 主動對等體向被動對等體發(fā)送時鐘同步報(bào)文,報(bào)文中的Mode字段設(shè)置為1(主動對等體)。不考慮被動對等體是否可達(dá)以及對等體的層數(shù)。
- 被動對等體收到報(bào)文后自動工作在被動對等體模式,并發(fā)送應(yīng)答報(bào)文,報(bào)文中的Mode字段設(shè)置為2(被動對等體)。
- 經(jīng)過報(bào)文的交互,對等體模式建立起來。
主動對等體和被動對等體可以互相同步。如果雙方的時鐘都已經(jīng)同步,則以層數(shù)小的時鐘為準(zhǔn)。
注意:對等體模式不需要用戶手動設(shè)置,設(shè)備依據(jù)收到的NTP報(bào)文自動建立連接并設(shè)置狀態(tài)變量。
4.3 廣播模式
廣播模式應(yīng)用在多臺工作站和不需要很高精度的高速網(wǎng)絡(luò)中。主要工作流程如圖所示:

- 服務(wù)器端周期性地向廣播地址
255.255.255.255發(fā)送時鐘同步報(bào)文,報(bào)文中的Mode字段設(shè)置為5(廣播模式)。它不需要考慮其他設(shè)備是否可以到達(dá)以及層數(shù)多少。 - 設(shè)備偵聽來自服務(wù)器的廣播報(bào)文。當(dāng)設(shè)備接收到第一個廣播報(bào)文后,自動進(jìn)入客戶端模式并與服務(wù)器交互Mode字段為3(客戶模式)和4(服務(wù)器模式)的NTP報(bào)文,以獲得客戶端與服務(wù)器間的網(wǎng)絡(luò)延遲。
- 之后,客戶端進(jìn)入廣播客戶端模式,繼續(xù)偵聽廣播報(bào)文的到來,根據(jù)到來的廣播報(bào)文將系統(tǒng)時鐘與服務(wù)器進(jìn)行同步。
注意:在廣播模式下,服務(wù)端只負(fù)責(zé)向外廣播時鐘信息,自身時鐘不受客戶端影響。
4.4 組播模式
組播模式適用于有大量客戶端分布在網(wǎng)絡(luò)中的情況。通過在網(wǎng)絡(luò)中使用 NTP 組播模式, NTP 服務(wù)器發(fā)送的組播消息包可以到達(dá)網(wǎng)絡(luò)中所有的客戶端,從而降低由于 NTP 報(bào)文過多而給網(wǎng)絡(luò)造成的壓力。主要工作流程如下:

- 服務(wù)器端周期性地向用戶指定的組播地址(若用戶沒有配置組播地址,則使用默認(rèn)的NTP組播地址
224.0.1.1)發(fā)送時鐘同步報(bào)文,報(bào)文中的Mode字段設(shè)置為5(組播模式)。它不需要考慮其他設(shè)備是否可以到達(dá)以及層數(shù)多少。 - 設(shè)備偵聽來自服務(wù)器的組播報(bào)文。當(dāng)設(shè)備接收到第一個組播報(bào)文后,自動進(jìn)入客戶端模式并與服務(wù)器交互Mode字段為3(客戶模式)和4(服務(wù)器模式)的NTP報(bào)文,以獲得客戶端與服務(wù)器間的網(wǎng)絡(luò)延遲。
- 之后,客戶端進(jìn)入組播客戶端模式,繼續(xù)偵聽組播報(bào)文的到來,根據(jù)到來的組播報(bào)文將系統(tǒng)時鐘與服務(wù)器進(jìn)行同步。
注意:組播模式和廣播模式類似,只是它是向特定的組播地址發(fā)送時鐘同步廣播報(bào)文。在組播模式下,服務(wù)端只負(fù)責(zé)向外廣播時鐘信息,自身時鐘不受客戶端影響。
4.5 多播模式
多播模式適用于服務(wù)器分布分散的網(wǎng)絡(luò)中??蛻舳丝梢园l(fā)現(xiàn)與之最近的多播服務(wù)器,并進(jìn)行同步。多播模式適用于服務(wù)器不穩(wěn)定的組網(wǎng)環(huán)境中,服務(wù)器的變動不會導(dǎo)致整網(wǎng)中的客戶端重新進(jìn)行配置。其工作流程如下:

- 客戶端周期性地向IPv4/IPv6組播地址發(fā)送時鐘同步報(bào)文,報(bào)文中的Mode字段設(shè)置為3(客戶端模式)。它不需要考慮時間服務(wù)器是否可以到達(dá)以及層數(shù)多少。
- 服務(wù)器持續(xù)偵聽組播報(bào)文。當(dāng)設(shè)備接收到第一個組播報(bào)文后,自動進(jìn)入服務(wù)器模式并返回Mode字段為4(服務(wù)器模式)的NTP報(bào)文。
- 客戶端接受到來自多個時鐘服務(wù)器的應(yīng)答報(bào)文,經(jīng)過時鐘過濾和選擇同步到優(yōu)選始終服務(wù)器。
注意:為了防止多播模式下,客戶端不斷的向多播服務(wù)器發(fā)送 NTP 請求報(bào)文增加設(shè)備的負(fù)擔(dān),協(xié)議規(guī)定了最小連接數(shù)的概念。多播模式下,客戶端每次和服務(wù)器時鐘同步后,都會記錄下此次同步過中建立的連接數(shù),將調(diào)用最少連接的數(shù)量被稱為最小連接數(shù)。以后當(dāng)客戶端調(diào)動的連接數(shù)達(dá)到了最小連接數(shù)且完成了同步,客戶端就認(rèn)為同步完成;同步完成后每過一個超時周期,客戶端都會傳送一個報(bào)文,用于保持連接。同時,為了防止客戶端無法同步到服務(wù)器,協(xié)議規(guī)定客戶端每發(fā)送一個 NTP 報(bào)文,都會將報(bào)文的生存時間 TTL(Time To Live)進(jìn)行累加(初始為 1),直到達(dá)到最小連接數(shù),或者 TTL 值達(dá)到上限(上限值為 255)。若 TTL 達(dá)到上限,或者達(dá)到最小連接數(shù),而客戶端調(diào)動的連接數(shù)仍不能完成同步過程,則客戶端將停止一個超時周期的數(shù)據(jù)傳輸以清除所有連接,然后重復(fù)上述過程。
5. NTP時鐘服務(wù)器
下面補(bǔ)充一些常用的NTP時鐘服務(wù)器:
| 名稱 | 地址 |
|---|---|
| 北斗授時服務(wù) | 114.255.121.193 |
| 清華TUNA協(xié)會 | ntp.tuna.tsinghua.edu.cn |
| 國家NTP授時 | ntp.ntsc.ac.cn |
| 中國NTP快速授時 | cn.ntp.org.cn |
| 教育網(wǎng)NTP授時 | edu.ntp.org.cn |
更多NTP授時服務(wù)器請查看:
6. 主流操作系統(tǒng)客戶端使用NTP同步時間
假設(shè)你比較喜歡清華的服務(wù)并打算將ntp.tuna.tsinghua.edu.cn作為你的授時服務(wù)器。下面將簡單介紹不同的操作系統(tǒng)該如何操作使得設(shè)備能夠使用此服務(wù)器同步時間。
Windows客戶端
本部分以主流Windows 10 系統(tǒng)為例演示如何使用NTP服務(wù)同步系統(tǒng)時間。
方案一
在“控制面板 > 時鐘、語言和區(qū)域 > 日期和時間 > Internet時間 > 更改設(shè)置”中勾選“與 Internet 時間服務(wù)器同步”,在“服務(wù)器”一欄填入ntp.tuna.tsinghua.edu.cn。方案二
通過在命令提示符中使用
w32tm /config /manualpeerlist:ntp.tuna.tsinghua.edu.cn /syncfromflags:manual /update
來將此服務(wù)器設(shè)置為個人選擇的時間服務(wù)器。
Linux客戶端
Linux發(fā)行版有兩個主流程序支持ntp協(xié)議:ntpd和chrony。
具體使用和配置參考各自文檔:ntpd doc 和 chrony doc
MAC客戶端
在“系統(tǒng)配置 > 日期與時間 > 自動設(shè)置日期與時間”一欄,填入 ntp.tuna.tsinghua.edu.cn。
7. #TODO
- 自建NTP授時服務(wù)器
