sip协议的超时机制

0、前言:

在讲解sip协议的超时机制之前,先简单地介绍一下sip协议中的message、dialog、session 和 transaction

(1)Messages(消息)   
       消息是在服务器和客户端之间交换的独立文本,有两种类型的消息,分别是请求(Requests)和响应(Responses)。

(2)Dialog(对话)   
       
对话是两个UAs(user agent) 之间持续一段时间的端到端(peer-to-peer)的SIP 关系.。一个对话由一个Call-ID、一个local tag 和 一个remote tag来标识,对话过去也叫做 "call leg"。dialog的建立是收到UAS的响应(To tag)时开始建立的。收到180响应时建立dialog叫做早期对话(early dialog),收到2XX的应答开始才是真正的dialog建立。

       当UA发送初始INVITE请求后,只有接收到失败响应才有可能建立DIALOG。通过Callid、From域中的tag参数和To域中的tag参数来唯一标识DIALOG。 From域中的参数由主叫添加,To域中的参数由被叫添加。

(3)Transaction(事务)  
       事务发生于客户端和服务器端之间,包含从客户端发出请求给服务器,到服务器响应给客户端的最终消息(non-1xx message)之间的所有消息.。如果请求是一个"Invite"消息,并且最终的响应是一个non-2xx消息,那么该事务包含一个"Ack"响应消息。如果服务器的响应是一个2xx消息,那么,随后的ACK是一个单独的事务。

(4)Session(会话) 
       session是媒体交换之后才建立的,具体而言就是通过offer/answer方式交换sdp的媒体。session的建立可以使INVITE-200 也可以是200-ACK。这要看媒体的交换发生的时间。 具体来说,INVITE 中的消息体用sdp语言来描述自己可处理的媒体类型,200OK中 带回UAS端可处理的媒体类型,这个时候媒体交换就算是完成了,也就是session建立起来了。

下面的示意图清晰的显示了Transaction和Dialog之间的关系:

sip协议的超时机制_第1张图片

 

1、sip协议超时机制

       SIP协议中无论是Client端还是Server端,在定时器和消息重发的处理上,可分为与INVITE相关的Transaction 和与INVITE不相关的Transaction。RFC3261中定义了两个基准定时器 T1=500ms 和 T2=4s。

无论是可靠传送还是不可靠传送,当实体发送消息(包括请求或响应消息)后,都会启动一个64 倍的T1定时器(计时器B、H、F),当此定时器终结时,如果没有收到相应的响应或确认消息,实体将会清掉相关的Transaction。

(1)INVITE客户端事务

当SIP实体(包括UA和Proxy)发送INVITE消息后,无论是可靠传送还是不可靠传送,实体都会启动定时器B(Timer B=64*T1,如果T1=500ms,则此定时器为32S)。

在不可靠传送的情况下,实体同时会启动定时器A(初始值为T1),如果T1时间间隔后没有收到任何响应消息,实体将会重发INVITE消息,之后的间隔分别为2T1、4T1、8T1、16T1、32T1,在此期间,如果收到响应消息,实体将会终止重发行为。

当定时器B(Timer B=64T1)终结时,如果实体仍然没有收到响应消息,实体将终止该呼叫请求,客户端不产生ACK。

当客户端收到300~699的应答时,客户端需要产生ACK请求。(ACK请求必须和原始请求发送到相同的地址、端口和transport),并启动定时器D(缺省值是在非可靠通讯上至少是32秒,在可靠通讯上是0秒)

(2)INVITE服务端事务

当被叫用户应答时,被叫侧UA(UAS)将会向对端发送200消息,表示对INVITE消息的确认,主叫侧UA(UAC收到200消息)后,将会发送ACK消息,表示收到200消息。因此,对Server侧来讲,当发送200消息后,为了等待ACK消息,将会启动定时器H(Timer H=64T1)。

在不可靠传送的情况下,Server还会启动T1定时器(计时器G),如果T1终结,没有收到ACK消息,UAS将会重发200 消息。以后的间隔分别为2T1,4T1,8T1,当时间达到T2(T2=8T1)后,后续重发的间隔将一直为T2。

当定时器H(Timer H=64T1)终了时,如果实体仍然没有收到ACK确认消息,实体将会终止该呼叫请求。

其它的最终响应消息,消息的重传和定时器保护也与200消息的相同。

(3)非INVITE客户端事务

当实体发送INFO或BYE等消息后,实体将会启动定时器F(Timer F=64T1)。如果定时器F终了时,没有收到最终响应消息,实体将会清掉Transaction。

在不可靠传送的情况下,实体同时启动定时器E(初始值T1)。如果在此期间没有收到1XX临时响应消息,实体将会以MIN(2(4,8..)*T1,T2)的间隔重发,直到间隔达到T2(4秒)。如果没有收到任何响应消息,实体重发的行为将与INVITE消息相关的最终响应行为(Server)相同。

ACK只有在响应非200 OK时才和INVITE一样,否则与INVITE不为同一事务,只属于同一个对话。

(4)非INVITE服务端事务

当收到一个不是INVITE或者ACK请求的时候,服务端的状态初始化为"Trying"状态,在此状态下,任何重发的请求都会被忽略。当服务端发送一个1XX的临时应答后,进入"Proceeding"状态;在"Proceeding"状态下收到一个重发的请求,服务端将发送一个最近的1XX临时应答;如果在"Proceeding"状态下,服务端发送一个终结应答(应答码是200—699),那么服务端就进入“Completed”状态。

当服务端进入"Completed"状态,对于不可靠传输来说,必须设定一个定时器J=64*T1秒;对于可靠传输来说,设定为0秒(即:不设定定时器)。在“Completed”状态下,收到一个重发的请求时,服务端需要将上一次的终结应答重新发送。

服务端事务保持“Completed”状态知道定时器J触发,当定时器J触发后,服务端事务必须进入“Terminated”状态。

 

2、SIP协议中的各类定时器解析

定时器   缺省值 含义
T1 500 ms 一个估计的循环时间(RTT)
T2 4 秒 非 INVITE 请求和 INVITE 响应的最长重传时间间隔
T4 5 秒 网络在客户端和服务端事务中传输消息可能的时间
定时器 A 最初为 T1 INVITE 请求重传时间间隔(仅适用于不可靠传输,如:UDP)
定时器 B 64*T1 INVITE 事务超时定时器

 

定时器 D

大于等于 32 秒(对于 UDP)

 

响应重传的等待时间

0 秒(对于 TCP 和 SCTP)
定时器 E 最初为 T1 非 INVITE 请求重传时间间隔(仅适用于不可靠传输,如:UDP)
定时器 F 64*T1 非 INVITE 事务超时定时器
定时器 G 最初为 T1 INVITE 响应重传时间间隔
定时器 H 64*T1 ACK 接收的等待时间

 

定时器 I

T4(对于 UDP)

 

ACK 重传的等待时间

0 秒(对于 TCP 和 SCTP)

 

定时器 J

64*T1(对于 UDP)

 

重传非 INVITE 请求的等待时间

0 秒(对于 TCP 和 SCTP)

 

定时器 K

T4(对于 UDP)

 

响应重传的等待时间

0 秒(对于 TCP 和 SCTP)

参考:

https://www.jianshu.com/p/84d7289a4d3b
https://blog.csdn.net/daitu3201/article/details/80831429

你可能感兴趣的:(GB28181,sip协议)