您当前的位置是:  首页 > 资讯 > 文章精选 >
 首页 > 资讯 > 文章精选 >

OpenSIPS-关于请求中Record Set和Loose Route再讨论

2021-01-18 10:49:49   作者:james.zhu    来源:Asterisk开源派   评论:0  点击:


  前面的文章中介绍了关于初始请求和后续请求的处理,在初始请求和后续请求的使用中还有另外两个比较重要的关于SIP 请求路由的处理方式需要大家注意。这两个路由的概念就是Record Set和Loose Route。笔者虽然在以前的文章中多次做过介绍,但是那些介绍都是基于基本的SIP route做的介绍,没有具体到软交换层面,例如,OpenSIPS平台的具体使用方式。本文章进一步讨论关于Record Set和Loose Route的背景知识,希望能够为读者提供一个针对OpenSIPS的相对比较全面的理解。
  1SIP路由相关背景知识
  关于这些相关概念的定义和细节,读者可以参考笔者的历史文档来进一步了解关于record set 和loose route的区别以及应用场景中可能出现的问题:
  除了以上的参考链接以外,笔者这里再次多IR初始请求和SR后续请求做一点补充说明。为了判断其请求以及后续的处理流程,首先SIP 路由需要验证其请求是初始请求还是后续请求。针对loose route,如果是初始请求IR的话,初始请求创建dialog的,而后续请求则是在一个创建的dalog内的请求。因此,后续请求SR需要判断是否支持了To-tag。如果有To-tag, 则说明是一个后续请求,如果没有To-tag,说明是一个初始请求,例如, INVITE 或者SUBSCRIBE等。
  2OpenSIPS的Record route
  在介绍以上这两个概念之前,我们有必要再稍微回顾一下前面文章中所讨论的
  initinital request(IR,初始请求)和sequential requests(SR-后续请求)的基本概念。简单来说,常见的初始请求包括我们通常呼叫发起的请求-INVITE,后续请求包括挂机的BYE请求,ACK确认或者re-INVITE请求。因为双方的呼叫需要经过一个或者多个代理服务器地址,每个代理服务器地址需要对呼叫路径做一个记录。Record Set其实就是针对初始请求对呼叫路径做的一个记录值,记录值包括IP地址和对端终端的Contact地址。以下图例就是一个OpenSIPS的record route的处理流程,包括INVITE和200 OK的处理。
 
  当被呼叫方返回到呼叫方时,被呼叫方通过后续请求对呼叫方进行查询回溯,找到呼叫方地址。当然,被呼叫方返回时所使用的Record Set和呼叫方的Record Set是完全不同的,处理流程是正好相反的路径。
  3OpenSIPS  loose route示例
  和Record Set相比,loose route是一个相对比较动态灵活的路由,后续请求会使用此路由根据代理地址和RURI终端地址返回到源呼叫方地址。BYE请求就是一个典型的后续请求,它通过loose route的路径按照route set 地址组的列表返回到呼叫方终端A,以下图例就是一个OpenSIPS中关于loose route的使用示例。
  4如何处理两种路由
  前面笔者已经提及,根据SIP规范和OpenSIPS的处理流程,如果代理需要record route或者loose route时,首先需要判断支持了has_totag()。如果支持了的话,就执行后续请求的处理,否则发起一个record route执行初始请求的路由处理。在OpenSIPS中,通过route路由处理模块进行判断处理。
 
  需要注意,通过以上针对路由处理的流程可以看出,如果是初始请求(IR)的话,初始请求需要耗费更多的资源来进行验证,查询,定位等服务。如果是SR后续请求的话,它基本上不会消耗太多系统资源,它仅按照路由表返回呼叫方就可以。因此,后续请求处理速度相对比较快,也更高效。
  5其他讨论
  因为SIP规范和应用场景,以及呼叫路径的变化很大。一个SIP呼叫可以经过多个网元和多个代理服务器地址,包括SBC,防火墙等。在早期的SIP规范RFC2543中规定了比较早的route方式-strict route(严格路由), 而Loose route则是SIP v 2版本,RFC3261中所支持的比较灵活的路由方式。后者可以支持R-URI不被修改,可以兼容RFC2543中的严格路由方式。严格路由是在初始请求创建dialog之前就已经明确定义好了路由的路径以及路由表。每个代理服务器严格按照路由表指定的路径执行,如果路由路径中其中一个网元出现故障都会导致呼叫失败。另外,如果UA支持了outbound-proxy以后就会出现其他的问题。因此,为了更加灵活地支持SIP的路由策略,loose route比较好的解决了这个问题,它通过:lr参数支持,允许每个目的地地址来路由数据包,并且每个目的地都有各自的机制兼容支持了严格路由策略。关于以上讨论的具体细节,读者可以参考RFC3261-16.12了解更多规定。
  在SIP路由中,除了我们前面讨论的以上路由表以外,还有一个比较重要的定义是Via。Record route其目的是在路由消息中充当一个角色来影响Reg-URL(通过:lr参数决定request-URL。如果路由组中的第一个路由URL包含:lr, 则不会影响request-URL;如果如果路由组中的第一个路由URL不包含:lr,UA就会把第一个路由组的URL设置为request-URL,然后处理其余的路由组流程。),当然也在VIA中支持部分的描述内容。另外,VIA是被UAS用来决定响应的下一个目的地地址的,它只是不断添加代理Via地址,对Via地址不做修改,返回时删除相应的Via地址。最后,Via是基于事务层的路由记录,请求所创建的事务完成以后,Via就会被丢弃;而Record Set是基于dialog的,呼叫的路径会贯穿整个dialog中。
  6总结
  Record route和loose route在SIP 路由中分别进行不同的处理。本文章重点介绍了关于OpenSIPS中两种路由方式的区别以及发起方的不同,另外介绍了在OpenSIPS中如何发起两种路由方式,最后讨论了其他关于SIP路由,VIA一些区别。通过以上进一步的讨论,希望读者对OpenSIPS中的Record route和loose route有一个比较完整的认识,结合前面各种opensips的cfg场景配置文件能够更多了解开源OpenSIPS的使用方式。
  参考资料:
  www.opensips.org
  www.freepbx.org.cn
  www.freesbc.cn
  融合通信/IPPBX/FreePBX商业解决方案:www.hiastar.com
  最新Asterisk完整中文用户手册详解:www.asterisk.org.cn
  Freepbx/FreeSBC技术文档: www.freepbx.org.cn
  如何使用免费会话边界控制器-FreeSBC,qq技术分享群:334023047
  关注微信公众号:asterisk-cn,获得有价值的通信行业技术分享
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

相关热词搜索: OpenSIPS

上一篇:UC行业需要更多的隐私监管吗?

下一篇:最后一页

专题

CTI论坛会员企业