RFC3581——SIP中的rport机制

Kamailio force_rport 测试 如果“sent-protocol”组件指示不可靠的单播传输协议(如UDP),并且没有“maddr”参数,但既有“received”参数又有“rport”参数,则响应必须发送到“received”参数中列出的IP地址和“rport”参数中的端口。然而,无状态代理不在请求和其响应之间存储状态,因此无法记住接收请求的地址和端口。使用响应最顶部Via头字段值中的rport”参数(此处定义)和“received”参数(RFC 3261 [1]中定义),发送请求的客户端可以了解其地址在发送响应的服务器看来是怎样的。 阅读详情

http://my.oschina.net/u/147624/blog/33203


1.    介绍

RFC3581的下载地址:http://www.ietf.org/rfc/rfc3581.txt

该协议比较简短,主要用于描述rportresponse-port)机制。

1.1 NAT分类

NAT:网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

NAT常用的分类如下:

Full Cone NAT(完全圆锥型)

Address Restricted Cone NAT(地址限制圆锥型 )

Port Restricted Cone NAT(端口限制圆锥型)

Symmetric NAT(对称型

1.1.1 完全圆锥型NAT

在完全圆锥型NATFull Cone NAT)中,NAT会将客户机地址{X:y}转换成公网地址{A:b}并绑定。任何包都可以通过地址{A:b}送到客户主机的{X:y}地址上。如图所示:
   

1.1.2 地址限制圆锥型NAT

地址限制圆锥型NATAddress Restricted Cone NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定,只有来自主机{P}的包才能和主机{X:y}通信。如下图所示:
    

1.1.3 端口限制圆锥型NAT

端口限制圆锥型NAT(Port Restricted Cone NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定,只有来自主机{P,q}的包才能和主机{X:y}通信。如下图所示:
    

1.1.4 对称型NAT

对称型NATSymmetric NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定为{X:y}|{A:b}<->{P:q}。对称型NAT只接受来自{P:q}incoming packet,将它转给{X:y} ,每次客户机请求一个不同的公网地址和端口,NAT会新分配一个端口号{C,d} 。如下图所示:
     

1.2问题描述

1.2.1 SIP Proxy无法穿过NAT回送SIP信令

因为SIP信令中的FromContact头域记录的是私网地址和端口,NAT无法识别和转换。如图所示:
   

1.2.2 使用UDP Hole Punching的问题

        

这个内网的NAT上打了一个方向为211.136.91.58,(这就是称为UDP Hole Punching的技术)以后211.136.91.58就可以通过这个洞与内网的192.168.1.223联系了,但是其他的IP不能利用这个洞。

在没有活动的时候,这个Hole会过期:

NAT对于地址转换关系是有一定生命期的,某个地址转换后在一段时间内没有被使用将会被清除,当这个业务流再次出现时,将会建立一个新的地址转换关系。

SIP代理无法穿越

SIPUDPTCP上操作。当在UDP中使用的时候,对请求的响应被发送给请求所来自的地址,端口字段带在请求的Via头字段中。一半以上的信息(例如:IP地址)带在 IP包头中,还有一半的信息(例如:端口信息)带在SIP消息头中。SIP这样做的原因是为了监听所有的信息,包括请求消息和响应消息。

但是这种方式在客户端在 NAT中的情况不适用,在NAT的环境中,回应可能发送不过去,因为与在请求中找到的地址不一样,而且此前也没有方法让客户端来得到源端口信息。

2.    NAT的常用解决方案

解决NAT穿越有很多中解决方案,常用的有:

2.1 ALGApplication Level Gateway

可以识别SIP信令,能够适当地修改数据包。ALG可以是单独的连接于外网和内网之间的设备,也可以是内置于防火墙内的插件。

FW/NAT发现外网呼叫信令为SIP时,将其转发到ALG(应用层网关),通过ALG建立起内网伪地址终端与外网终端的通信连接。

使用ALG需要对现有设备升级改造。例如思科的路由器都支持配置ALG

2.2 MidComIETF MIDCOM(Middlebox Communications

允许第三方(MIDCOM Agent )成为受FW/NAT信任的实体,然后代表FW/NAT做出决定,强迫其开放端口传送媒体流或数据流。这些受信任的实体通过“MidCom”定义的新协议与FW/NAT进行通信。

协议的识别不由Middlebox完成,而是由外部的MIDCOM Agent完成。

使用MidCom需要对现有设备升级改造。

2.3 STUN(Simple Traversalof UDP Through Network)

 
      IETF RFC 3489
定义了如何确定由NAT分配的公网地址和端口,不需要改造现有NAT

主要特色

能够让客户端发现NAT的存在以及类型;

能够让客户端发现NAT的绑定生命周期;

可以工作在多NAT串联环境下;

非常简单的协议,易于实现,负载低;

STUN服务器可以位于公网任何地方。

适用范围

不适用于Symmetric NAT

对于Non- Symmetric NAT都适用;

如果双方都位于同一个NAT之后,就不适用。

2.4 SBC(Session Border Controller)

             
    
Signaling Solution

Ø SBC可以帮助SIP信令穿越已经存在的FW/NAT,而不需要对现有的FW/NAT设备做任何改变;

Ø 对于SIP终端,SIP终端设备会周期性发送注册消息到SBC

Media Traversal Solution

SBC可以把相应的媒体流发送到防火墙上的相关IP地址和端口,然后正确地使媒体流到达防火墙后的用户侧。

3     rport机制讲解

3.1 方案描述

获得IP地址是在Via头中带上received参数。为了得到端口信息,也参考了这种方式,即在Via头中带上rport属性来指明端口信息。

当在客户端和服务器之间是NAT的时候,请求可能会在NAT中创建(或刷新)一个绑定,为了让客户端收到响应信息,在事务处理的过程中这个绑定必须保持存在。大多数的NAT绑定有超过1分钟的超时时间,这超过了non-INVITE事务的持续时间,因而对non-INVITE事务的请求的响应只能在绑定存在的时候存在。INVITE事务倒是不存在这个问题。

为了保持这个绑定,客户端应该在每隔20s左右重发INVITE请求,这种重发机制需要发生在收到一个临时的响应后。

当然刚才所说的大概1分钟的超时时间也不是确定的,有时候会比这长,此时重发机制可以发慢一点,否则,可以发快一点。这些问题可参考RFC3489

如果是支持rport机制的服务器,它需要在接收到的请求中检查Via头是否包含一个没有值的rport参数。如果有,它需要在回应中带上rport的值,这与received的处理类似。

为了穿越对称性的对称性的NAT,响应需要发送到相同的IP地址和端口。当服务器在多端口或接口的请求上监听请求时,它必须记住请求是从何处发的。对一个稳定的Proxy,在一个传输的持续时间中,记住这些东西是没有问题的。但是对于不稳定的Proxy,它不存储请求和响应中的状态信息,为了达到本规范的要求,它需要将地址和端口信息加密到Via头字段中,在响应信息到达的时候,它能提取加密的信息并将它放到响应中。

rport机制需要终端支持该种机制,因此应用情况比较受限。但是在笔者的应用场景(呼叫中心)中,主要要解决的问题是坐席能在NAT环境中穿越,给服务器发送信息。因为坐席所使用的SIP软电话是本公司开发的,所以可以保证是支持rportreceived的。

3.2 实例

下面举一个发送REGISTER信息的实例,在请求信息的Via头中包含了没有值的rport参数,如下所示:

  REGISTER sip:  124.40  .  120.188  :  5060   SIP  /  2.0
Via: SIP/
  2.0  /  UDP   124.42  .  4.203  :  15500  ;branch  =  z9hG4bK  -  d8754z  -  1049ed261d2e643d  -  1  ---  d8754z -;rport
Max
  -  Forwards:   70
Contact: <
  sip:  19988888888  @  192.168  .  2.65  :  12344  ;rinstance  =  7cd1c532e92fdb0e  >  ;expires  = 
To: "
  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >
From: "
  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  ;tag  =203ba359
Call
  -ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 
  1 REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User
  -  Agent: eyeBeam release 1105a stamp   56793
Content-
  Length: 

    发送到的服务器支持rport机制,它看到请求中的rport后,将通过分析UDP包信息得到的的NAT的公网地址(124.42.4.203)和端口信息(15500)分别作为receivedrport属性带给客户端:

  SIP  /  2.0     200   OK
Via: SIP
  /  2.0  /  UDP   124.42  .  4.203  :  15500  ;branch  =  z9hG4bK  -  d8754z  -  1049ed261d2e643d  -  1  ---  d8754z -  ;rport  =  15500  ;received  =  124.42  .  4.203 
From: 
  "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  ;tag  =  203ba359
To: 
  "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  ;tag  =  0005  -  058  -  7d6dc90516ae2e21
Call
  -  ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 
  4   REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: 
  <  sip:  124.40  .  120.188  :  5060  > 
Content
  -  Length: 

   客户端在得到响应信息后,知道了所使用的公网地址和端口,在而后定期重发的REGISTER信息中,Contact变换成124.42.4.203: 15500,例如新发的REGISTER信息变为:

  REGISTER sip:  124.40  .  120.188  :  5060   SIP  /  2.0 
Via: SIP
  /  2.0  /  UDP   124.42  .  4.203  :  15500  ;branch  =  z9hG4bK  -  d8754z  -  1049ed261d2e643d  -  1  ---  d8754z -  ;rport
Max
  -  Forwards:   70 
Contact: 
  <  sip:  19988888888  @  124.42  .  4.203    15500  ;rinstance  =  7cd1c532e92fdb0e  >  ;expires  = 
To: 
  "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  > 
From: 
  "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  ;tag  =  203ba359
Call
  -  ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 
  2   REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User
  -  Agent: eyeBeam release 1105a stamp   56793 

Content - Length: 


rport方式主要是对sip信令中Via字头的扩展,不过同时也要求SIP Proxy支持该功能。
NAT之后的sip client在发送请求的时候在via字头中添加rport字段,该消息经发出后路由到SIPProxy,SIP Proxy通过检查消息的源地址和Via字段中的地址,得知该client处于NAT之后,并且基于已有的rport,将消息的真实地址即公网上的地址通过received和rport字段返回给client端,这样client就知道自己真实的公网地址,可以解决信令穿越的问题。

 4.    参考文档

神州泰岳应用开发事业部郑昀《SIP穿越NAT
   
RFC3581http://www.ietf.org/rfc/rfc3581.txt


从科研小白到动物行为分析:我的DeepLabCut 3.0安装与初体验全记录 本文记录了从科研小白到成功安装并使用DeepLabCut 3.0进行动物行为分析的全过程。详细介绍了Anaconda环境配置、CUDA版本选择、DeepLabCut安装步骤及验证方法,并分享了初体验中的实用技巧和跨学科研究心得,为生物研究者提供了AI工具应用的实战指南。 阅读详情

相关推荐

如何用Arduino和HX711压力传感器制作一个简易电子秤(含OLED显示)

本文详细介绍了如何使用Arduino、HX711压力传感器和OLED显示屏制作一个简易电子秤。从硬件连接到软件编程,提供了分步教程,包括核心元件功能解析、接线方法、库安装、模块测试以及关键的校准流程。项目实践性强,适合创客和DIY爱好者学习嵌入式系统与传感器应用。

tea88的博客 515

RFC3581——SIP中的rport机制(一)

转自http://www.blogjava.net/amigoxie/archive/2010/05/28/322182.html  1.    介绍 RFC3581的下载地址:http://www.ietf.org/rfc/rfc3581.txt 该协议比较简短,主要用于

资料库 1689

摄像头模组CCM简介

摄像头模组,全称Camera Compact Module,简写为CCM。CCM 包含几大件: 镜头(lens)、音圈马达(VCM)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)。工作原理:物体通过镜头(lens)聚集的光,通过CMOS或CCD集成电路,把光信号转换成电信号,再经过内部图像处理器(ISP)转换成数字图像信号输出到数字信号处理器(DSP)加工处理,转换成标准的GRB、YUV等格式图像信号。摄像头模组主要由以下几个部分组成:镜头(Lens):将光线汇聚到图像传感器上。

m0_73482095的博客 1万+

国标视频sip协议的rport机制

SIP协议rport机制: 对接南瑞B接口平台无法看视频,中间经过一个加密导致申请视频的响应发不过去,抓包看了一下,确实端口不可达。 因为经过一道加密程序,加密程序做转发的,相当于经过一道Nat,必须发给对应的加密程序端口,如果直接会给平台端口肯定不行的。因为直接回复给了21113端口,所以提示端口不可达。SIP协议栈是支持透过Nat,但是请求必须加上rport标签。 rport机制: 1。客户端需要在 via上带上rport参数 2。服务端发现via中有rport参数时,将此via中加入receive

weixin_43866967的博客 1316

sip rport 机制

1) 为什么要引入Rport 机制? 如果client 躲在NAT 后面, client并不知道自己出NAT使用的public IP是多少, client在组装SIP消息的时候, VIA 以及contact header 里面的地址信息都是内网的IP信息, 但是 server 收到SIP消息后,他并不知道这个client是不是躲在内网里面,或者说se...

lyyslsw的专栏 2419

SIP系列四:SIP扩展消息及rport机制(NAT穿越)

SIP消息分核心方法和扩展方法,基本方法包括:INVITE、ACK、BYE、CANCEL、REGISTER、OPTIONS。扩展方法包括:SUBSCRIBE、NOTIFY、PUBLISH、REFER、INFO、UPDATE、PRACK、MESSAGE。MESSAGE在之前的系列已经介绍过了,接下来对几个比较常用的扩展方法进行介绍

不定期更新关于音视频的文章 1973

sip响应路由规则,rport 机制

sip服务器收到一个请求,路由到下一跳的时候,会在请求的第一条via后面添加收到这个请求的ip和端口信息,然后再添加一条自己的via。这样,当这个请求的响应路由到sip服务器的时候,sip服务器就可以根据via来决定下一跳的ip和端口。     sip服务器191收到请求                     INVITE sip:13751812778@183.232.75.191

ttomqq的专栏 7679

SIP穿越NAT的rport机制

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

yine的专栏 1200
上一篇: sip中update和re-invite方法的区别
下一篇: SIP HOLD
blade2001
博客等级 码龄25年 372粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值