ice协议 nat c语言实现,基于ICE的VoIP穿越NAT改进方案

1 引言

近年来,随着数据网络通信逐渐融入传统的话音业务领域,VoIP技术越来越成为当前商业考虑的对象,并正在向一种正式的商业电话模式演进,而会话初始协议(SIP,Session Initiation Protoc01)就是用来确保这种演进能够实现而需要的NGN(下一代网络)系列协议中重要的一员。SIP是一个用于建立,更改和终止多媒体会话的应用层控制I办议。SIP因其简睢、灵活、可扩展性强的特点,已经成为实现VolP系统的热点技术。

随着计算机网络技术的不断发展,互联网规模飞速膨胀,大量企业和驻地网采用了私有网络通过NAT/防火墙出口来接入公共网络。而由于SIP包头中含有很多对于路由、接续SIP信令和建立呼叫连接必不可少的地址信息,这样引发了业界对于SIP2穿越NAT/防火墙问题的研究。

目前,IETF已经对该问题提出了多种解决方案。例如:ALCes(Application Layer Gateways)、MiddleboxControl Protocol、STUN Simple Traversal of UDPthrough NAT)、TURN(Traversal Using Relay NAT)、RSIP(Realm Specific IP)、Symmetric RTP等。然而,当这些技术应用于不同的网络拓扑时都有着显著的利弊,以至于只能根据不同的接入方式来应用不同的方案,所以,未能很好地解决A11-NATⅢ的问题,同时还会给系统引入许多复杂性和脆弱性因素。此外,由于NAT/防火墙已经大量应用,SIP设备也已经比较成熟,对它们进行升级来支持多媒体通信穿越NAT/防火墙的代价将相当的大。因此,一种不需要升级任何现有网络设备,能够穿越各种NAT/防火墙并且方便在现有网络中实施的解决方案成为迫切的需要。

本文试图寻找一种能够穿越各种类型的NAT/防火墙,无需对现有NAT/防火墙没备做任何改动的解决方案——ICE解决方案,这种方式比以前的解决方案更加灵活,具有广阔的应用前景。

2 现有NAT解决方案的比较分析

主流的NAT穿越解决方案包括STUN、TURN、Proxy及隧道穿越等,这几种方式各具优缺点,比较如下:

(1)STUNml(simple traversal of UDP over NAT)的原理是通过某种机制预先得到内部私有IP地址对应在出口NAT上的对外公网IP地址,然后在报文负载中所描述的地址信息就直接填写出口NAT上的对外IP地址。其最大的优点是无需对现有NAT/防火墙设备做任何改动。局限性在于需要应用程序支持STUN CLIENT的功能,同时STUN并不适合支持TCP连接的穿越。

(2)TURN即通过Relay方式穿越NAT,也是私网中的SIP终端通过某种机制预先得剑TURN SeI-ver上的公网地址,私网终端发出的报文都要经过TURN Serve:进行Relay转发。这种方式除了具有STUN方式的优点外,还解决了STUN应用无法穿透对称NAT(SymmetricNAT)以及类似的Firewall设备的缺陷,局限性在于需要SIP终端支持TURN Client,并增大了包的延迟和丢包的可能性。

(3)Proxy方式是指通过对私网内用户呼叫的信令和媒体||d时做Relay来实现对NAT/防火墙的穿越。由于不用对运营商和客户端的现有网络设备进行任何改造,具有很强的适应性,组网灵活,可满是NGN初期多样化的组网和用户接入。

(4)隧道穿越技术的基本思想是通过把需要穿越的数据流封装征某种隧道中,从而绕过NAT/防火墙。它在很大程度上解决了对于不问应用协议需要开发不同穿越策略的办法,但是必须多媒体终端和服务器能够支持隧道,这是一个比较大的限制条件。

3 穿越NAT/防火墙方案的实现

3.1 ICE方式

交互式连通建立方式ICE(Interactive ConnectivityEstablishment)并非一种新的协议,它不需要对STUN,TURN或RSIP进行扩展就可适用于各种NAT。ICE是通过综合运用上面某几种协议,使之征最适合的情况下工作,以弥补单独使用其中任何一种所带来的固有缺陷。对于SIP来说,ICE只需要定义一些SDP(Sessionescription Protoc01)附加属性即可,对于别的多媒体信令协议也需要制定一些相应的机制来实现。本文是针对SIP呼叫流程实现ICE的功能。

这种方式的优点是可以根据通讯双方所处的网络环境,选取适合穿越NAT/防火墙的方式。首先,获取用户所征网络中NAT的类型,如果用户没有设置使用何种方式连接,那么默队首先使用UDP连接,如果一定时间内没有连接成功,接着使用TCP连接,同样如果没有在一定时间内连接成功,那么将采用其他方式如Upnp、Httptunnel。如果所有穿越方案都失败后,将结果返回给用户,由用户决定是否重试。

3.2 ICE算法流程

ICE算法流程分为以F几个过程:

(1)收集本地传输地址

会话者从服务器上获得主机上一个物理(或虚拟)接口绑定一个端口的本地传输地址。

(2)启动STUN

与传统的STUN不同,ICE用户名和密码可以通过信令协议进行交换。

(3)确定传输地址的优先级

优先级反映了UA在该地址上接收媒体流的优先级别,取值范围0到1之间,按照被传输媒体流量来确定。

(4)构建初始化信息(Initiate Message)

初始化消息由一系列媒体流组成,每个媒体流的任意Peer之间实现最人连通可能性的传输地址是由公网L转发服务器(如TURN)提供的地址。

(5)响应处理

连通性检查和执行ICE算法中描述的地址收集过程。

(6)生成接受信息(Accept Message)

若接受则发送Accept消息,其构造过程与InitiateMessage类似。

(7)接受信息处理

接受过程需要发起者使用Send命令,由服务器转发至响应者。

(8)附加ICE过程

Initiate或Accept消息交换过程结束后,双方可能仍将继续收集传输地址。

3.3 ICE算法实现

当将ICE算法集成到SIP呼叫过程的时候,流程应该是:(1)SIP终端注册,并且访问STUN(STUNT)服务器,判断NAT/防火墙类型,以及TCP时三种序列的包的过滤情况。(2)当发起呼叫信息(INVITE)或接收到呼叫信息回应(200 OK)之前根据NAT/防火墙类型进行对RTP进行地址收集(任非对称性NAT/防火墙后需要收集NAT映射地址,在对称性NAT/防火墙后还需要收集TURN地址)。(3)在RTP的地址端口启动接收线程RSTUN服务程序。(4)发送SIP消息,收集的地址放列SDP消息中的alt属性中。(5)SIP终端得到通讯双方地址后进行地址配对(将双方地址进行组合),并且根据双方网络情况去掉无效的地址对。(6)根据地址对发

送STUN check的包,其中STUN消息的用户名,密码从alt属性中得到,标识该地址对。(7)当检测到有效的地址对时(可以发送RTP媒体流的地址),停止接收线程STUN服务),开始传输RTP流。

本文实现采用Winpcap API首先捕获TCP连接的SYN--out包,修改lP包头的TTL的值,用pcap—sendpacket()。然后使该socket调用listen函数。实现过程中对应于ICE收集地址的算法描述为:

实现ICE中会话发起者和接收者的步骤基本一样,仅任处理流程中先后次序稍微有些不同,本文中实现的会话流程如图l所示。

管理员在2009年8月13日编辑了该文章文章。 -->

阅读(850) | 评论(0) | 转发(0) |

你可能感兴趣的:(ice协议,nat,c语言实现)