在讲解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协议中无论是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”状态。
定时器 | 缺省值 | 含义 |
---|---|---|
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