SIP路由

本文主要讨论的是跟SIP消息发送的路由选择和相关头域。SIP消息传输路径依靠的是路由集和目标地址(remotetargetURI)。主要参考的是RFC中的第八章(一般用户代理行为)、第十二章(对话)、第十三四章(会话)、十六章(Proxy行为)。

 

重要概念
Route Set: 路由集。路由集合是一个顺序的SIP或者SIPSURI。这些URI描述了传递一个请求所必须经历的代理列表。一个路由集可以是自适应的,因为包头中包含了Record-Route(记录路由),也可以是依赖配置得到的。(不包括目标地址)

 

相关头域说明
Request-URI:目标用户或者服务的地址。
Via:Via头域是用来描述请求当前经历的路径的,并且标志了应答所应当经过的路径。Via头域的branchID参数提供了事务的标志,并且用于proxy来检查循环路由。只有当需要通过选择传输设备到达下一个节点(hop)的时候,才需要在头域中包含Via域。
Contact:Contact头域提供了一个URI,指明了请求的资源或请求发起者,这个URI的含义取决于是在请求还是在应答中。
Record-Route:Record-Route头域是proxy在请求中增加的,用来强制会话中的后续请求经过本proxy的。
Route:Route头域用于强制一个请求经过一个proxy路由列表。

 

严格路由和松路由处理
1 严格路由:Route头域中的值中包含lr参数部分为严格路由。
如果Route头域的第一个值为严格路由,那么UA或Proxy必须根据下列步骤修改这个请求:
- 必须把Request-URI放在Route头域中的最后一个值。
-必须把第一个Route头域的值放在Request-URI中,并且从Route头域中删去。
2 松路由:Route头域中的值中不包含lr参数部分为松路由。
如果Route头域的第一个值为松路由,那么UA或Proxy必须根据下列步骤修改这个请求:
- 如果跟自身URI相符,则把第一个Route头域的值删掉。

 

一般UA行为
1UAC
1.1 发起请求时:(对话之外)
Request-URI(必选):最开始的Request-URI头域应该是TO头域的的值。在一些特定的情况下,预先设置的路由集(route-set)会影响消息中的Request-URI:如果预设路由集的第一项是严格路由,则Request-URI值被修改为路由集的第一个值。
Via(必选):当UAC创建一个请求,它必须在头域中添加一个Via域。
Contact(必选):Contact头域提供了访问后续请求的特定UA实例的联系方法。
Route(可选):预先设置路由集。

此时路由集为预先设置的路由集。

1.2发起请求时:(对话之内)

此时路由集为应答的路由集。

Route:由应答重构的路由集,即对话的路由集,如果是Route由Record-Route创建的,请求中必须包含该头域。
Contact:对话的远端地址。
在对话中的请求可以包含Record-Route和Contact头域。不过,虽然他们会修改remotetarget的URI,但是这些请求也不会导致对话的路由集被改变。
需要注意的是,虽然UAC会尝试新的地址(处理3xx应答的时候),但是它依旧使用对话内的路由集合来构造请求的Route头域。

1.3处理应答
remote targetURI必须设置成为应答中的Contact头域的URI。当UAC收到一个刷新target请求的2xx应答的时候,如果对话的remotetargetURI存在,那么它必须用这个应答的Contact头域的值来替换对话的remotetarget URI,并以此值修改对话的目标地址。
如果应答中含有Record-Route头域,则将该头域的顺序重头到尾颠倒,但内容不变,此时得到的结果为新的路由集,并以此值修改对话的路由集;如果在应答中没有Record-Route头域,那么这个路由集必须设置成为空集合。这个路由集合即便是空的,为了以后的对话中的请求,也要覆盖任何预先存在(pre-existing)的路由集合。

此时路由集为对话的路由集。

 

可见路由集是在对话建立中完成,在该对话中该路由集不变,而对话的目标地址属性却是可修改的。

 

2 UAS
当UAS接收到一个target刷新请求的时候,如果请求中存在Contact头域,它必须用Contact头域中的URI来替换对话的remotetarget URI。
UAS必须拷贝所有的请求中的Record-Route头域到应答中去(包括URI,URI参数,和其他任何Record-Route头域的参数,无论UAS是不是认识的参数都需要原样拷贝),并且必须维持这些参数的顺序。并按照此方法构建对话的路由集。
UAS必须增加一个Contact头域给应答。这个Contact头域包含一个UAS在后续对话请求中接收请求的地址(这个包含了给INVITE请求的2xx应答的ACK请求处理的地址)。
请求中的Via头域原封不动的移到应答中。

 

UAS存储路由集和远端目的地址是为了在对话中发起新的请求时选择路径用。

 

Proxy行为
1请求消息
必须按照以下步骤:
1.1 路由信息预处理
根据前面严格路由的做法,proxy必须检查请求中的Request-URI部分。如果Request-URI包含了一个本proxy早先放在Record-Route头域中的值(参见16.6,4),
proxy必须用Route头域中的最后一个值来替换Request-URI,并且从Route头域中删去这个值。
如果Route头域的第一个值就是这个proxy,那么proxy必须从请求中把它移去。
1.2 确定请求的目的
如果Request-URI的区域并非本proxy负责的区域,那么Request-URI必须放在目标集合中,并且作为唯一一个目标URI。
如果请求的目标集合没有像上边讲述的这样预先设定,那么这就意味着proxy是负责Request-URI所指明的区域的,并且proxy可以用任何机制来决定往哪里发送这个请求。
通过这些机制,我们可以有一个可能的目的地列表,他们的URI被增加到目的地集合。
1.3 请求转发
当目的地集合不是空的时候,proxy可以开始转发这个请求。有状态的proxy可以按照任意的顺序处理这个目的地集合。
在拷贝好的请求中的Request-URI必须用目的地的URI进行替换。
如果希望保留这个请求创建的对话中,后续的请求依旧是要经过本proxy,那么本proxy必须增加一个Record-Route头域值在这个拷贝中,并且增加的这个头域值应当是在其他现存的Record-Route头域之前。
如果这个请求已经是一个对话的一部分,proxy如果希望以后这个对话的请求依旧经过本proxy,那么proxy应当增加一个Record-Route头域值。以上可知,普通的终端操作中,这些Record-Route头域值不会对终端使用的路由集合造成任何影响。
proxy必须在请求的拷贝中增加一个Via头域值,并且在其他Via头域值之前增加。
2应答消息
proxy从应答中移去Via头域中最上的值。如果在这个应答中没有这个Via头域值,那么应答的含义就是说这个应答不应当被这个proxy转发。

 

如何选择发送消息的下一节地址
请求消息
消息发送的地址为第一个Route头域(如果存在),或者在请求的Request-URI(如果Route头域不存在)。
在建立对话的请求中,如果请求没有包含Route头域,那么就没有对额外的目的地有什么其他的限制了。这个就提供了一个简单的外发(outbound)proxy的事前路由的选择。但是,用这样的方法配置一个外发proxy是不推荐的;应该由单个UPI规定的预先设定的路由集来指定外发proxy。如果请求包含了Route头域,请求应该发送到Route头域最上边的一个位置,但是请求也可能被发给由RFC3261约定的Route或者Request-URI所指定的服务器(同RFC2543定义的相反)。特别的,一个配置了外发proxy的UAC应该首先尝试把请求发送给由第一个Route头域值指定的位置,而不是采用把所有消息都发给外发proxy的策略。这就保证了外发的proxy通过不增加Record-Route头域而不参与后续请求的路径。这个也允许让不能分析第一个RouteURI的终端,把请求交给外发proxy来发送。
应答消息
消息发送的地址为请求消息的第一个Via的URI。

 

参考
RFC3261

 

存在的问题
因为当前实现方案中,Request-URI和Route都作为当前路由选择的因素,而为了向后兼容RFC2543,严格路由在路由过程中修改Request-URI,导致了路由选择的混乱。虽然现在使用了松动的路由选择方式可以解决这个问题(严格区分Request-URI和Route的作用域,前者为目标地址,而Route为到达目标要经过的代理列表,后者不应影响前者),但该方式只存在于对话内的请求,而该修

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVC 入门之V

1&#xff0c;登录页面 <% page language"java" import"java.util.*" pageEncoding"gbk" errorPage"error.jsp"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.…

使用优化的基于模糊规则的特征选择技术和基于树的集成方法进行山洪敏感性建模--文献阅读

文章连接 Flash flood susceptibility modeling using an optimized fuzzy rule based feature selection technique and tree based ensemble methods - ScienceDirecthttps://www.sciencedirect.com/science/article/pii/S0048969719309349?via%3Dihub#bb0310 解决问题 在…

python 曲面_Python之OpenGL笔记(35):曲面物体的构建

一、目的1、曲面物体的构建画球体&#xff1b;2、棋盘纹理着色器应用&#xff1b;二、程序运行结果棋盘纹理着色器应用三、曲面物体的构建基本原理吴亚峰《OpenGL ES 3.x游戏开发》(上卷)内容OpenGL 中任何形状的 3D 物体都是用三角形拼凑而成的&#xff0c;因此&#xff0c;构…

了解PRACK

概述SIP定义了两种应答&#xff1a;临时&#xff08;provisional)和最终&#xff08;final&#xff09;。最终应答传送的是请求处理的结果&#xff0c;是可靠性的&#xff08;reliably&#xff09;。而临时应答传送的是处理过程的信息&#xff0c;由RFC3261是非可靠的。但是由现…

Silverlight实例教程 - Out of Browser开篇

众所周知&#xff0c;学习一门IT技术&#xff0c;最关键的是实践&#xff0c;无论是软件开发还是网络调试&#xff0c;只要在真实环境下勤于动手和思考&#xff0c;很快就能掌握一门技术&#xff0c;Silverlight也不例外。为了帮助更多朋友快速学习掌握Silverlight应用开发&…

河流水质指标预测与不确定性分析:机器学习模型的比较研究--文献阅读

电导率 (EC)、氢气功率 (pH)、溶解氧 (DO)、总溶解固体 (TDS)、硫酸盐 (SO4)、镁 (Mg)、氯 (Cl)、总大肠菌群 (TC) 和生化需氧量 (BOD) DO、BOD、化学需氧量 (COD)、pH、硝酸盐 (NO3) 和悬浮固体 (SS)

python科学计算三剑客_1-python数据分析-数据分析介绍、数据分析三剑客之NumPy

数据分析三剑客numpypandas(重点)matplotlibnumpy模块NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。侧重在于数值计算&#xff0c;也是大部分Python科学计算库的基础&#xff0c;多用于在大型、多维数组上执行的数值运算。重点numpy数组的创建numpy索引和切片…

SIP可靠性(SIP Reliability)

根据RFC3261&#xff0c;SIPUA必须支持TCP及UDP底层传输协议。这两种方式除了使用方式不一样之外&#xff0c;对SIP协议自身的影响主要体现在可靠性处理上。 SIP可靠性机制主要是为了支持不可靠传输层协议&#xff0c;如UDP。当SIP使用的传输层协议为TCP或TLS时&#xff0c;这种…

可以无限增加iPhone 的图标吗?

可以无限增加iPhone 的图标吗?iPhone屏幕上每个图标都对应一个应用程序&#xff0c;目前苹果商店中应用程序数量已经超过40万个&#xff0c;我们又能在手机里放多少呢&#xff1f;有人可能会说那要取决于iPhone的存储容量有多大&#xff0c;确实如此&#xff0c;那么如果假设空…

在日本山区流域使用支持向量机和 bagging、boosting 和 stacking 集成机器学习框架改进滑坡评估--文献阅读

为了在基于过程的模型中准确表示边坡稳定性&#xff0c;有必要包含大量涉及滑坡几何形状和内部结构的局部特征的特征。这包括但不限于斜坡的分层和不连续性、运动裂缝、裂片、陡坡、地垒/地堑结构、降雨、空气和土壤温度、土壤水分含量、许多点的地下水位、地表和深度但是&…

android 蒙版图片带拖动_推荐一个好用小巧的Android引导蒙版(浮层)库

更新&#xff1a;目前该库已更新v2.0版本&#xff0c;修改了调用api&#xff0c;详细使用可以看&#xff1a;可能是最好用的Android引导层库前言每当一个项目开发一个新功能&#xff0c;总会想办法及时让用户得知有这样一个新功能&#xff0c;这时通常会采用引导页或者蒙版(浮层…

用户代理行为

概述 用户代理分两种&#xff1a;UAC和UAS。区分的依据在于请求方和响应方。 当一个请求发生之时&#xff0c;即使用某个方法&#xff0c;根据请求方和响应方产生了UAC和UAS&#xff0c;从而可以建立起事务&#xff08;Transaction&#xff09;来。所以UAC和UAS是对某个事务而言…

AX 2009 界面伸缩功能

界面伸缩功能 在一个界面下&#xff0c;放置多个Grid之后&#xff0c;数据太多&#xff0c;要有个能推拉伸缩的功能&#xff0c;如下图&#xff1a; 中间横条可以上下拉动&#xff0c;折叠处可以关闭显示整个Grid 横条要代码实现&#xff0c;折叠只要设置一下Group就行。 纵向空…

使用增强回归树和随机森林模型进行溪流水质预测--文献阅读

流域特征和气候变量&#xff08;例如地形、土壤、气候数据&#xff09;也会影响河流水质。例如&#xff0c;陡坡可能会通过将污染物转移到溪流中来影响溪流水质&#xff0c;从而导致水质恶化。同样&#xff0c;土壤特性也会影响水质。例如&#xff0c;以母岩为主的流域显示出较…

解决方案架构师我需要懂代码吗_架构师不写代码,能行吗?

原标题&#xff1a;架构师不写代码&#xff0c;能行吗&#xff1f;从什么时候起&#xff0c;技术角色的提升就意味着脱离技术与交付&#xff1f;CTO 不写代码已经引起诸多争议了&#xff0c;架构师也不写代码&#xff0c;能行吗&#xff1f;就目前看来这似乎没什么问题。毕竟&a…

机器学习在地质灾害的文章--文献阅读

第一篇 Improved landslide assessment using support vector machine with bagging, boosting, and stacking ensemble machine learning framework in a mountainous watershed, Japan | SpringerLinkHeavy rainfall in mountainous terrain can trigger numerous landslide…

取消一个请求(Cancel)

CANCEL请求&#xff0c;就像名字所说的&#xff0c;是用来取消客户端发起的上一个请求的。 CANCEL请求UAS去终止上一个请求并且对上一个请求产生一个错误的应答。CANCEL对UAS已经给出终结应答的请求无效。所以&#xff0c;CANCEL请求的最大用处是取消需要服务器长时间处理的请求…

NYOJ88(数论)

题意明确&#xff0c;让计算出起始有m个金片的汉诺塔金片全部移动到另外一个针上时需要移动的最少步数是多少&#xff1f;&#xff08;由于结果太大&#xff0c;现在只要求算出结果的十进制位最后六位&#xff09; 解题思路&#xff1a;大家都很熟悉汉诺塔求移动次数公式为f(n1…

Linq 学习笔记(二)

Linq 学习笔记&#xff08;二&#xff09; 下面就来介绍一些查询的示例&#xff1a; 1。Linq查询 var racers from r in Formula1.GetChampions()where r.Wins > 15 && (r.Country "Brazil" || r.Country "Austria") select r;foreach (var …

机器学习在水文地质方面的文章--文献阅读

第一篇 Ensemble machine learning paradigms in hydrology: A review - ScienceDirecthttps://www.sciencedirect.com/science/article/pii/S0022169421003139?via%3Dihub第二篇 Stream water quality prediction using boosted regression tree and random forest models …