繼上一期帶你讀懂時間敏感網絡 (TSN) 中的時間同步協議 gPTP(一),這期為您帶來該系列的第二篇。
多端口實例、中繼實例
多端口PTP實例的每個端口都具有收發PTP報文的能力,當其成為GrandMaster時會向所有支持802.1AS的鏈路發送Announce報文與Sync報文。當PTP實例不是中繼實例且成為Slave時會選擇可獲得最
高同步精度的端口作為Slave端口,其他端口收到的Sync報文將被忽略,忽略Sync的端口稱為Passive端口。BMCA算法首先使用systemIdentity判斷哪個實例是最佳GrandMaster,當多個端口收到相同systemIdentity時,BMCA算法選取連接到至GrandMaster經轉發最少鏈路的端口成為Slave端
口。gPTP通過stepsRemoved識別報文被轉發的次數,它和GrandMaster信息一起在Announce報文中傳輸,每經過一個PTP節點該值會加一。
中繼實例(Relay Instance)是指擁有轉發和處理時間同步消息功能的PTP實例,通過中繼實例時間同步消息能夠準確傳播到網絡中的多個設備上。典型的中繼實例有支持gPTP的交換機、路由器等。相對于非中繼實例,中繼實例會同時擁有Master、Slave、Passive端口。
中繼實例選擇Slave端口的邏輯與多端口實例的邏輯相同,都是收到包含最佳systemIdentity、stepsRemoved參數Announce報文的端口成為Slave端口。若實例當前GrandMaste的systemIdentity優于端口收到的systemIdentity端口將成為Master端口,其他端口成為Passive端口。以下為PTP實例的Master/Slave層次結構:
注意:本文為方便讀者理解將多端口實例、中繼實例、單端口實例的BMCA算法進行了拆分解釋,實際上各種PTP實例使用的BMCA算法相同。
而當Slave端口與中繼實例相連時,Pdelay報文不會被轉發而是由中繼實例直接響應,Slave端口測得的鏈路延遲為到中繼節點的延遲而非到GrandMaste的延遲。另外中繼實例對Sync報文的處理、轉發操作也會增加Sync報文從GrandMaste到達Slave的時間,按照前文中的方法將無法得出正確的時鐘偏移量。實際上每個gPTP報文的包頭都帶有correctionField字段,在與Sync對應的Followup報文中該字段表示對應的Sync報文從被GrandMaster發出,到被最后一個中繼實例發出經過的時間,有了該變量即使GrandMaster與Slave間存在中繼實例,Slave依然可求得與Master時鐘的正確偏移量。
中繼實例轉發Sync報文時會使用新計算的correctionField替換原報文中的correctionField。
rateRatio測量
中繼實例通過記錄收到Sync報文與發出Sync報文的時間戳來計算自身處理、轉發Sync報文的耗時,這些時間戳是基于中繼實例本地時鐘的。在中繼實例與Master同步前本地時鐘與Mater時鐘會存在一定頻率偏差,即便在同步后時鐘頻率依然會存在輕微誤差。而correctionField需要以Master時鐘為參考,中繼實例與Master時鐘的頻率偏差會影響到correctionFiled的精度進而影響到時間同步精度。延遲測量也使用了兩個以本地時鐘為參考的時間戳,所以本地時鐘頻率偏差一樣會影響延遲測量的精度進而影響到時間同步精度。 neighborRate為鏈路對端實例時鐘頻率與自身時鐘頻率的比例,它收到兩組Pdelay_resp和Pdelay_Resp_Follow_Up報文的間隔測量,計算公式如下:
rateRatio為實例本地時鐘與GrandMaster時鐘的頻率比例,當前實例的rateRatio通過相連Master端口的rateRatio加上當前實例時鐘與GrandMaster時鐘的偏差求得即rateRatio+=(1-neighborRate)。相連Master端口的rateRatio通過Sync報文中的cumulativeScaledRateOffset字段求得。
rateRatio會參與鏈路延遲及correctionField的計算以提高同步精度。
gPTP報文結構
報文頭:PTP報文擁有固定的報文頭,結構如下:
Announce
Signaling
gPTP-capable與gPTP-capable message interval request的Lenth字段分別為12和10。
message interval request TLV:用于請求對端實例更改發送Pdelay_Req、Sync、Announce報文的的平均間隔。
gPTP-capable TLV:用于向鏈路對端設備通告本設備支持802.1AS
Sync
Follow_Up
Pdelay_Req
Pdelay_Resp
Pdelay_Resp_Follow_Up
參考文獻
