無用的前言
做1588已經(jīng)很多年了,現(xiàn)在才開始想起來寫一些技術(shù)文章。這是第一篇,希望能堅持寫下去。1588標(biāo)準(zhǔn)的內(nèi)容其實很多、很細(xì),但終究是做網(wǎng)絡(luò)時鐘同步,所有方法和機(jī)制最終都是為計算出slave clock和master clock的時間偏差。所以想最快,最直觀的了解1588是怎么同步網(wǎng)絡(luò)中的時鐘,那就應(yīng)該看標(biāo)準(zhǔn)中最基本的E2E鏈路延遲
測量機(jī)制,了解slave clock是如何通過該機(jī)制同步。
E2E鏈路延遲測量機(jī)制
直接上圖,這是1588標(biāo)準(zhǔn)中,E2E鏈路延遲測量機(jī)制的原理圖。E2E鏈路延遲測量機(jī)制也叫Delay request-response鏈路延遲
測量機(jī)制。其實不難理解,兩個網(wǎng)絡(luò)設(shè)備要靠網(wǎng)絡(luò)報文來交換時間信息完成時間同步,而這些網(wǎng)絡(luò)報文的發(fā)送和接收都會記錄對應(yīng)的時間戳??梢允擒浖臅r間戳,也可以是硬件的時間戳,如MAC時間戳或者PHY時間戳。
進(jìn)入正題,我們來看這個同步的過程。
- Master發(fā)送Sync報文,發(fā)送時間戳記為t1。
- Slave收到Sync報文,接收時間戳記為t2。
- Master發(fā)送完Sync報文后立即發(fā)送Follow_up報文,并把t1寫在Follow_up報文上告訴slave。
- Slave發(fā)送Delay_req報文,發(fā)送時間戳記為t3。
- Master收到Delay_req報文,接收時間戳記為t4。立即回復(fù)Delay_resp報文,并把t4寫在Delay_resp報文上告訴slave。
所以最終不管是master的時間戳t1和t4,還是slave的時間戳t2和t3,slave端都是知道的。那如何計算slave和master之間的時間偏差呢,我們直接給出下面等式,然后再具體分析。
t2 - t1 = delay offset
t4 - t3 - delay - offset
其實Sync報文從發(fā)送到接收的過程,t2 - t1的時間差值不只包含了鏈路延遲,同時也包含了時間偏差。而Delay_req報文從發(fā)送到接收也是類似的,t4 - t3的時間差值不只包含了鏈路延遲,同時也包含了時間偏差。這兩個時間偏差剛好是相反數(shù)。有人可能會問,從master到slave的鏈路延遲,和從slave到master的鏈路延遲是一樣的嗎?重點來了,1588標(biāo)準(zhǔn)的核心假設(shè),就是master和slave之間的鏈路延遲是對稱的。如果有任何非對稱延遲的引入,那計算的時間偏差就會引入誤差。所以嚴(yán)格的說兩個網(wǎng)絡(luò)設(shè)備做1588同步,如果中間經(jīng)過了路由器或者交換機(jī)等轉(zhuǎn)發(fā)設(shè)備,而這些路由器或交換機(jī)并不支持1588協(xié)議的話,那就會引入非對稱鏈路延遲,影響同步的精度。這些話題以后再慢慢介紹。回歸正題,總之這兩個公式是可以算出來鏈路延遲,和時間偏差的。
2 * delay = (t4 - t3) (t2 - t1)
2 * offset = (t2 - t1) - (t4 - t3)
Slave如何調(diào)整時鐘
從1588標(biāo)準(zhǔn)的角度,介紹到計算出offset已經(jīng)完事了。1588并不規(guī)定怎么調(diào)整slave的時鐘和master同步。在這里我們做個知識擴(kuò)展,1588協(xié)議軟件通常會這么做,Slave如果計算出和master的時間偏差,并且發(fā)現(xiàn)這個時間偏差超出設(shè)定的一個閾值,比如1s,它就是直接重置clock的時間和master的時間值一樣。這樣時間同步就完成了嗎?并不是,因為重置clock的過程所有軟件操作都是有延遲的,所以slave和master仍然時間會有偏差。而且這兩個clock如果各自free running的話,時間漂移會越來越大。這個時候軟件通常在重置slave clock之后,時間偏差小于設(shè)定閾值的情況下,用PI servo來不斷補(bǔ)償slave的頻率,使得計算得到的時間偏差趨于一個最小的穩(wěn)定的數(shù)值。感興趣的同學(xué)可以私下了解下什么是PI控制。
無用的結(jié)束語
希望能堅持寫。