首页 理论教育SIPCGI和SIPServlets在下一代计算机网络技术

SIPCGI和SIPServlets在下一代计算机网络技术

【摘要】:为此,IETF的Network工作组提出了SIP CGI。图7.9SIP CGI模型图与JAVA Applet对应,Servlet是运行在服务器端的JAVA程序。Servlet目前应用最多的领域是用来增加Web Server的互动性,Servlet并不是专为HTTP协议设计的,IETF将其与SIP结合成为了SIP Servlet。当SIP消息到达SIP服务器时,服务器根据一定的触发规则检查是否有到达消息相关的Servlet。另外,SIP Servlets还可以自行发起新的SIP事务处理。另外,由于SIP Servlets是基于Java的扩展API,因此它也有着很好的可移植和跨平台的特性。

SIP协议由IETF(Internet Engineering Task Force)组织于1999年提出的一个在基于IP网络中,特别是在Internet这样一种结构的网络环境中,实现实时通信应用的一种信令协议。而所谓的会话(session),是指用户之间的数据交换。在基于SIP协议的应用中,每一个会话可以是各种不同的数据,可以是普通的文本数据,也可以是经过数字化处理的音频、视频数据,还可以是诸如游戏等应用的数据,应用具有巨大的灵活性。

作为一个IETF提出的标准,SIP协议在很大程度上借鉴了其他各种广泛存在的Internet协议,如http(超文本传输协议)、smtp(简单邮件传输协议)等,和这些协议一样,SIP也采用的基于文本的编码方式。

在Internet领域中,CGI一直是进行Web编程的有效手段,即使与后来大行其道的ASP、JSP相比,CGI在Web编程的灵活性上依然有着自己的优势。由于SIP与HTTP的相似性,很自然地会想到用CGI来作为开发SIP业务的工具。

具体讲,用CGI来开发SIP业务有以下几点优势:

(1)语言独立性:CGI可以用Perl、C、Visual Basic以及很多其他语言来开发,只要它们支持环境变量的获取即可。

(2)头部信息的获取:CGI可以获取HTTP请求的所有头部信息,这对SIP业务来讲同样非常重要,因为SIP的头部信息几乎包含了呼叫的全部有用信息,例如呼叫方、被叫方、主题、地址、呼叫状态等。

(3)响应的生成:CGI的另一个优势在于它除了能够生成消息体之外,可以生成响应的任何一个部分,包括头部、状态码等,而其他的一些编程机制,例如,Java servlets只是考虑消息体部分。对于SIP协议来讲,消息体并不是新业务开发中最重要的部分,因此能否生成响应的所有部分就显得尤为关键

(4)组件重用:由于SIP协议重用了很多HTTP的语法,因此针对SIP开发的CGI可以重用HTTP CGI的很多有用工具。

(5)熟悉的开发环境:很多Web程序员对CGI都相当熟悉,这也有助于Web程序员转到SIP的开发中来。

(6)方便的扩展性:由于CGI是接口而不是语言,它能够很容易的被扩展和重用于类似SIP这样的协议。

为此,IETF的Network工作组提出了SIP CGI。尽管SIP与HTTP在基本语法和请求响应模型上非常类似,但它们之间也存在着很多区别,例如,SIP可以将一个请求转发为多个请求,可以支持注册等附加功能,这些都是HTTP所没有的。SIP与HTTP的这些区别导致了SIP CGI的设计必然也与HTTP CGI有所不同,例如,SIP CGI允许脚本执行一些特殊的消息功能,SIP CGI还引入了一种持续性模型,允许脚本在消息交换时保持控制,而HTTP CGI并没有这些功能。

SIP CGI的基本模型如图7.9所示。以呼叫转发业务为例,服务器接收到客户端的请求之后,要通过CGI程序来决定何时、向何处转发多少请求以及何时返回给客户端一个响应。CGI程序还可以更改和创建SIP消息的头部信息,这也使得SIP增值业务的实现变得更加灵活。

图7.9 SIP CGI模型图

与JAVA Applet对应,Servlet是运行在服务器端的JAVA程序。Servlet目前应用最多的领域是用来增加Web Server的互动性,Servlet并不是专为HTTP协议设计的,IETF将其与SIP结合成为了SIP Servlet。

Servlets是用Java编写的、协议和平台独立的服务器端组件,它采用“请求/响应”模式,提供了一种基于Java的网络服务器的解决方案,可以动态地扩展支持Java的网络服务器。如同Web业务中的HTTP Servlets是HTTP CGI的替代品一样,对于SIP业务开发者来讲,SIP Servlets也是除了SIP CGI之外的一个很好的选择。

IETF组织于1999年9月提出了SIP Servlets的草案,作为SIP服务器的Java扩展API,SIP Servlets可以扩展SIP服务器的功能、控制SIP消息的处理,从而实现更为丰富的SIP业务。

IETF对SIP Servlet作了如下定义:SIP Servlet是与SIP服务器交互的,按照某种方式控制或影响呼叫流程的JAVA代码。当SIP消息到达SIP服务器时,服务器根据一定的触发规则检查是否有到达消息相关的Servlet。如果有则把代表SIP消息的对象传送到SERVLET。通过这些对象,Servlet可以访问SIP消息中的任何部分,并决定如何响应收到的消息。

利用SIP Servlets扩展SIP业务的基本模型如图7.10所示,可以看出它与SIP CGI的模型非常相似。当呼叫请求到达SIP服务器后,由服务器将SIP消息封装成SIP对象,发送给SIP Servlets,SIP Servlets可以读取或更改SIP头部信息、消息体、状态行等,通过对SIP对象的控制,SIP Servlets便能够决定如何响应及转发请求。另外,SIP Servlets还可以自行发起新的SIP事务处理。

图7.10 SIP Servlet基本模型图

Servlets技术与CGI相比,其最大的优势在于Servlets对于客户端来的多个请求只需创建一个进程来处理,当Servlets被客户端的第一个请求激活后,将继续运行于后台,每个后来的请求只会产生一个线程而不是进程,因此多个客户能够在同一进程同时被服务。而CGI针对每个请求都会分别创建一个进程,显然后者的开销要大得多,并且在同一个进程中不能服务多个客户。另外,由于SIP Servlets是基于Java的扩展API,因此它也有着很好的可移植和跨平台的特性。(www.chuimin.cn)

SIP Servlet API主要运行在SIP应用服务器上,具有以下特性:

(1)SIP应用可以实现SIP体系中的代理服务器功能、用户代理功能。

(2)SIP Servlet具有指示SIP CONTAINER生成新的请求消息、转发请求消息、生成新的响应、转发响应的功能。

(3)利用SIP Servlet API生成应用,只需要关注SIP消息中关键的字段,例如To,From,Request-URI,Contact,不需要考虑复杂的协议参数,例如:Cseq,Call-ID和Via等消息头,这些任务都由SIP CONTAINER处理。

(4)同一个SIP消息可以激活多个SIP应用,SIP Container能够根据触发规则来处理它们之间的冲突。

(5)支持SIP应用由第三方开发,规范中定义了业务开发人员与业务管理人员交互的配置描述符(deployment descriptor)。

图7.11 SIP Servlet继承关系图

(6)SIP服务器可以支持跨多种协议的应用,例如,SIP协议和HTTP协议等。

图7.11是Servlet类与SIP Servlet类的继承关系图,任何Servlet要成为SIP Servlet,都必须继承SIP Servlet类。

目前JAVA Servlet最大的应用是HTTP Servlet,SIP Servlet的设计理念来源于HTTP Servlet,它们都继承了Servlet的特点,它们有很多相似之处,主要包括以下几点:

(1)两者的运行机制都是当服务器收到信令消息后,根据一定的触发规则检查是否有与消息相关的Servlet,并激活相应的Servlet。

(2)生命周期管理都采用了Servlet的生命周期管理机制。

(3)配置描述符(deployment descriptor)的概念是一致的。

(4)应用的组成一致,HTTP Servlet应用主要由HTTP Servlet组成,SIP Servlet应用主要由SIP Servlet组成。

(5)CONTAINER的概念是一致的。

它们之间区别是HTTP协议与SIP协议的区别形成的,SIP协议要比HTTP协议复杂,因此SIP Servlet的功能要比HTTP Servlet复杂,HTTP Servlet只需要接收异步的请求,以及发送响应;SIP Servlet的功能就复杂多了,因为它通常充当代理服务器和用户代理功能,因此它可以发送请求和响应,以及接收异步的请求和响应;SIP Servlet对于信令消息到Servlet的触发规则更加复杂,并且需要动态建立。

SIP Servlet与HTTP Servlet之间并不相互排斥,它们可以同时运行在一个应用中,SERVLET引擎根据收到的消息类型触发不同类型的Servlet,这种方式对于实现语音与Internet相结合的业务是很有意义的。

SIP CONTAINER又称为SIP Servlet引擎,SIP Container属于应用服务器的一部分,SIP Servlet接收和发送SIP消息都要通过SIP Container,SIP Container具有对SIP Servlet的生命周期进行管理的功能。SIP Cotainer的运行机制如下:它负责监听SIP消息的端口号,当收到SIP消息后,它决定激活哪个应用以及激活的顺序。

SIP SERVLET应用就是利用SIP Servlet API生成的业务,它主要由Servlet组成,此外还有JAVA类文件和应用运行所需要的资源(例如语音文件等)。