FreeSWITCH呼叫流程整理

简单理解SIP呼叫流程

1. 先理解SIP Profile的几个概念
  • 一个Profile就是一个UA;一个UA就是一个“IP地址: 端口”;
  • fs的/sip_profiles目录下主要有三个东西(不考虑ipv6):external.xml、internal.xml、 /external目录。其中external.xml和internal.xml就是两个Profile;而/external里的xml文件是我们自定义的外部网关,这些外部网关都会被fs装入external.xml中;
  • internal.xml默认运行在5060端口,external.xml默认运行在5080端口。注意不要因为它们的名称而把它们理解为内部和外部。 60端口和80端口的区别就是前者会对sip消息鉴权而后者不需要(各自xml中的auth-calls标签定义)。
2. 本地用户互拨流程

本地user/1000拨打本地user/1001

  1. 因为user/1000注册在5060端口,所以向fs的5060端口发送INVITE请求;
  2. INVITE请求到达internal这个Profile所配置的UA(internal.xml);
  3. 此UA会对此INVITE请求进行鉴权(因为auth-calls=ture);
  4. 先检查ACL(acl.conf.xml),然后进行Digest鉴权(directory/default/1000.xml中的用户名和密码);
  5. 若鉴权通过则开始寻找路由,在1000.xml中的user_context标签即是路由;
  6. 这里以user_context的值是default为例,则进入diaplan/default.xml中寻找路由;
  7. diaplan/default.xml会找到1001这个用户,并执行bridge user/1001
  8. bridge user/1001这个呼叫字符串会再次查找directory用户目录并找到directory/default/1001.xml
  9. 因为1001是被叫,所以fs会进一步找到它实际注册位置,内部用户的实际注册位置在conf/directory/default.xmldial-string标签配置。在这个标签中可以看到调用了sofia_contact这个API,这个API会查找数据库并找到user/1001的contact地址并返回真正的呼叫字符串。
3. 本地用户拨打外部号码流程:

本地user/1000拨打外部号码40012345:

  1. 因为user/1000注册在5060端口,所以向fs的5060端口发送INVITE请求;
  2. INVITE请求到达internal这个Profile所配置的UA(internal.xml);
  3. 此UA会对此INVITE请求进行鉴权(因为auth-calls=ture);
  4. 先检查ACL(acl.conf.xml),然后进行Digest鉴权(directory/default/1000.xml中的用户名和密码);
  5. 若鉴权通过后会找到该用户的配置文件(即1000.xml),在1000.xml中的user_context标签中配置了路由,所以fs会根据此配置进行路由查找:以默认配置为例:<param name="user_context" value="default">,此时进入diaplan/default.xml中寻找路由;
  6. 对于外部号码,default.xml中一般会将请求送到外部网关,例如:bridge sofia/gateway/gw1/40012345这样;
  7. 其中gw1是我们配置的一个网关。本文开头解释过,网关最终都会被装入external.xml,而external这个Profile运行在5080端口。因此,该INVITE请求最终会通过本机的5080端口发往gw1网关(在gw1对应的xml中配好了目的地的ip和端口)。
4. 本地用户接听外部来电流程:

外部送来的sip消息可能送到5080端口,也可能送到5060端口。

  • 如果送到5080端口:
  1. 外部的INVITE请求到达fs的5080端口,即external这个Profile,external不会对来话进行鉴权,直接进行路由;
  2. external.xmlcontext标签中配置了路由,以默认配置为例:<param name="context" value="public">,那么就会去diaplan/public.xml中查找路由,路由中设定了接下来的操作,是转到一个本地用户,还是继续bridge到其他地方;
  3. 如果是路由将请求转向一个本地用户(例如user/1000),那么将会找到这个用户的配置文件1000.xml,并根据1000.xmluser_context标签的配置继续进行路由(参考上面内部用户互拨流程);
  • 如果送到5060端口:
  1. 外部的INVITE请求到达fs的5060端口,即internal这个Profile,internal会对来话进行鉴权;
  2. 先ACL鉴权,再Digest鉴权。如果INVITE请求发送者的ip在autoload_configs/acl.conf.xml中配置过,则ACL鉴权通过,直接根据external.xmlcontext标签的配置进行路由;如果未通过ACL鉴权则进行Digest鉴权,如果通过Digest鉴权的认证就会找到一个内部用户(例如user/1000),进而根据其用户目录(即1000.xml)中user_context标签的配置进行路由。
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值