SIP穿越NAT的rport机制

调试asterisk时发现从公网发来的INVITE的响应都不能正常返回到客户端,抓包发现响应都发到via头域中写明的那个port上去了,而实际asterisk是从NAT转换后的地址和端口接收的INVITE请求。最终发现需要在via中加入rport字段,使得asterisk使用rport机制路由响应。


具体的RFC文档参见RFC3581。


RPORT机制:


  1. 客户端需要在top most via上带上rport参数
  2. 服务端发现via中有rport参数时,将此via中加入received参数和rport参数,参数带的值分别是服务端看到的消息来源地址和端口(如果有NAT等地址转换设备,则即为转换后的IP和port)。
  3. 当有需要发送的响应时,按照rport中的端口发送SIP 响应。也就是说IP和端口均完全遵照从哪里来的,发回哪里去的原则。(如果没有rport字段时,服务端的策略是IP使用UDP包中的地址,即从哪里来回哪里去,但是端口使用的via中的端口)

RFC文档中的例子:


客户端发送INVITE形如:
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 10.1.1.1:4540; rport ;branch=z9hG4bKkjshdyff

服务端收到后根据自己所得到的源地址和端口,重写via,如有必要添加自己的via转发
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP proxy.example.com;branch=z9hG4bKkjsh77
Via: SIP/2.0/UDP 10.1.1.1:4540; received=192.0.2.1;rport=9988 ;branch=z9hG4bKkjshdyff

当需要给此请求发送响应时,发往received,rport两个参数记录的IP和PORT。NAT设备再把发往转换后地址192.0.2.1的包发往10.1.1.1地址。
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988 ;branch=z9hG4bKkjshdyff

你可能感兴趣的:(RFC,SIP,rport)