SIP协议-02 原理讲解

本节主要讲解下SIP协议的原理,以便更好的使用SIP的协议栈。

1 SIP实现机制

SIP是一个分层结构的协议,它的行为根据一组平等独立的处理阶段来描述,每个阶段之间是松耦合的关系。

image.png

  • 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请求。

  • 用户代理客户端(UAC) 是指在 SIP 会话建立过程中主动发送会话请求的设备。例如,主叫SIP终端。当代理服务器向被叫终端发送会话请求时,它就成为用户代理客户端。

  • 用户代理服务器(UAS) 是指在 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关系图:
Transaction和Dialog关系图

4 工作流程

SIP协议在实现VoIP时,会根据实际项目的复杂度,构建不同的业务流程,以下针对几个关键的环境流程进行下介绍。

4.1 登记注册

在完整的SIP系统中,所有的SIP终端作为User Agent都应该向注册服务器登记注册,以告知其位置、会话能力、呼叫策略等信息。

通常,SIP终端开机启动或者配置管理员执行注册操作时,就向注册服务器发送注册请求消息(REGISTER),该消息中携带了所有需要登记的信息。注册服务器收到注册请求消息后向终端发送回应消息,以告知其请求消息已收到。如果注册成功,就再向终端发送“200 OK”消息。如图 1所示。

图1

4.2 建立呼叫

SIP协议采用Client/Server模型,主要通过UA与代理服务器之间的通信来完成用户呼叫的建立过程。

图2

如上图所示,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所示。

图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”状态。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值