SIP平台的设计与实现白冰,马跃北京邮电大学计算机系,北京(100876)E-mail:bbpatience@摘要:SIP(Session Initiation Protocol)是IETF提出的IP电话信令协议,将在NGN中得到广泛的应用。
在VOIP蓬勃发展的今天,越来越多的人舍弃H.323,而将SIP作为会话建立的协议。
随之而来,越来越多的商家设计出自己的平台来满足需求。
本文在简要介绍SIP 协议后,着重介绍SIP平台的基本功能的设计与实现。
关键词:SIP代理服务器,SIP用户代理,SIP平台,事务1 引言会话初始化协议(SIP,Session Initiation Protocol)是IETF提出并主持研究的一个支持多媒体会话的信令控制协议。
SIP 基于Web协议即超文本传输协议(HTTP ,Hypertext Transfer Protocol )。
与HTTP 协议一样,SIP也是一个请求/应答协议。
它最有希望成为将来基于IP电话业务的呼叫建立信令,而且SIP已被3GPP用作移动网络中的多媒体应用协议。
SIP分为用户代理(UA ,User Agent)和 SIP 服务器(SIP Server),而SIP服务器又分为代理服务器(SIP Proxy)、重定向服务器(Relocation Server)和注册服务器(Registrar),以及位置服务器(Location Server)[1]。
所谓SIP平台,是将SIP的这些服务器功能逻辑上融为一体,来满足用户(即UA)的各种需求。
2 SIP协议简介2.1 SIP 发展概述SIP协议是由IETF的MMUSIC工作组制定的,1999年提出第一版本RFC2543,2002年提出版本RFC3261。
SIP是一个基于文本的作用于应用层的多媒体会话信令协议。
它提供了在会话建立和终结过程中用户定位、用户可用性、用户能力、会话建立及管理等五个方面的功能。
这些会话包括IP电话、分布式多媒体、多媒体会议等。
SIP并不是一个垂直型通信系统,它必须和其它协议(如RTP、SDP等)相结合来共同构建一个完整的IP网络多媒体通信系统(比如用RTP来传输语音流,用SDP来协商双方的需求[2],)。
但它又不依赖于其它任何协议,在功能上它是独立的,是一个开放的分布式协议。
2.2 SIP网络组件SIP是基于文本的客户服务器协议,客户端发起请求,服务器进行响应。
SIP协议中定义了两种基本实体:用户代理(UA ,User Agent)和 SIP 服务器(SIP Server)。
图1所示为SIP体系结构框图。
-1-注册服务器位置服务器用户代理代理服务器1代理服务器2图1 SIP体系结构框图用户代理包含两种功能实体:用户代理客户端(UAC,User Agent Client)和用户代理服务器端(UAS,User Agent Server)。
UAC负责发起SIP呼叫请求,而UAS响应呼叫请求。
SIP服务器又分为三种类型:代理服务器(SIP Proxy)、重定向服务器(Relocation Server)和注册服务器(Registrar)。
代理服务器处于UAC和UAS中间,为SIP消息的传输提供了路由功能,负责转发SIP 用户的呼叫请求和响应消息。
重定向服务器接收请求,它向呼叫者发送响应以指示被呼叫用户的地址。
这使得呼叫者可以直接联系在下一服务器上被呼叫方的地址。
通常重定向服务器提供地址解析服务。
注册服务器接收终端的注册请求,记录终端的SIP URI和IP地址。
用户终端在启动后必须向SIP注册服务器注册,用于记录其当前位置信息。
SIP注册服务器机制为SIP客户端提供了充分的移动性支持。
另外,在实际的SIP系统中,位置服务器(Location Server)也是必不可少的,它存储并向用户返回可能的位置信息,注册服务器接收到位置信息时会立即将这些信息上载到位置服务器。
位置服务器用来向客户提供代理服务器和重定向服务器的位置,作为一个全局的数据库,作用就像DNS,它的访问和接入可以是非SIP的,比如LDAP。
2.3 SIP代理服务器由于SIP平台的核心是SIP代理服务器的功能实现,有必要对SIP代理服务器做一些详述。
根据对事务处理方式的不同,SIP代理服务器分为有状态代理服务器(stateful proxy server)和无状态代理服务器(stateless proxy server)两类。
有状态与无状态代理服务器的区分是SIP适应IP网络现状的一种有效方法。
有状态服务器经常用于提供丰富的应用平台,而无状态服务器则适用于需要高速转发性能的网络[3]。
(本文只涉及到有状态代理服务器,对其稍加修改即可实现无状态代理服务器)。
-2-1) 有状态代理模式:有状态代理服务器要在路由过程中存储通信事务信息,直至这个事务结束并被释放为止。
每个有状态代理服务器均有一个服务事务模块与多个客户事务模块(CT),它们被一个更高层的称为代理内核(Proxy Core)的模块管理。
其结构如图2所示。
2)CT: Client Transaction ST: Server Transaction图2 有状态代理服务器结构图3) CT与ST是代理服务器事务层的主要功能模块,它们分别完成UAC和UAS的功能。
一个ST对应多个CT,当一个ST接收到一个请求后,它通过高层的代理内核产生派生代理,再由派生代理去调用多个CT转发该请求,这样一个代理服务器可以向用户的多个注册地址转发该请求。
无状态代理模式:无状态代理服务器不包括四层结构体系中的事务层。
无状态代理服务器直接从传输层接收SIP消息并对消息进行路由,它不存储与事务有关的任何信息。
3 SIP平台的实现3.1 SIP平台的体系结构SIP平台结合了注册服务器、代理服务器、重定向服务器的功能,它包含了五个相对独立的模块,如图3所示。
-3-图3 SIP平台体系结构(1) TLP---Transport Layer Processing:即传输层处理模块,与底层IP进行交互。
负责端到端的连接与通信。
可以采用TCP或者UDP进行数据传输。
(2) Syntax and Encoding Layer: 即语法编码层。
SIP消息采用基于UTF-8(RFC2279)的文本编码格式,语法信息采用扩充的巴柯斯范式(BNF)形式描述,该层的主要功能完成SIP请求与响应消息的构造与解析,并丢弃那些存在语法错误的消息。
(3) Transaction Layer:即事务层。
它是SIP层次结构的核心层,负责会话的控制与管理,主要内容是保存事务的状态、匹配请求和响应,以及在传输层为不可靠传输时,提供必要的超时重传处理。
(4) SFP(State Full Processing):即有状态代理服务模块。
它是实现代理服务器的功能模块。
SFP是一个事务用户,它利用事务层为每一个接收到的新的请求创建一个服务端事务。
任何请求的重复都是由这个服务端事务来处理。
当收到一个请求时,它会先验证该请求,然后决定并发送到每一个请求的目的,最后接收其相应的响应。
它是平台完成路由选择和发送的核心。
(5) Address Resolution:即地址处理模块。
它将从SFP模块得到的域名发往DNS进行查询,并返回其IP地址。
3.2 SIP平台的具体实现由于SIP平台要同时处理大量的SIP消息,因此在采用消息队列和多线程来保证服务器的处理能力。
各模块都有自己的线程,在一直检查自己的消息队列中是否收到底层送上来-4-的信息(在Linux中用系统调用select()),若有则进行本模块的处理,最后把结果或消息发送到上一层的消息队列。
3.2.1 传输层和语法编码层:之所以要将两层一起说,是因为二者结合比较紧密。
SIP平台初始化时,TLP创建接收、发送和解析三个线程,以及接收和发送两个FIFO队列。
UDP和TCP可以作为插件加入到TLP模块。
IP将收到的数据包放入接收队列,TLP则按照先进先服务的原则对接收队列的消息一一进行处理。
TLP将消息(通常为字符串)送到解析线程(应属于语法编码层)进行消息解析,最后得到一个SIP消息的结构体,放入上层的接收队列。
发送SIP消息与该过程相反,在此不赘述。
SIP消息分为标题行(命令行或状态行)、头域、消息体三部分,而SIP平台对消息体是透明的,SIP平台并不像UA会对消息体进行解析。
语法编码层主要由SIP标题行、相关头域的构造与解析函数构成。
SIP基于文本,消息的构造与解析比较简单。
OSIP提供了一套库函数来完成此工作。
3.2.2 事务层事务层由CT与ST两个部件组成分为ICT(Invite Client Transaction)、NICT(Not ICT)、IST(Invite Server Transaction)、NIST(Not IST)四种状态机,程序设计中要按RFC3261的要求,分别设计相应函数。
传输层处理函数接收到SIP请求消息时,将该请求交给ST模块,如果是第一次接收到该事务,则要对事务进行记录同时上交上层STP,STP处理后交给CT处理模块。
如不是第一次,则说明是重传的请求,直接交给CT模块按SIP请求的类型,分别调用ICT,NICT 状态机进行处理,状态机函数将该SIP请求加入发送队列,经传输层发送线程发出。
当接收到响应消息时,CT模块根据该响应所对应的请求类型调用响应状态机函数,根据响应所对应的请求类型调用响应状态参数,然后再将该响应上交给SFP,SFP处理后再将该响应下传给ST模块,加入发送队列。
调用每个状态函数时,都要启动该事务状态机的超时、KILL处理进程,实现对SIP 事务处理进程的管理。
如果传输层采用UDP传输,还要启动事务重传进程,以保证SIP消息的正确和可靠传输。
3.2.3 SFP层:SFP的核心是有状态代理服务器。
实现过程如下:(1) 代理处理响应。
如果代理服务器接收到响应消息,首先要与已存储的请求消息进行匹配,取消不匹配的响应,然后对成功响应再判断是临时响应还是最终响应。
如是临时响应,代理服务器不转发,退出代理程序。
如是最终响应,再判断是对INVITE的响应还是对其它请求的响应,如果收到INVITE请求的响应,则取消INVITE的重发,然后对响应消息的Via头域进行解析,按与请求相反的路径向下一站转发,并从响应消息的Via域中去掉本代理服务器的地址行。
-5-(2) 代理处理请求。
对于收到的请求消息,代理主进程判断该请求是本域请求还是远程请求。
如果是本域请求,则查询用户注册服务器或定位服务器,找出目的用户所注册的SIP地址组Address(即最终用户的逻辑地址与他的联系地址的动态映射关系表),为目的用户的每一个联系地址派生一个代理进程和一个超时处理进程,由派生代理进程调用事务层CT模块的请求进程,向地址组中的每一地址转发该请求,同时,启动响应、出错响应进程,对请求事务过程进行管理。