IEEE 1588 Sync報文單步時間戳
什么是單步時間戳
什么叫兩步時間戳,什么叫單步時間戳?我們結(jié)合Sync報文的發(fā)送來看一下。
Master在發(fā)送Sync報文時,記錄發(fā)送時間戳t1,緊接著通過發(fā)送一個Follow_up報文,把t1告訴slave。所以說對slave而言,接收Sync報文并且拿到Sync報文的發(fā)送時間戳t1,是需要master的兩步發(fā)送。這種情況下的時間戳,就叫做兩步時間戳。
單步時間戳實際上省去了發(fā)送Follow_up報文的步驟,在Sync報文從master的網(wǎng)絡(luò)硬件發(fā)出來的同時,網(wǎng)絡(luò)硬件會直接在報文上插入t1的時間信息。這樣slave在收到Sync報文的時候,報文上已經(jīng)包含了t1的信息。這種情況下的時間戳,就叫做單步時間戳。
顯然,使用單步時間戳必須要網(wǎng)絡(luò)硬件支持才行。
Sync報文的格式
在進一步了解單步時間戳如何將發(fā)送時間信息插入到Sync報文上之前,我們不得不先看看Sync報文的格式。IEEE 1588除了對1588報文分配了指定的以太網(wǎng)層,UDP/IP層的多播地址、端口和ethtype之外,還對報文的數(shù)據(jù)內(nèi)容做了定義。Sync報文的數(shù)據(jù)內(nèi)容定義如下。它是由一個header和一個originTimestamp的字段組成。

其header中的各個字段定義如下。

我們在這里重點關(guān)注兩個字段,一個是originTimestamp,一個是correctionField。因為Sync報文兩步時間戳和單步時間戳的區(qū)別就在這兩個字段的內(nèi)容上。
originTimestamp字段代表對Sync報文發(fā)送時間的評估值。其格式定義如下。在兩步時間戳的情況下,該字段為0。
struct Timestamp
{
UInteger48 secondsField;
UInteger32 nanosecondsField;
};
correctionFeild字段代表Sync報文從網(wǎng)絡(luò)硬件發(fā)出之前,經(jīng)歷的鏈路延遲。它的類型是interger64,其數(shù)值是鏈路延遲的納秒值乘以2^16。例如,2.5ns可以表示為0x0000000000028000。通常作為master構(gòu)建的Sync報文發(fā)送時,兩步時間戳的情況下該字段為0。Sync報文單步時間戳插入
上面我們了解到,在兩步時間戳的情況下,Sync報文的originTimestamp和correctionFeild字段的數(shù)值都是0。那么單步時間戳有什么不同呢。- 在發(fā)送Sync報文之前,originTimestamp字段會被寫入發(fā)送時間評估值,這個評估值和真正的發(fā)送時間戳要求誤差要在1s之內(nèi)。通常是軟件讀出1588 time寫到這個字段內(nèi)。
- Sync報文真正從硬件發(fā)送的時候,硬件會在correctionFeild字段加上一個延遲時間。
correctionFeild

originTimestamp
