SIP穿越NAT方案的研究

时间:2022-09-15 07:58:25

SIP穿越NAT方案的研究

摘要:sip(会话建立协议)是IETF定义的IP多媒体通信控制协议,也是下一代网络(NGN)的核心控制协议,SIP音视频通信的快速发展与IPv地址资源不足的矛盾提出了NAT穿越问题。针对SIP信令和媒体流的nat穿越问题,阐述了现有穿越的解决方案。如:STUN。

关键词:会话建立协议;网络地址翻译;VoIP;STUN

中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)33-1480-05

Research on NAT Traversal Based on SIP

WANG Qing-nian

(School of Computer Science & Technology, Soochow University, Suzhou 215007, China)

Abstract: SIP is an IETF defined IP multimedia communication control protocol and the key protocol of the next generation network (NGN), As a result of the inconsistency between the rapid development of SIP-based audio/video communication applications and the shortage of IPv4 adresses, the NAT traversal problem has been raised , In the paper , the NAT traversal problem of SIP singnalling and media stream is explained firstly. Then an overview is given to the existing solutions of media stream traversal. Finally a STUN protocol based on implementation is detailed to be applicable to enterprise networks.

Key words: SIP; NAT; VoIP;STUN

相比较传统的公共交换网络(PSTN),VoIP的费用相对比较便宜,VoIP是以IP电话为主,并推出响应的增值业务的技术,VoIP可以便宜的传输语音,视频,传真和数据等业务。如:虚拟电话、电话会议、电子商务、Internet呼叫管理等。之所以VoIP相对便宜,是因为VoIP实际上是互联网上的一个应用。而VoIP最大的优势就是它可以利用庞大的现存的IP网络。

VoIP的基本原理是发送方的设备将语音进行采样编码压缩,之后通过IP封装成IP数据包传输到接收方,接收方将封包进行解码输出到相应的设备。设备还原输出模拟语音。VoIP技术的发展日趋成熟,VoIP技术可以分为三个方向。

1) 使用电话行业中的信令概念,譬如:H.323,MGCP,MEGACO/H.248。

2) 使用电话行业中的控制概念,譬如:中心控制和软交换。

3) 使用以Internet协议为中心的SIP(会话建立协议)。

其中SIP借鉴了其他Internet标准和协议的设计思想,相比其他技术有其突出的优点:

1) 它是基于文本的协议,因此,SIP对以文本形式表示的消息的词法和语法分析就比较简单。

2) SIP会话请求过程和媒体协商过程等是一起进行的,因此呼叫建立时间短,

3) SIP只要充分利用已定义的头域,必要时对头域进行简单扩展就能很方便地支持补充业务或智能业务。

在目前的网络环境中,出于安全性和IPv4地址资源问题的考虑,防火墙和NAT设备广泛使用。这样,如何使用SIP协议穿透防火墙和NAT已经成为SIP应用领域的一个重要课题。

1 SIP协议概述及其原理

1.1 SIP协议概述

会话建立协议(Session Initiation Protocol,SIP)是一种基于文本的应用层协议,类似于我们熟悉的并广泛使用的一些协议如HTTP, SMTP。它是由IETF(Internet Engineering Task Force)提出的IP电话信令协议。会话参与者可以使用SIP创建,修改和终止会话。这种会话可以是电话播叫,多媒体会议,和影音传输。会话参与方通常产生一个携带“媒体描述”的SIP包,以便参与者能够对媒体Codec(编解码)达成一致。SIP相对于H.323(另一种IP电话系统结构的信令协议,是由ITU制定的一整套庞大的标准)简洁,SIP通常可以和其他多种协议进行整合,以发挥更多更大的作用。

早在1996年IETF(Internet Engineering Task Force)中的多媒体工作组已经开发了在Internet上的多媒体基础,即Henning Schulzrinne教授的SCIP(the Simple Conference Invitation Protocol)和Mark Handley的SIP这两份提案,后来被宣布合并到会话建立协议(SIP)。新的协议也保留了SCIP提案中的HTTP定位功能。Schulzrinne,SIP协议经过发展在1999年首次被认可作为RFC(Request For Comments,意即“请求注解”)编号2543,也就是SIP的1.0版本,并在同年分离出一个独立的SIP工作组,对于即时消息和在线检测业务的工作组(SIP for Instant Messaging and Presence Leveraging, SIMPLE)成立了,在2000年,SIP工作组成立了,它主要是开发和完善SIP协议,比如SIP的方法,消息和事件等。随后在2002年专注应用和扩展的SIPPING(Session Initiation Proposal Investigation)工作组也成立了。2005年时,已经成立了多个工作组,如XCON(集中式的会议),ECRIT(紧急事件通讯), P2PSIP(Peer-to-Peer SIP)。SIP正受到越来越多企业和研究机构的重视,IETF继续进行制定SIP这项工作,在2001年了标志着SIP已经成熟的2.0版本的规范RFC3261。

RFC 3261的标志着SIP的基础已经确立。那个时候起,IETF又了一些RFC 3261的增补版本。例如,RFC 3262 对临时响应的可靠性作了规定。RFC 3263 确立了 SIP 服务器的定位规则。RFC 3264 提供了offer/answer模型,RFC 3265 确定了具体的事件通知。

1.2 SIP协议功能

SIP支持的主要功能:

用户定位:确定通信所用的端系统的位置。

用户可用性判定:确定被叫方是否空闲和是否愿意加入通信。

用户能力交换:确定所用的媒体类型和媒体参数。

会话建立:邀请和提示被叫,在主被叫之间传递和建立媒体会话参数。

会话管理:包括转移和终止会话,修改会话参数以及调用其他业务等。

SIP本身并不提供服务,但是SIP提供一个基础,用以用来实现不同的服务。

1.3 SIP网络元素

一个SIP网络中有四种SIP逻辑实体,每一种实体都有详细设定的功能,传统的SIP是基于C/S模型进行信息通讯,在SIP通信中的实体要么作为一个客户端,用来发送初始化请求,要么作为服务器端用于响应请求,或者同时集中客户端和服务器端的功能。四种类型的逻辑实体如下:

1) 用户(User Agent,UA),它是终端用户设备,如用于创建和管理SIP会话的移动电话、手持设备、PC、PDA等。UA又可以分为用户客户机和用户服务器,用户客户机用来发送消息,用户服务器对消息进行响应。

2) 服务器(Proxy Server),它管理着一个域的会话请求或者响应信息。服务器接受SIP UA的会话请求并查询SIP注册服务器,或其接收方UA的地址信息。然后,它将会话邀请信息直接发给接收方UA(若果它位于同一域中)或服务器(如果UA位于另一个域中)。

3) 重定向服务器(Redirect Server),它允许SIP服务器将SIP会话邀请信息定向到外部域。不像服务器,重定向服务器不会将传送请求到另一个重定向服务器上。

4) 注册服务器(Registrar),它是包含域中所有用户的位置信息的数据库。通常物理上SIP注册服务器与重定向服务器同在一个硬件上。

1.4 SIP消息的组成

SIP消息有两种类型:请求消息(从客户机发送到服务器)和响应消息(从服务器发送到客户机)。但这两种消息在结构上类似,只在起始行上有差别。

SIP消息的格式:

SIP 消息 =起始行(请求行/状态行)

*消息头部 (1..*头部)

CRLF(空行)

[消息体(可选,通常为SDP)]

请求消息行的格式:

请求行 =Method SP Request-URI SP SIP-Version CRLF

比如:INVITE sip: SIP/2.0

在请求行中,SIP-Version(遵循RFC3261协议)等于SIP/2.0(RFC2543是SIP/1.0),请求行中包含了一个方法(Method),它决定了消息的类型和目的。可以是REGISTER,INVITE,ACK,CANCEL,BYE,OPTIONS.(rfc3261中6种),SIP在其他的文档中还实现了若干个Method。

表1 SIP请求方法

响应消息行的格式:

响应行 =SIP-Version SP Status-Code SP Reason-Phrase CRLF

如:SIP/2.0 180 Ringing.

在响应行中,Status-Code(状态码)参数是从100~699的整数,共有6大类状态码定义了不同的类型的状态,而每一类又可以分为若干个子状态。

表2 SIP响应状态码

在响应行中的 Reason-Phrase(原因)参数用于对Status-Code(状态码)进行的简单文本描述。在消息头部中,是一些通用的头域,由用户客户机产生的SIP请求必须包含下列6个头域:To、From、CSeq、Call-ID、Max-Forwards和Via。

消息头部的格式

Header-Field = “header-name” “:” header-value *(COMMA header-value)

SIP消息示例:

INVITE sip: SIP/2.0

Via: SIP/2.0/UDP ;branch=z9hG4bK776asdhds

Max-Forwards: 70

To: Bob

From: Alice ;tag=1928301774

Call-ID:

CSeq: 314159 INVITE

Contact:

Content-Type: application/sdp

Content-Length: 142

(SDP 省略)

1.5 SIP会话呼叫流程

一次简单的建立会话过程如图1,简单的呼叫必须至少有呼叫方和被叫方,在两者之间通常有SIP服务器,所有的SIP信令都必须通过SIP修改和转发。在SIP终端启动时都会向SIP注册服务器(这里SIP同时也是注册服务器)发送REGISTER消息,而注册服务器响应200,表示注册成功。建立会话时,SIP终端A首先发起呼叫请求,向SIP发送INVITE消息,SIP向终端B发送INVITE请求。图1中100为临时响应,表示呼叫正在处理中。终端B振铃,向SIP服务器发送临时响应180,主叫(SIP终端A)收到180后听到铃音。SIP终端B向SIP发送成功响应200,表示被叫(SIP终端B)同意会话并摘机,SIP终端A在收到SIP转发的成功响应200之后发出ACK,至此两个SIP终端建立连接,两者之间可以进行媒体通信。

SIP终端A向SIP发送BYE消息请求释放连接,经过SIP的转发BYE传送到SIP终端B,在终端A收到200响应后,呼叫释放成功。

2 SDP(会话描述协议)概述

2.1 SDP协议介绍

SDP是由IETF定义用来描述流媒体会话初始化参数的。例如,在多媒体会话中包括音频和视频编码类型,采样率等。SDP不是一个通讯协议,它的描述语言采用文本模式,所以使用者很容易了解SDP包中所包含的信息。

2.2 SDP与SIP关系

SDP纯粹是一种会话描述的格式,它可以使用不同的传输协议,如会话通告协议SAP、会话建立协议SIP和超文本传输协议HTTP等。

在SIP包的消息体中通常携带SDP的内容,并在SIP消息体中用Content-Type: application/sdp指示。这行之后,就是纯粹的SDP消息。

图1 SIP呼叫流程

SDP文本信息包括:

1) 会话名称和意图;

2) 会话持续时间;

3) 构成会话的媒体;

4) 有关接受媒体的信息(地址等)。

协议结构

SDP 信息是文本信息, SDP 会话描述如下:(标注 * 符号的表示可选字段):

会话描述:

v = (协议版本)

o = (所有者/创建者和会话标识符)

s = (会话名称)

i = * (会话信息)

u = * (URI 描述)

e = * (Email 地址)

p = * (电话号码)

c = * (连接信息 D 如果包含在所有媒体中,则不需要该字段)

b = * (带宽信息)

一个或更多时间描述(如下所示):

z = * (时间区域调整)

k = * (加密密钥)

a = * (0 个或多个会话属性行)

0个或多个媒体描述(如下所示)

时间描述

t = (会话活动时间)

r = * (0或多次重复次数)

媒体描述:

m = (媒体名称和传输地址)

i = * (媒体标题)

c = * (连接信息 ― 如果包含在会话层则该字段可选)

b = * (带宽信息)

k = * (加密密钥)

a = * (0 个或多个会话属性行)

其中,c=<network type> <address type> <connection address>: “c=”域包含链接的信息,“连接地址”指的是传输流媒体的IP地址。m=<media> <port> <transport> <fmt list>:每个媒体描述域由多个子域组成。<meidia>可以是“audio”、“video”、“application”、“data”和“control”五种形式。<port>是媒体流发送的传输端口;<transport>是传输媒体时所用的传输协议,通常为UDP.。该子域的值依赖于“c=”;<fmt list>表示媒体格式。

3 NAT的网络概念

在计算机网络中,为了节约公网IP地址和基于一些安全性考虑,通常局域网内使用内部私有地址,局域网内的主机若要访问INTERNET网,则IP包必先经过NAT(网络地址转换)设备,NAT设备通常是路由器或者防火墙设备,在INTERNET上大多数系统使用NAT是为了使多个主机上使用一个单一的公共IP地址,从而节约一大部分资金以及方便管理和隐藏内部主机的地址。NAT对于内部主机是透明的,同一个局域网内的主机访问外网使用同一个地址,这个地址也就是NAT设备的连接公网的接口地址,使用不同的端口来区分不同的主机的请求。同时NAT会记录下内外网地址的映射关系。以便外部接收外部传输来的连接发到正确的内网设备。

3.1 NAT的类型

根据NAT的对于内外网的映射关系的不同和是否允许外网主动连接内网主机,NAT可以分为下面三种。

1) 静态NAT(Static NAT)

静态NAT是指内部网络中的每个主机都被永久映射成外部网络的某个合法地址。

2) 动态NAT(Pooled NAT)

与静态NAT不同的是动态地址NAT则是外部网络中定义了一系列的合法,采用动态分配的方法映射到内部网络。

3) NA(P)T

NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上,不用的内网机器对应一个外部IP的不同的端口。

绝大部分的NAT使用的这种方式,通常可将NAPT分为四种类型。

1) 完全锥形NAT

完全锥形NAT把所有来自一个内部私网地址/端口的请求,都映射到同一个外部公网地址/端口。并且,任何外部主机可以通过映射得到的该外部地址发送数据包,从而NAT接收数据包并发送到该内网主机。

2) 受限锥形NAT

只有当私网IP向外发出数据包时,NAT才会进行该私网IP/端口与公网IP/端口的映射,这时目标公网IP的返回数据包能通过NAT到达私网设备,而其他公网IP所发送的数据包会被拒绝。也就是,只有当NAT后面的主机主动与其通信时,该IP设备发出的数据包才能获得通过。

3) 端口受限锥形NAT

图2 NAT(P)T示意图

与受限锥形NAT类似,除了NAT后面的主机(私网主机)主动发送数据包到外网IP地址/端口,该IP地址/端口可以发送数据包通过NAT设备到达私网主机,相比受限锥形NAT更严格,即使来自相同外网IP但是用不同的端口发送数据给NAT,NAT就会将该数据包丢弃。

4) 对称NAT

一个私网设备同时与不同的两个公网设备进行通信时,NAT需要提供两组公网IP地址及端口。这种情况下通常是分配给同一个私网设备数据包发送出外网同一个IP不同的端口。

4 现有SIP穿越NAT技术概述

基于SIP协议的NAT穿越主要指的是RTP流的穿越问题,对于这一问题,业界提出了多种不同的技术。

4.1 应用层网关(ALG)

在NAT/Firewall上加入能够用于具体应用协议(如SIP)感知的模块,通过对具体协议的感知,进行针对不同协议的具体NAT/Firewall穿越处理。对于每一种应用协议都需要一个ALG实例来支持,因此每增加一个应用层协议的支持,或者现有的协议修改了,都需要一个新的ALG来支持,因此这种穿越NAT机制在实现中复杂度高,需要升级NAT设备,成本也大,可扩展性差,这种方式在应用中受到很大的限制。

4.2 MIDCOM控制协议

MiddleBox Communications(MidCOM)是通过在受防火墙/NAT信任的第三方实体(MIDCOM Agent)和防火墙/NAT(MiddleBox)之间建立中间盒通信,使中间盒设备(防火墙/NAT)变成可控制的一种新概念。这些信任的实体通过MDCOM协议与防火墙/NAT进行通信。这种方式允许受防火墙信任的第三方实体代表NAT做出决定,强制其开放端口传送媒体流或数据流,但是并非所有的防火墙/NAT都能够支持某种MIDCOM协议,因此这类技术在实际中的应用也存在一定的局限。

4.3 STUN(UDP的NAT简单穿越)

RFC 3489中提出来一种穿越NAT的一种方式,就是在公网上设置一个STUN服务器,用于与私网终端通讯,在发送数据包之前,终端用户先与STUN服务器通讯,在通信的过程中STUN服务器得知终端的外网地址和出口端口号,并告诉给终端,最终修改SDP数据包的是终端,终端与外网服务器之间使用RFC 3489中定义的STUN协议。但是因为STUN告诉内网终端的端口是UDP目的地为STUN服务器的数据包出外的端口,在对称NAT下真正的媒体流出去则分配一个不同的端口号,所有终端修改了数据包也是没有用的,因而,STUN这种方式不能解决在对称式的NAT下的数据包的穿越问题。

4.4 TURN(STUN Relay Usage)

TURN的全称为Traversal Using Relay NAT,及通过Relay方式穿越NAT。这种方式可以解决对称式NAT下的穿越问题,TURN方式解决NAT问题的思路与STUN相似,不同的是,所有的媒体流都需要经过TURN服务器进行Relay转发。

实现TURN的穿越方式需要终端支持TURN Client,这一点同STUN一样对网络终端有要求;此外,所有报文都经过TURN服务器,特别是语音流,这样增大了网络延时和丢包的可能性。

4.5 ICE(Interactive Connectivity Establishment,交互式连通)

交互式连通建立方式ICE(Interactive Connectivity Establishment)并不是一种新的协议,ICE是通过综合如STUN,TURN或者其他方式,使之在最适合的情况下工作,以弥补单独使用其中任何一种,所带来的固有的缺陷。对于SIP来说,ICE只需要定义一些SDP附加的属性即可。传统的STUN最大的缺陷在于它不能保证在所有网络拓扑结构中都正常工作,最典型的问题就是Symmetric NAT。对于TURN或类似转发方式工作的协议来说,由于服务器的负担过重,很容易出现丢包或者延迟情况。而ICE方式正好提供了一种负载均衡的解决方案,它将转发服务作为优先级最低的服务,从而在最大程度上保证了服务的可靠性和灵活性。此外,ICE的优势还在于对IPv6的支持。

上一篇:基于嵌入式平台的小型字库设计 下一篇:软件工程实验室建设研究