首页 > 代码库 > VOIP NAT穿越之SIP信令穿越

VOIP NAT穿越之SIP信令穿越

本文原创自 http://blog.csdn.net/voipmaker  转载注明出处。

本文是VOIP通信NAT系列专题的第三篇,

本文论述NAT对SIP协议穿越的影响,SIP协议是基于文本的,而他的一些地址是保存在消息头传输,NAT设备在没开启ALG情况下不会修改消息头地址,

多数客户端填写的地址都是内网地址,这就导致消息路由问题,SIP 信令穿越涉及两部分,一个是注册,另一个是INVITE(呼叫),涉及的消息头为contact头和via头,

contact头是告知对方自己直接可达的地址,via头告知对方,此消息是从哪个地址,哪个端口送过来,接收端响应时根据via地址做响应,先说register, 客户端注册时

会把自己的地址端口填写到contact头,但这个地址在nat环境下并不管用,注册的作用是告知服务器自己的可达地址,后面有呼叫送给他时服务器直接送到这个地址即可,

而客户端填写的私有地址在nat环境下并不可达,服务器后续呼叫直接送这个地址是失败的,解决这个问题需要客户端支持 sip outbound, 其原理是服务器发现如果客户端是在nat环境下,则记录接收到register请求的地址和端口,而不是contact地址和端口。 这个地址和端口通常是NAT设备给客户端映射的外部端口,而NAT设备维护这个映射是 有时间限制的,为确保这个映射一直开启就需要客户端周期性发keep-alive包,包的类型有多种,有的直接周期发register,有的发options, rfc5626规范要求TCP用回车换行发送,UDP则用stun 的bind request 保持NAT 映射处于活跃状态。 这就解决了呼叫客户端问题, SIP穿越的另一个问题是响应发送给谁,前面提到,响应者会根据via头做 response,但via头通常是内网地址,NAT环境下是不可达的,RFC 3581解决了这个问题,通过在via头中增加 rport和received字段支持此扩展,rport在发起请求者的包中是空的,接收到收到后发现有这两个头,接收端会检测实际收到的包的地址和端口,把这两个值填写到recived和rport中,告知请求发起者,同时在响应请求时把响应向这个地址和端口发送,通常这个地址和端口是NAT设备映射的地址和端口。

至此SIP信令穿越问题完美解决。

下一篇文章讲述VOIP NAT穿越 之媒体穿越。