本节主要讲解下SIP协议的原理,以便更好的使用SIP的协议栈。
1 SIP实现机制
SIP是一个分层结构的协议,它的行为根据一组平等独立的处理阶段来描述,每个阶段之间是松耦合的关系。
- SIP的最低层是其语法和编码。其编码使用扩充的背景 - 诺尔表单语法(BNF)指定。
- 第二层是传输层。它定义了客户端如何发送请求和接收响应,以及服务器如何通过网络接收请求和发送响应。所有SIP元素都包含传输层。
- 接下来是交易层。事务是由客户机事务(使用传输层)发送到服务器事务的请求,以及从服务器事务发送回客户机的对该请求的所有响应。用户代理客户端(UAC)完成的任何任务都使用一系列事务进行。无状态代理不包含事务层。
- 交易层上方的图层称为交易使用者。除了无状态代理,每个SIP实体都是事务用户。
2 SIP网络元素
使用SIP建立通信网络,需要有一些实体的支持,本节主要介绍下这些实体都有哪些。在SIP中,每个网络元件由类似地址的 SIP URI (统一资源标识符)标识。
2.1 用户代理
用户代理(UA,User Agent)也称SIP终端,是指支持SIP协议的多媒体会话终端。一般使用支持SIP协议的路由器作为SIP UA。UA 包括用户代理客户端(UAC,User Agent Client)和用户代理服务器(UAS,User Agent Server)。一般说的 UA 均是指二者的总称,因为在一次呼叫中,一个 SIP 终端既要处理 SIP 请求,又要发起SIP请求。
例如:SIP基于客户端 - 服务器架构,其中呼叫者的电话充当发起呼叫的客户端,并且被叫者的电话充当响应呼叫的服务器。
2.2 代理服务器
代理服务器(Proxy Server)的作用就是传递主叫 UA 发送的会话请求到被叫 UA,然后将被叫 UA的响应传递回主叫 UA,它相当于主叫 UA 和被叫 UA 之间传递会话消息的路由。
- 基本上代理服务器的作用就像一个路由器。
- 它具有一些智能来理解SIP请求并且在URI的帮助下向前发送它。
- 代理服务器位于两个用户代理之间。
- 源和目标之间最多可以有70个代理服务器。
- 代理服务器接收到主叫UA的会话请求后,先在位置服务器查找UA的位置及主叫和被叫UA之间的呼叫策略信息,找到相应的UA并允许呼叫的UA,代理服务器才会向被叫UA发送会话请求。
有两种类型的代理服务器:
- 无状态代理服务器(stateless) - 它仅转发接收的消息。这种类型的服务器不存储呼叫或事务的任何信息。
- 状态代理服务器(stateful) - 此类型的代理服务器会跟踪收到的每个请求和响应,如果需要,将来可以使用它。如果没有来自另一方的响应,它可以重传请求。
2.3 重定向服务器
重定向服务器(Redirect Server)用来指示客户端连接的新地址,客户端直接再次向这些新的地方发起请求。不接收或者拒绝呼叫,主要完成路由功能。
比如,主叫UA呼叫被叫UA,当重定向服务器收到主叫UA发送的会话请求消息后,查找被叫UA的位置信息,然后将其返回给主叫UA,使主叫UA重新向该位置发起会话请求。此位置可以是被叫UA的位置,也可以是一个代理服务器的位置。接下来主叫UA如同直接呼叫被叫UA或者向代理服务器呼叫的流程一样。
2.4 位置服务器
位置服务器(Location Server)是为代理服务器和重定向服务器等提供UA信息的设备,只有代理服务器或重定向服务器可以联系位置服务器。
位置服务器记录了注册服务器接收到的UA的信息。二者可以独立存在,也可以作为逻辑组件存在于同一台服务器上。
2.5 注册服务器
注册服务器(Registrar Server)接受来自用户代理的注册请求。它帮助用户在网络中验证自己。它将URI和用户的位置存储在数据库中,以帮助同一域中的其他SIP服务器。
注册的内容(如本地号码等信息)一般是存储在位置服务器上,供后续查询使用,二者都是逻辑组件,一般存在于同一台服务器上,或者同域的一个数据库内。
3 SIP中的几个重要概念
本节主要介绍下SIP开发过程中,遇到的几个重要概念。
3.1 Messages(消息)
消息是在服务器和客户端之间交换的独立文本,有两种类型的消息,分别是请求(Requests)和响应(Responses)。
3.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.3 Transaction(事务)
事务发生于客户端和服务器端之间,包含从客户端发出请求给服务器,到服务器响应给客户端的最终消息(non-1xx message)之间的所有消息.。如果请求是一个"Invite"消息,并且最终的响应是一个non-2xx消息,那么该事务包含一个"Ack"响应消息。如果服务器的响应是一个2xx消息,那么,随后的ACK是一个单独的事务。
3.4 Session(会话)
Session是媒体交换之后才建立的,具体而言就是通过offer/answer方式交换sdp的媒体。session的建立可以使INVITE-200 也可以是200-ACK。这要看媒体的交换发生的时间。 具体来说,INVITE 中的消息体用sdp语言来描述自己可处理的媒体类型,200OK中 带回UAS端可处理的媒体类型,这个时候媒体交换就算是完成了,也就是session建立起来了。
以下是Transaction和Dialog关系图:
4 工作流程
SIP协议在实现VoIP时,会根据实际项目的复杂度,构建不同的业务流程,以下针对几个关键的环境流程进行下介绍。
4.1 登记注册
在完整的SIP系统中,所有的SIP终端作为User Agent都应该向注册服务器登记注册,以告知其位置、会话能力、呼叫策略等信息。
通常,SIP终端开机启动或者配置管理员执行注册操作时,就向注册服务器发送注册请求消息(REGISTER),该消息中携带了所有需要登记的信息。注册服务器收到注册请求消息后向终端发送回应消息,以告知其请求消息已收到。如果注册成功,就再向终端发送“200 OK”消息。如图 1所示。
4.2 建立呼叫
SIP协议采用Client/Server模型,主要通过UA与代理服务器之间的通信来完成用户呼叫的建立过程。
如上图所示,Telephone A需要呼叫电话Telephone B,两台路由器作为SIP终端(UA)。当Telephone A拨完电话Telephone B的号码后,Router A向Proxy Server发送会话请求消息。Proxy Server通过查找Telephone B的号码所对应的信息,向Router B发送会话请求消息。Router B收到请求后,如果Telephone B可用,就向Proxy Server发送应答,并使Telephone B振铃。Proxy Server收到应答后,向Router A发送应答消息。这里所说的应答包括:两个临时应答(100 Trying 和180 Ringing)和一个成功应答(200 OK)。
这个例子是一种简单的应用,只使用了一个代理服务器。在复杂的应用中,可以有多个代理服务器,以及注册服务器。
4.3 重定向呼叫
SIP重定向服务器收到会话请求消息后,不是转发会话请求消息,而是在回应消息中告知被叫SIP终端的地址。主叫终端从而重新直接向被叫终端发送会话请求消息。被叫终端也将直接向主叫终端发送应答消息。呼叫过程的消息交互如图 4所示。
这是比较常见的一种应用。从原理上来说,重定向服务器也可以向主叫终端回复一个代理服务器的地址,接下来的呼叫过程就和使用代理服务器的呼叫过程一样。
5 SIP超时机制
SIP协议中无论是Client端还是Server端,在定时器和消息重发的处理上,可分为与INVITE相关的Transaction 和与INVITE不相关的Transaction。RFC3261中定义了两个基准定时器 T1=500ms 和 T2=4s。
无论是可靠传送还是不可靠传送,当实体发送消息(包括请求或响应消息)后,都会启动一个64 倍的T1定时器(计时器B、H、F),当此定时器终结时,如果没有收到相应的响应或确认消息,实体将会清掉相关的Transaction。
5.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秒)
5.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消息的相同。
5.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不为同一事务,只属于同一个对话。
5.4 非INVITE服务端事务
当收到一个不是INVITE或者ACK请求的时候,服务端的状态初始化为"Trying"状态,在此状态下,任何重发的请求都会被忽略。当服务端发送一个1XX的临时应答后,进入"Proceeding"状态;在"Proceeding"状态下收到一个重发的请求,服务端将发送一个最近的1XX临时应答;如果在"Proceeding"状态下,服务端发送一个终结应答(应答码是200—699),那么服务端就进入“Completed”状态。
当服务端进入"Completed"状态,对于不可靠传输来说,必须设定一个定时器J=64*T1秒;对于可靠传输来说,设定为0秒(即:不设定定时器)。在“Completed”状态下,收到一个重发的请求时,服务端需要将上一次的终结应答重新发送。
服务端事务保持“Completed”状态知道定时器J触发,当定时器J触发后,服务端事务必须进入“Terminated”状态。
|