引言
SIP (Session Initiation Protocol)称为会话初始协议[1][4],是一个与HTTP和SMTP类似的、基于文本的协议,SIP独立于传输层协议和其它会话控制协议,可以与其他协议(如RSVP,RTSP等)一起构建多媒体通信系统如智能家居网络、视频会议[2]等。
NAT/防火墙(FW)为私网提供统一的对外出口,从而隐藏内部网络的拓扑结构,提高了私网的安全性[3]。但这也给私网的远程控制应用带来很大的麻烦。对于NAT,其功能是在公网IP地址及端口和私网IP地址及端口间进行映射,工作在传输层,它只对TCP/UDP包头中的地址、端口进行修改,而SIP协议需要在信令消息中内嵌IP地址和端口号[5],这些地址、端口在应用层上才可见,因此NAT不会对其中的地址信息进行修改,导致信令消息中的IP地址和端口不能指向正确的地址,因而通信也不能正常进行;对于FW,对公网打开的端口通常是固定的(Fw不会在运行过程中动态的打开或者关闭这些端口),且数目有限。而基于SIP构建的私网的远程控制应用要求FW不但能够提供对信令协议的代理功能,而且要求FW能够在通信过程中动态的打开一些端口进行媒体流数据的交流,现有的FW难以满足这个要求。
鉴于上述原因,本文提出了“SIP应用层网关”技术,并将其应用于网络通信中来建立相对合理、完善的SIP网络,以解决SIP私网远程控制中穿越NAT/FireWall的难题。
SIP私网穿越NAT/防火墙方法分析
由于所有NAT和Firewall都是对于TCP/IP层以下进行处理和过滤的,而SIP是应用层控制信令协议,SIP与下面的传输层和网络层协议无关。所以必须采用其他的途径来解决基于SIP的私网穿越NAT/防火墙这一问题,主要有以下不同的解决方案:1.UpnP(通用即插即用);2.TURN(Traversal Using Relay NAT);3.STUN(Simple Traversal of UDP Through network Address Translators);4.ALG(Application Layer Gateway,应用层网关)。
其中前3种都是由SIP Client(包括UA和Proxy)通过某种手段或协议在INVITE之前获取自己的公网地址和端口。需要SIP Client提供额外支持,并且也不适应所有的NAT方式。ALG(Application Layer Gateway)[2]适应所有NAT方式,并不需要SIP Client做任何额外的支持。它对Application层的SIP信令进行处理和修改,从而做到透明转换地址。该思想的基本思路是通过在NAT/FW中加入协议认知(Protocol Awareness)能力,使NAT/FW能够在SIP信令消息通过时修改其内容中的地址信息,ALG修改SIP消息里面的SIP地址和端口,并为分配给呼叫双方的地址和端口进行绑定,这样,以后的媒体流数据能够通过NAT/FW指定的端口穿过。本文主要讨论的是基于SIP的应用层网关方法。
SIP应用层网关原理分析
“SIP应用层网关”是为解决基于SIP的私网控制应用穿越NAT/FW的问题,实现私网内的SIP用户代理与公网上的SIP用户代理之间的互连而提出的解决方案,从功能上来说,SIP应用层网关是一种为私网内的SIP终端提供连接到公网的代理功能的SIP设备或软件。下文中提及的“应用层网关”和ALG(Application Level Gateway)都是指SIP应用层网关。
为了实现SIP应用层网关的功能,同时保持与已有SIP应用的兼容性,必须把ALG设计成一个SIP兼容的应用。但是对于私网上和公网上的SIP应用而言,ALG提供的功能并不完全相同:对于私网的SIP终端,SIP应用层网关的角色是一个SIP意义上的代理服务器(Proxy),它不但需要为通往公网上的呼叫提供代理,同时还需要为私网内部不同SIP终端之间的呼叫提供代理;另一方面ALG必须允许私网内部SIP终端进行注册,因为只有通过注册才能使SIP终端明白ALG是它们的代理服务器,因此,SIP应用层网关同时也是私网上的SIP注册服务器。而对于公网上的SIP终端而言,私网内部是不可见的,唯一可见的是处于公网上的SIP应用层网关,因此对它而言,ALG只是一个SIP终端,公网上的SIP设备就能够直接对它进行呼叫或者接收它的呼叫。
综上所述,SIP应用层网关功能在私网和公网上是非对称的,可划分为:1.对内功能:SIP应用层网关是私网上的SIP注册服务器和代理服务器,同时,对于跨网呼叫的情况,SIP应用层网关除需为私网终端提供SIP消息的代理,还须提供媒体流数据的代理,这种媒体数据的代理功能对通信双方是透明的;对外功能:在公网上,SIP应用层网关作为一个普通的SIP终端而存在,它能够与公网上的其它SIP应用建立互连关系,并隐藏ALG与私网内部SIP应用之间的关系。
SIP应用层网关的实现
本节前面部分详细的介绍了SIP应用层网关实现的理论基础,本节介绍ALG的软件实现方式,软件开发平台是Windows2000,开发工具是Visua1C++ 6.0,采用的是OSIP协议栈,开发的语言主要是C。
结构及工作流程
这里ALG被分成两个部分:ALG主体部分和SIP URI信息管理系统部分,这两部分被设计成是两个相互独立的程序。ALG主体部分的功能是处理各种流向上的SIP消息、管理呼叫环境以及跨网络呼叫时,在通信双方之间进行RTP数据包的转发;SIP URI信息管理系统部分的功能是负责私网内部SIP URI及其绑定信息的管理和维护,该系统及其维护的数据库放置在私网内部的其它主机上运行。两部分之间通过UDP/TCP进行通信,这样可以减小来自外网上攻击的风险,从而提高数据信息的安全性。 由于ALG主体无法直接对SIPURI的数据信息进行访问,因此必须在这两部分之间提供访问的接口,“信息数据库接口”模块就是为 ALG访问SIP URI信息管理系统的接口。
SIP应用层网关的主要工作由一个SIP消息的监听线程、一个与SIP URI信息管理系统进行通信的线程、一个SIP消息处理线程(包括对话的管理和维护)和数量不定的RTP数据包转发线程完成。RTP数据包转发线程能够根据需要而动态的生成和释放,因此数量不定。
SIP应用层网关的基本工作流程如下:
应用程序初始化完毕以后,启动SIP消息监听线程、URI信息数据库访问线程和SIP消息处理线程。SIP消息监听线程对ALG的所有SIP端口(包括私网和公网)进行监听,如果收到SIP消息,它把消息连同其源IP地址和端口以及消息本身的长度封装成一个简单的数据结构放入一个先入先出的队列(FIFO)当中,然后继续监听,它不对消息进行进一步的处理。
一旦FIFO中有了SIP消息,SIP消息处理线程就被唤醒,并投入运行,它从FIFO中取走消息,然后开始对这个消息进行处理:首先它对消息进行解析以及例行的语法检查,然后根据SIP消息的源地址和目的地址将其分成四类:
(1)内部消息,其源地址和目的地址都在私网内部。
(2)对外消息,其源地址是私网地址,目的地址是公网地址。
(3)对内消息,其源地址是公网地址,目的地址是ALG的公网地址。
(4)外部消息,其源地址和目的地址都是公网地址。
SIP消息被分成以上四类后,ALG对它们进行不同的处理。第(1)类消息称为“内部消息”,第(2)类和第(3)类消息统称为“跨网络消息”;第(4)类消息称为“外部消息”,它会被无条件丢弃,ALG不对其作进一步的处理。SIP消息处理线程在对“跨网络消息”消息进行处理的同时,对呼叫的上下文环境进行管理和维护,并在必要的时候,启动新的RTP数据包转发线程,使其完成对跨网络通信的RTP数据包的转发工作。
基于SOCKET消息接收与应答功能模块
由于UDP包的接收是异步的,ALG无法预测何时会有SIP消息到来,因此在SIP应用层网关的设计中,用单独的线程对SIP端口进行监听。由于SIP应用层网关处在两个网络的边界上,并在两网之间转发数据,因此ALG的SIP端口也相应的分为私网和公网两部分,在任何一边的网络上,都可以打开一个或者多个与套节字(SOCKET)相联系的SIP端口。并且每隔一定时间试图从所有监听的SIP端口相关联的SOCKET上读取数据,如果读到了数据,就对数据做简单的封装,然后把它放入应用层网关的SIP消息FIFO当中。