IEEE 1588 Sync報(bào)文單步時(shí)間戳
什么是單步時(shí)間戳
什么叫兩步時(shí)間戳,什么叫單步時(shí)間戳?我們結(jié)合Sync報(bào)文的發(fā)送來(lái)看一下。Master在發(fā)送Sync報(bào)文時(shí),記錄發(fā)送時(shí)間戳t1,緊接著通過(guò)發(fā)送一個(gè)Follow_up報(bào)文,把t1告訴slave。所以說(shuō)對(duì)slave而言,接收Sync報(bào)文并且拿到Sync報(bào)文的發(fā)送時(shí)間戳t1,是需要master的兩步發(fā)送。這種情況下的時(shí)間戳,就叫做兩步時(shí)間戳。
單步時(shí)間戳實(shí)際上省去了發(fā)送Follow_up報(bào)文的步驟,在Sync報(bào)文從master的網(wǎng)絡(luò)硬件發(fā)出來(lái)的同時(shí),網(wǎng)絡(luò)硬件會(huì)直接在報(bào)文上插入t1的時(shí)間信息。這樣slave在收到Sync報(bào)文的時(shí)候,報(bào)文上已經(jīng)包含了t1的信息。這種情況下的時(shí)間戳,就叫做單步時(shí)間戳。
顯然,使用單步時(shí)間戳必須要網(wǎng)絡(luò)硬件支持才行。
Sync報(bào)文的格式
在進(jìn)一步了解單步時(shí)間戳如何將發(fā)送時(shí)間信息插入到Sync報(bào)文上之前,我們不得不先看看Sync報(bào)文的格式。IEEE 1588除了對(duì)1588報(bào)文分配了指定的以太網(wǎng)層,UDP/IP層的多播地址、端口和ethtype之外,還對(duì)報(bào)文的數(shù)據(jù)內(nèi)容做了定義。Sync報(bào)文的數(shù)據(jù)內(nèi)容定義如下。它是由一個(gè)header和一個(gè)originTimestamp的字段組成。
其header中的各個(gè)字段定義如下。
我們?cè)谶@里重點(diǎn)關(guān)注兩個(gè)字段,一個(gè)是originTimestamp,一個(gè)是correctionField。因?yàn)镾ync報(bào)文兩步時(shí)間戳和單步時(shí)間戳的區(qū)別就在這兩個(gè)字段的內(nèi)容上。
originTimestamp字段代表對(duì)Sync報(bào)文發(fā)送時(shí)間的評(píng)估值。其格式定義如下。在兩步時(shí)間戳的情況下,該字段為0。
struct Timestamp
{
UInteger48 secondsField;
UInteger32 nanosecondsField;
};
correctionFeild字段代表Sync報(bào)文從網(wǎng)絡(luò)硬件發(fā)出之前,經(jīng)歷的鏈路延遲。它的類型是interger64,其數(shù)值是鏈路延遲的納秒值乘以2^16。例如,2.5ns可以表示為0x0000000000028000。通常作為master構(gòu)建的Sync報(bào)文發(fā)送時(shí),兩步時(shí)間戳的情況下該字段為0。Sync報(bào)文單步時(shí)間戳插入
上面我們了解到,在兩步時(shí)間戳的情況下,Sync報(bào)文的originTimestamp和correctionFeild字段的數(shù)值都是0。那么單步時(shí)間戳有什么不同呢。- 在發(fā)送Sync報(bào)文之前,originTimestamp字段會(huì)被寫(xiě)入發(fā)送時(shí)間評(píng)估值,這個(gè)評(píng)估值和真正的發(fā)送時(shí)間戳要求誤差要在1s之內(nèi)。通常是軟件讀出1588 time寫(xiě)到這個(gè)字段內(nèi)。
- Sync報(bào)文真正從硬件發(fā)送的時(shí)候,硬件會(huì)在correctionFeild字段加上一個(gè)延遲時(shí)間。
correctionFeild
originTimestamp