FreeSwitch(九):SIP模块

一、基本概念

(1)Sofia-sip:FreeSwitch使用了比较成熟的开源的SIP协议栈。

(2)EndPoint:互联协议接口模块。如SIP、H232.

(3)mod_Sofia:实现了SIP中的注册服务器、重定向服务器、媒体服务器等各种功能。他的定位是一个B2BUA,不能实现代理服务器。

(4)SIP profile:在mod_sofia中,SIPprofile相当于SIPUA,通过不同的配置参数配置一个UA的行为。每个SIP profile可以监听不同的IP地址和端口。

(5)GetWay:一个SIPprofile中可以有多个getway,可以直译为网关。用于定义一个远端服务器,使得FreeSwitch可以与其他服务器通信。FreeSwitch可以作为一个SIP客户端向远端服务器注册。

(6)本地SIP用户:FreeSwitch可以作为注册服务器,其他SIP客户端就可以向他注册。FreeSwitch就可以对配置用户目录中的注册信息中的用户进行鉴权。

(7)来话去话不是本地的,双方通话就需要通过中继方式。

二、Sofia配置文件

文件夹在conf/sip_profiles/目录中的文件进行配置。sofia支持多个profile,而每个profile相当于一个SIPUA。一个“IP:端口”唯一标志一个OA。freeswitch默认配置带了3个profile,常用的internal和external。端口号在5060、5080.

2.1、profile配置文件

先看internal.xml。

(1)起别名:可以在呼叫字符创中使用。

  <aliases>
        <alias name="default"/>
  </aliases>

(2)网关:一个profile可以定义多个网关。既然profile是一个UA,就可以注册到别的SIP服务器,网关的配置参数由远端的SIP服务器决定。

  <gateways>
  </gateways>

(3)域:all表示查看所有用户目录中定义的域。alias=true会为所有的域取一个别名。

  <domains>
    <!-- indicator to parse the directory for domains with parse="true" to get gateways-->
    <!--<domain name="$${domain}" parse="true"/>-->
    <!-- indicator to parse the directory for domains with parse="true" to get gateways and alias every domain to this profile -->
    <!--<domain name="all" alias="true" parse="true"/>-->
    <domain name="all" alias="true" parse="false"/>
  </domains>

2.2 参数

    如<param name="debug" value="0"/>,为了影响UA的行为。

(1)启用媒体绕过模式:两个通话实体不经freeswitch直接点对点传送。

<param name="inbound-bypass-media" value="true"/>

(2)context:设置来话将进入diaplan中哪个context进行路由。

<param name="context" value="public"/>

(3)diaplan:设置默认diaplan类型

<param name="dialplan" value="XML"/>

(4)<param name="inbound-codec-prefs" value="$${global_codec_prefs}"/>:设置支持的来话媒体的编码。用于编码协商。

(5)<param name="outbound-codec-prefs" value="$${global_codec_prefs}"/>:设置去话语音编码。

(6) <param name="auth-calls" value="$${internal_auth_calls}"/>:是否对来电进行鉴权。

(7)  设置NAT网络中公网的RTPIP、SIPIP。

  <param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
             <param name="ext-sip-ip" value="$${external_sip_ip}"/>

可以用sofia status命令显示。

2.3 external.xml 

当外部网关的invite请求到达freeswitch时候,不能进行鉴权。所以在external 这个profile吧auth-calls参数设置为false。如果使用5060端口向外部网关进行注册的话,外部网管的来电会发送到5060,而这个端口需要鉴权,非内部用户不知道怎么验证,所以FreeSwitch就会拒收。

2.4 getway

freeswitch 需要通过外部网关向外打电话,而这个外部网关就是getway。如下,在extension.xml中设置网关,把extension文件夹下的所有xml都设置成了网关配置。

三、常用命令 

四、profile相关命令 

4.1 SIP capture

 capture agent运行于freeswitch内部,用于将收到的SIP包进行封装,发送到captureNODE,经过分析存入数据库。然后技术人员可以用webhomer查看。

五、NAT

        如果内网主机要与外界通信,路由器会将内网主机的请求转换成外网的IP地址,因而不管是哪个内网的主机与外界通信,外界的主机看起来都是从1.2.3.4这个路由器的外网P发出的。同时,路由器会维护一个地址与内网主机间的映射关系,以保证回来的P能到达相应的主机。这个映射关系是在内网主机首次向外网发包时建立的,此后外网的主机オ可以向内网的主机发送信息。建立该映射关系的过程好像是在NAT设备上打了一个“洞”(因而该技术也称为 UDP Hole Punching,即打洞),通过该“洞”进行内外网的通信。该洞是有生命周期的,如果在一段时间内没有数据通过,则洞会自动消失。

5.1、NAT的种类

        NAT有三种类型:静态NAT( Static NAT)、动态地址NAT( Pooled NAT)和网络地址端口转换( Network Address Port Translation,NAPT)。其中静态NAT设置起来最简单;内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址,而动态地址NAT则是在外部网络中定义了的一系列的合法地址,采用动态分配的方法映射到内部网络;NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上。

        一般来说,NAPT有四种类型,但它实际上又分为两大类:锥型NAT和对称NAT。其中锥型NAT又分为三类,因而一共是四类。简单起见,我们沿用四类的说法来简单讲解(其中前三类属于锥型,最后一类属于对称型)。

        (1)全锥形:内部主机向外打了一个洞,外网的任何主机都可以利用这个洞与它通信。

        (2)限制锥形:按洞的理论来说,就是内部主机向某一外部主机打了ー个洞后,只有该外部主机才能利用这个洞。

        (3)端口限制锥形:内部主机向外部主机上ー某一程序(一个端口)打了ー个洞,则只有该程序可以利用这个洞,其他的不行。

        (4)对称型:对称型NAT相当于对同一内部主机联系不同的外部主机时都需要打不同的洞。

5.2、FreeSwitch拓扑结构

5.3、NAT是怎么影响通信的

        REGISTER 100001.2.3.5 SIP/2.0
        ontact:1000192.168.0.2:5060
        该消息是从192.168.0.2:5060发出的,由于NAT设备进行了网络地址转换,因此FREESWITCH在收到请求后会认为该消息是从1.2.3.4:5060发出的9。大家都已经知道,SIP话机向 FREESWITCH注册是为了让 FREESWITCH记住自己的Contact地址。但如果FREESWITCH记住了192.168.0.2,由于它没法连通该地址,因此如果有人呼叫1000这个用户就会出现电话打不通的情况,这就是典型的NAT引起的问题。解决这一问题通常有两种思路:
      (1)如果 Freeswitch足够聪明,那么它应该知道192.168.0.2是一个内网地址,并且由于
它收到的消息是从1.2.3.4:5060发出的,因而它可以记住后者,而不是那个内网地址。
      (2)可以从客户端解决,让客户端想办法知道被NAT设备映射完以后的外网地址和端口
号,即1.2.3.4:5060。这个一般靠STUN服务解决。


5.4、NAT穿越方法

1、SIP穿越

        当SIP客户端向 FREESWITCH注册时, Freeswitch会比较SP消息中的 Contact地址是否包含在这个ACL中,如果包含,说明是来自一个NAT背后的设备,那么它就把其 Contact地址自动替换为与该设备对应的外网地址(即SP包的来源地址,已经被NAT设备转换成了外网地址),因而接下来再有人呼叫它时, FREESWITCH就能正常给它发 INVITE请求了。

2、RTP穿越

        了解到,很多NAT设备都只有内网的主机曾经向外网主机发过包以后,才允许外面的包进人。因此 Freeswitch使用了一个名为RTP自动调整的特性,即 FREESWITCH在SIP协商时给对方一个可用的公网RTP地址,然后等待客户端发送RTP包,一旦它收到RTP包以后,就可以根据对方发包的地址给它发RTP包了。当这种情况发生时,可以在Log中看到类似如下的信息:
        [INFO] switch rtp.c: 4753 Auto Changing port from 192.168.1.124: 50492 to 1.2.3.4: 50492

3、其他

        (1)讲到可以使用 ifconfig.me之类的服务获取自己的外网IP,但SIP通信中还必须得知道映射的外网端口号。这一工作需要靠 STUN S来实现。STUN的原理是:在公网上部署一台STUN服务器,位于NAT后面的客户端设备向它发送一系列的UDP包先在NAT设备上打一个“洞”,STUN服务器取到UDP包的来源地址以后,会回送相关的消息告诉该客户端它被映射的外网地址。

        ICE⊙的全称是交互式连通建立( Interactive Connectivity Establishment),它其实不是一个新的协议,而是综合利用现有的STUN和TURN等技术,使之在最合适的情况下工作,以弥补单独使用某种协议所带来的固有的缺陷。在SIP通信中,ICE通过扩展SDP,为RTP媒体提供多个候选的地址( Candidate),这样两个SIP终端之间就可以尝试多个不同的候选地址找到一个最优的通信路径。比如,如果两个SIP终端处于相同的NAT后面,则它们可以直接用内网地址进行通信;如果位于不同的NAT后面,并且是锥型NAT,则他们可以选择从STUN服务器获得的外网地址进行通信;如果是对称型NAT,则只能通过TURN来进行通信了。

        (2)当 FREESWITCH需要穿越NAT向外部的网关注册时,它就相当于处在客户端的位置。我们一直在说客户端如果处于NAT之后,NAT问题要自己解决,因此,FREESWITCH也有自己的解决方案。首先, FREESWITCH支持通过uPnP或NAT-PMP协议e在路由器上“打洞”。打洞完成后它就知道了自己将要映射的外网地址了。FREESWITCH检测到NAT以后,会设置 Profile的外网SIP和RTP的IP。


 



 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值