协议:802.1AS-2020.pdf(这个有多域的概念)
802.1AS,2020版本的-网络基础文档类资源-CSDN下载
802.1AS的SystemIdentity理解_cao849861802的博客-CSDN博客
802.1AS 延迟测量理解_cao849861802的博客-CSDN博客
802.1AS 时钟同步原理理解_cao849861802的博客-CSDN博客
内容只作为我自己的理解;红色为自我理解内容,绿色和黑色为原文
a. 使用BMCA来确定gPTP域的主PTP实例,并以该主PTP实例为根构建时间同步生成树。在这种情况下,网络是自动配置的,即利用BMCA的结果设置PTP端口状态。
b.PTP 端口状态被配置为强制使用所需的 Grandmaster PTP 实例并以 Grandmaster PTP 实例为根构建所需的时间同步生成树。
if(externalPortConfigurationEnabled == TRUE)
{
use 方式b
}
else
{
use 方式a
}
域0必须实现方法1也就是externalPortConfigurationEnabled=FALSE,因为域0是为了兼容802.1AS-2011,其他域要满足如下条件:
c) 至少有一种可能性方式a或方式b被实现。
d) 两种可能性都可以被实现。
e) 如果两种可能性都实现了,externalPortConfigurationEnabled的默认值是FALSE。(就是默认采用BMCA,和域0一样)
Table 10-2—PTP Port state definitions
PTP Port state | Description |
MasterPort | Any PTP Port, P, of the PTP Instance that is closer to the root than any other PTP Port of the gPTP communication path connected to P. PTP 实例的任何 PTP 端口 P,它比连接到 P 的 gPTP 通信路径的任何其他 PTP 端口更接近根。 |
SlavePort | The one PTP Port of the PTP Instance that is closest to the root PTP Instance. If the root is grandmaster-capable, the SlavePort is also closest to the Grandmaster PTP Instance. The PTP Instance does not transmit Sync or Announce messages on the SlavePort. 最接近根 PTP 实例的 PTP 实例的一个 PTP 端口。 如果根具有超主能力,则 SlavePort 也最接近超主 PTP 实例。 PTP Instance 不在 SlavePort 上传输 Sync 或 Announce 消息。 |
PassivePort | Any PTP Port of the PTP Instance whose PTP Port state is not MasterPort, SlavePort, or PTP 实例的任何 PTP 端口,其 PTP 端口状态不是 MasterPort、SlavePort 或 DisabledPort。 |
DisabledPort | Any PTP Port of the PTP Instance for which the variables portOper, ptpPortEnabled, and 变量 portOper、ptpPortEnabled 和 asCapable 不全为 TRUE 的 PTP 实例的任何 PTP 端口。 |
NOTE—PTP Port states are per PTP Port and per domain (i.e., per PTP Instance; see 8.1) 注意—PTP 端口状态是每个 PTP 端口和每个域(即,每个 PTP 实例;见 8.1) |
注意:在PTP端口状态为PassivePort的PTP端口上收到的同步和Follow_Up消息中包含的信息被丢弃;SiteSyncSync状态机(见10.2.7)只使用从PTP端口状态为SlavePort的PTP端口上收到的信息。
上诉图片等到看完下面的内容就能将端口的状态对上了;
在 10.3.1.1 的 BMCA(即方法 a)中,最佳主机选择信息通过 Announce 消息在时间感知系统的 PTP 实例之间交换(见 10.5 和 10.6)。 每个 Announce 消息都包含时间同步生成树矢量信息,该信息将一个 PTP 实例标识为时间同步生成树的根,如果 PTP 实例具有超主能力,则将其标识为超主级 PTP 实例。 每个 PTP 实例依次使用它收到的 Announce 消息中包含的信息以及它对自身的了解来计算它所知道的哪些 PTP 实例应该是生成树的根,如果具有超主级能力 ,超主 PTP 实例。 作为构建时间同步生成树的一部分,每个 PTP 实例的每个 PTP 端口都由与端口和整个 PTP 实例相关联的状态机分配表 10-2 中的 PTP 端口状态。
802.1AS的SystemIdentity理解_cao849861802的博客-CSDN博客
每个 PTP 实例都有一个与其关联的 stepsRemoved。 对于根 PTP 实例,当根具有超主能力时,超主 PTP 实例为0。 对于所有其他 PTP 实例,它是从根到相应 PTP 实例的路径中 gPTP 通信路径的数量;
每经过一个PTP实例则stepsRemoved+1,和GM(grandmaster)相接的slaveport处的stepsRemoved为1,因为已经走过了相连的链路所以要+1
这里说下优先级比较,就是两个PTP实例怎样比较哪个系统更优比较规则如下:
1. 先比较systemIdentity,哪个systemIdentity更小则PTP系统更优;
2.如果systemIdentity相等,则比较stepsRemoved,哪个stepsRemoved更小则PTP系统更优;
3.如果前面都相等,则比较sourcePortIdentity,哪个sourcePortIdentity更小则PTP系统更优;
4.如果前面都相等,则比较接收announce报文的portNumber,哪个portNumber更小则PTP系统更优;
这四条比较规则可以确定grandmaster,并且在比较的过程中可以确定各个端口的状态;这几个的比较过程会在向量部分解释;
一般来说靠systemIdentity的比较就能得到grandmaster,后面的比较步骤一般用来确认端口的状态也就是那三个端口类型,MasterPort,SlavePort,PassivePort。
由图10-10可知,grandmaster的端口都是MasterPort,其他时间感知系统的相同域的PTP实例(除grandmaster外)的端口只有一个SlavePort,可以有多个MasterPort,其他剩余端口都是PassivePort;
PTP 实例的不同端口的 stepsRemoved 属性在比较其他优先属性(即,systemIdentity)后进行比较,不会导致一个 PTP 端口被声明比另一个更好。 在比较 stepsRemoved 属性的端口中,stepRemoved 最小的 PTP Instance 上的 PTP Port 被分配为该 PTP Instance 的 SlavePort 端口(根 PTP Instance 没有 SlavePort)。 这个最低的stepsRemoved 也被认为是PTP 实例的stepsRemoved。 如果一个 PTP Instance 有两个或多个相同stepsRemoved ,则选择 portNumber 最小的 PTP Port 作为 SlavePort(这里和上述的比较的第4条内容一致)
这个向量表示的内容就是上面提到的优先级比较的内容
优先级向量指的就是按照一定的顺序对优先级进行比较
优先级向量的比较值越小优先级越高
PTP 实例在 Announce 消息中相互发送最佳主选择信息。 该信息以时间同步生成树优先级向量的形式构建。 时间同步生成树优先级向量为 BMCA 确定时间同步生成树和主 PTP 实例的简明规范提供了基础。 优先级向量由以下属性按以下顺序从最高有效八位字节到最低有效八位字节连接而成:
优先级向量的前两个组成部分(rootSystemIdentity和stepsRemoved)在整个 gPTP 域中都很重要; 它们通过 Announce 消息传播并通过调用 BMCA 状态机进行更新。 sourcePortIdentity为每个 gPTP 通信路径或 PTP 实例逐跳分配,因此仅具有本地意义。 它被用作时间同步生成树优先级向量之间的决胜局,否则它们是相等的。 第四个组件不在 Announce 消息中传达,而是用作 PTP 实例中的决胜局。
sourcePortIdentity这里说一下,这个值来源于8.5.2 Port identity,Port identity定义如下:
a) portIdentity.clockIdentity ;
b) portIdentity.portNumber;
也就是说sourcePortIdentity是发送announce报文的PTP实例填充的clockIdentity 和portNumber;
portPriorityVector 是当 Announce 消息的接收和任何挂起的信息更新完成时为 PTP 端口保存的时间同步生成树优先级向量:
portPriorityVector = {rootSystemIdentity : stepsRemoved : sourcePortIdentity : portNumber}
portPriorityVector 在接收到别人发给本PTP实例的announce报文的时候可以从报文中提取信息构建这个向量,这个向量和端口有关,挂在端口上,所以叫portPriorityVector
messagePriorityVector 是在收到的 Announce Message 中传送的时间同步生成树优先级向量。 对于 PTP 实例 S 在 PTP 端口 PS 上并且此端口的 portNumber为 PNS 接收到一个 Announce 消息,Announce 消息来源于PTP 实例 M 上的具有 portIdentity PM 的 MasterPort 和 rootSystemIdentity 为 RM 和 stepRemoved 为 SRM:
对于接收Announce 消息的PTP实例S和发送Announce 消息的PTP实例M
PS:PTP实例S的端口
PNS:PTP实例S的端口的portNumber
PM :PTP实例M的端口的portIdentity
RM :PTP实例M的rootSystemIdentity
SRM:PTP实例M的stepRemoved
messagePriorityVector = {RM : SRM : PM : PNS}
此 messagePriorityVector 优于 portPriorityVector 并且仅当 messagePriorityVector 优于 portPriorityVector 或announce消息已从与 portPriorityVector 相同的主 PTP Instance 和 MasterPort 传输 Announce 消息时才会替换它,即,如果以下是TRUE:
((RM < rootSystemIdentity)) ||
((RM == rootSystemIdentity) && (SRM < stepsRemoved)) ||
((RM == rootSystemIdentity) && (SRM == stepsRemoved) && (PM < sourcePortIdentity (of current master PTP Instance) )) ||
((RM == rootSystemIdentity) && (SRM == stepsRemoved) && (PM == sourcePortIdentity (of current master PTP Instance) ) && (PNS < portNumber))||
((PM.clockIdentity == sourcePortIdentity.clockIdentity (of current master PTP Instance)) &&(PM.portNumber == sourcePortIdentity.PortNumber (of the current master PTP Instance)))
即两种情况portPriorityVector =messagePriorityVector ,就是messagePriorityVector 会赋值给portPriorityVector ;
第一种情况是:接收到的messagePriorityVector 和portPriorityVector 比较如果messagePriorityVector 优与portPriorityVector 则portPriorityVector =messagePriorityVector;
第二种情况是:当自己接收到别人的messagePriorityVector后,发现portPriorityVector 是之前接收过的本端口的sourcePortIdentity ,则不管其他的比较内容直接portPriorityVector=messagePriorityVector,这里应该是为了如果选出了生成树之后,后面尽量少变动所以这么设计的;
gmPathPriorityVector 可以通过将接收到的 portPriorityVector 中的stepsRemoved 加一得到
gmPathPriorityVector = {RM : SRM + 1 : PM : PNS}
具有systemIdentity SS和clockIdentity CS的PTP实例S的systemPriorityVector是优先级向量,当SlavePort的portIdentity设置为等于传输PTP端口的portIdentity时,该优先级向量将用作在S的端口上传输的通告消息的消息优先级向量,如果选择S作为根,则该端口的状态为MasterPort:
SS :PTP实例S的systemIdentity
CS :PTP实例S的clockIdentity
systemPriorityVector = {SS : 0 : {CS : 0} : 0}
这个向量只需要知道是stepsRemoved =0,portNumber=0,sourcePortIdentity .portNumber=0得到的,来源于本PTP实例,给其他优先级向量使用。是一个表征本PTP实例的基本信息的一个向量
S 的 gmPriorityVector 是由 systemPriorityVector 向量加上每个 gmPathPriorityVector 组成的集合中最好的,其中主 PTP Instance portIdentity 的clockIdentity 不是 S 的 clockIdentity。如果 systemPriorityVector 最好,则选择 S 作为根。 当最好的 gmPathPriorityVector 是上面 PTP Port PNS 的那个,那么:
gmPriorityVector = {SS : 0 : {CS : 0} : 0}if S is better than RM, or
gmPriorityVector = {RM : SRM + 1 : PM : PNS} if S is worse than RM
上面绿色字段意思是:如果发过来的announce报文的portIdentity 的clockIdentity 不是本地S的,与本地相异的话,则比较哪个优先级向量更好,从gmPriorityVector 和所有端口的gmPathPriorityVector 中选取最好的赋值给gmPriorityVector ;
PTP Instance S 上的 PTP 端口 Q 的 masterPriorityVector 是 gmPriorityVector,其中 S 的 clockIdentity CS 代替了 master portIdentity 的 clockIdentity,Q 的 portNumber PNQ 代替了 master portIdentity 的 portNumber 和接收 PTP Port 的 portNumber:
CS :PTP实例S的clockIdentity
PNQ:PTP实例S的端口Q的portNumber
masterPriorityVector = {SS : 0 : {CS : PNQ} : PNQ}if S is better than RM, or
masterPriorityVector = {RM : SRM + 1 : {CS : PNQ} : PNQ} if S is worse than RM.
这个向量masterPriorityVector 来源于gmPriorityVector ,将gmPriorityVector 向量中的两个0分别进行替换后得到,相当于给sourcePortIdentity 和portNumber 填了值得到masterPriorityVector
如果 masterPriorityVector 优于 portPriorityVector,则 PTP 端口将是 gPTP 通信路径的 MasterPort,并且 portPriorityVector 将被更新。 PTP Port传输的Announce消息中的messagePriorityVector信息总是包含PTP Port的masterPriorityVector的前三个分量
1. 自己的PTP实例应当有自己的systemPriorityVector ,通过自己的信息填充;
2. 每个端口都有自己的portPriorityVector;这个向量的来源可能是messagePriorityVector ,因为如果messagePriorityVector 比portPriorityVector优,则messagePriorityVector 赋值给portPriorityVector;也可能来源于masterPriorityVector ,因为如果 masterPriorityVector 优于 portPriorityVector,则masterPriorityVector 赋值给portPriorityVector且端口为MasterPort
3. 当收到别的PTP实例的messagePriorityVector 的时候,与本端口的portPriorityVector比较,比较优的则更新到portPriorityVector;
4. 每个端口都有自己的gmPathPriorityVector ,这个向量是通过portPriorityVector中的stepsRemoved +1得到的也就是说portPriorityVector变化则gmPathPriorityVector 变化;
5. gmPriorityVector 来源于所有端口的gmPathPriorityVector 和systemPriorityVector 中的最优向量;如果gmPathPriorityVector 变化则gmPriorityVector 可能变化;
6. masterPriorityVector 来源于gmPriorityVector 将gmPriorityVector 向量中的两个0分别进行替换后得到,相当于给sourcePortIdentity 和portNumber 填了值得到masterPriorityVector;
masterPriorityVector 这个向量更新后则会主动的更新portPriorityVector优先级低于masterPriorityVector 的portPriorityVector;
gmPriorityVector 向量发生变化则masterPriorityVector 可能发生变化,masterPriorityVector 发生变化则portPriorityVector可能发生变化
注意:masterPriorityVector 中的sourcePortIdentity 这个变量值不在是从grandmaster获取的内容,而是本PTP实例的内容(不管本PTP实例是否为grandmaster),这个也就导致了masterPriorityVector 并不会更新数据到其他接收了grandmaster的消息的PTP端口的portPriorityVector
7. announce报文发送的时候应该是采用的是masterPriorityVector的前三个值
上面描述了最佳主时钟选举,这里开始描述端口的状态的来源
BMCA 为每个 PTP 端口分配以下 PTP 端口状态之一:MasterPort、SlavePort、PassivePort 或 DisabledPort
如果 portOper 为 FALSE(参见 10.2.5.12)、ptpPortEnabled 为 FALSE(参见 10.2.5.13)或 asCapable 为 FALSE(参见 10.2.5.1),则分配 DisabledPort 状态。
portOper、ptpPortEnabled 和 asCapable 都为 TRUE 的 PTP 端口根据时间同步生成树 portPriorityVector(参见 10.3.4 和 10.3.5)的源和相对优先级分配其 PTP 端口状态,如下所示:
a) 如果 PTP Instance 不是根,则 gmPriorityVector 的来源是 SlavePort。
这条很重要这条决定了SlavePort是哪个,从这里可以看出是gmPriorityVector 的来源,root节点只会向外发自己的优先级向量所以不可能有SlavePort,而其他PTP实例gmPriorityVector 是取本PTP实例和各个端口的gmPathPriorityVector 相互比较取最小的向量作为SlavePort所以应该按照先比rootSystemIdentity 再比stepsRemoved ,接着比sourcePortIdentity ,最后比portNumber来看哪个是SlavePort
如图10-10为啥左边的是SlavePort,因为先比两个端口gmPathPriorityVector的rootSystemIdentity 发现是相同的,再比两个端口gmPathPriorityVector 的stepsRemoved 发现也是相同的,然后再比两个端口gmPathPriorityVector的sourcePortIdentity 发现左边端口的sourcePortIdentity 中的portNumber 小于右边端口的sourcePortIdentity 中的portNumber,所以决定左边的端口作为SlavePort
b) portPriorityVector 是其 masterPriorityVector 的每个 PTP 端口都是 MasterPort。
root节点:接收到的其他的PTP实例发给本PTP实例的portPriorityVector 都没有本PTP实例的masterPriorityVector 更优,则由masterPriorityVector 规则,会将masterPriorityVector 赋值给portPriorityVector ,则如果每个端口的portPriorityVector 都等于masterPriorityVector 则本PTP实例为grandmaster,并且每个端口都是MasterPort
中继PTP实例:从其他的PTP实例收到的portPriorityVector 大于本PTP实例的masterPriorityVector ,则masterPriorityVector 赋值给收到优先级比较低的portPriorityVector 的端口的portPriorityVector ,则masterPriorityVector 等于portPriorityVector,则这个端口为MasterPort
c) 除 SlavePort 之外的每个 PTP 端口,其 portPriorityVector 已从另一个 PTP 实例或该 PTP 实例上的另一个 PTP 端口接收到是 PassivePort。
这里需要注意的是除SlavePort 端口外的其他端口,portPriorityVector 从其他PTP实例中或者另一个本PTP实例的端口上收到,不是从masterPriorityVector 来的就是SlavePort 或者PassivePort,然后去掉SlavePort 就是PassivePort