Join定时器
Join定时器是用来控制Join消息(包括JoinIn和JoinEmpty)的发送的。
为了保证Join消息能够可靠的传输到其它应用实体,发送第一个Join消息后将等待一个Join定时器的时间间隔,如果在一个Join定时器时间内收到JoinIn消息,则不发送第二个Join消息;如果没收到,则再发送一个Join消息。每个端口维护独立的Join定时器。
Hold定时器
Hold定时器是用来控制Join消息(包括JoinIn和JoinEmpty)和Leave消息(包括LeaveIn和LeaveEmpty)的发送的。
当在应用实体上配置属性或应用实体接收到消息时不会立刻将该消息传播到其它设备,而是在等待一个Hold定时器后再发送消息,设备将此Hold定时器时间段内接收到的消息尽可能封装成最少数量的报文,这样可以减少报文的发送量。如果没有Hold定时器的话,每来一个消息就发送一个,造成网络上报文量太大,既不利于网络的稳定,也不利于充分利用每个报文的数据容量。
每个端口维护独立的Hold定时器。Hold定时器的值要小于等于Join定时器值的一半。
Leave定时器
Leave定时器是用来控制属性注销的。
每个应用实体接收到Leave或LeaveAll消息后会启动Leave定时器,如果在Leave定时器超时之前没有接收到该属性的Join消息,属性才会被注销。
这是因为网络中如果有一个实体因为不存在某个属性而发送了Leave消息,并不代表所有的实体都不存在该属性了,因此不能立刻注销属性,而是要等待其他实体的消息。
例如,某个属性在网络中有两个源,分别在应用实体A和B上,其他应用实体通过协议注册了该属性。当把此属性从应用实体A上删除的时候,实体A发送Leave消息,由于实体B上还存在该属性源,在接收到Leave消息之后,会发送Join消息,以表示它还有该属性。其他应用实体如果收到了应用实体B发送的Join消息,则该属性仍然被保留,不会被注销。只有当其它应用实体等待两个Join定时器以上仍没有收到该属性的Join消息时,才能认为网络中确实没有该属性了,所以这就要求Leave定时器的值大于2倍Join定时器的值。
每个端口维护独立的Leave定时器。
LeaveAll定时器
每个GARP应用实体启动后,将同时启动LeaveAll定时器,当该定时器超时后GARP应用实体将对外发送LeaveAll消息,随后再启动LeaveAll定时器,开始新的一轮循环。
接收到LeaveAll消息的实体将重新启动所有的定时器,包括LeaveAll定时器。在自己的LeaveAll定时器重新超时之后才会再次发送LeaveAll消息,这样就避免了短时间内发送多个LeaveAll消息。
如果不同设备的LeaveAll定时器同时超时,就会同时发送多个LeaveAll消息,增加不必要的报文数量,为了避免不同设备同时发生LeaveAll定时器超时,实际定时器运行的值是大于LeaveAll定时器的值,小于1.5倍LeaveAll定时器值的一个随机值。一次LeaveAll事件相当于全网所有属性的一次Leave。由于LeaveAll影响范围很广,所以建议LeaveAll定时器的值不能太小,至少应该大于Leave定时器的值。
每个设备只在全局维护一个LeaveAll定时器。