SIP代理服务器(2)

4请求转发

对于上一步确定的每一个目的地,proxy转发请求都遵循下列步骤:
1)、 拷贝一个接收到的请求
2)、 更新Request-URI
3)、 更新Max-Forwards头域
4)、 可选增加一个Record-Route头域
5)、 可选增加附加的头域
6)、 路由信息后处理
7)、 决定下一个节点地址、端口、通讯协议。
8)、 增加一个Via头域值
9)、 如果需要,增加一个Content-Length头域
10)、 转发这个新的请求
11)、 设置定时器C
(2) 更新Request-URI
在拷贝好的请求中的Request-URI必须用目的地的URI进行替换。
(3) Max-Forwards
如果拷贝的头域包含一个Max-Forwards,proxy必须把这个域值减一。
如果拷贝的头域没有包含一个Max-Forwards头域,proxy必须自己增加一个头域,缺省值是70。现在有一些UA不会在请求中填写Max-Forwards头域。
(4)Record-Route
在建立一个对话的请求时,如果希望保留这个请求创建的对话中,后续的请求依旧是要经过本proxy,那么本proxy必须增加一个Record-Route头域值在这个拷贝中,并且增加的这个头域值应当是在其他现存的Record-Route头域之前。
而在对话建立之后的请求中,即使不再增加Record-Route,对话之中的请求还是会经过该代理服务器,除非终端UA重建一个对话。
在Record-Route头域中防止的URI必须是SIP或者SIPSURI。这个URI必须包含一个lr参数。
当proxy需要查看所有对话中的消息的时候,我们就需要Record-routeing,即一般在建立对话的请求INVITE中包含Record-Route头域。
(6)处理路由信息
如果请求的拷贝中包含了Route头域,这个proxy必须检查这个Route头域的第一个值。如果这个URI并没有包含lr参数,那么proxy必须根据下列步骤修改这个请求:
- proxy必须把Request-URI放在Route头域中的最后一个值。
-proxy必须把第一个Route头域的值放在Request-URI中,并且从Route头域中删去。
(7)确定下一个节点的地址,端口和通讯协议。
proxy可以有自己的策略来决定发送请求到特定的IP地址,端口和transport,可以和Route的值或者Request-URI的值无关。
proxy还可以应用RFC 3263的步骤来决定应当向哪里发送这个请求。
(8)增加一个Via头域值 。
proxy必须在请求的拷贝中增加一个Via头域值,并且在其他Via头域值之前增加。proxy需要计算自己的分支参数,并且应当是全局唯一的分支,并且包含必要的magiccookie。
在proxy构造分支参数的值上,有一个附加的约束,用来进行循环的检测。一个要检测循环的proxy应当创建一个由两部分组成的分支参数。第二部分是用来做循环检测的,并且是从螺旋中判定是否存在循环。
(8)设置定时器C。
为了能够处理INVITE请求没有产生终结应答的情况,TU使用一个定时器。

5应答的处理
当proxy收到一个应答的时候,它首先尝试定位一个与这个应答匹配的客户端事务。如果没有匹配,proxy必须作为无状态的proxy来处理这个应答(即使这个应答是信息性质的应答)。如果与应答匹配的客户端事务找到了,那么这个应答将转给这个客户端事务进行处理。
当客户端事务把应答交给proxy层,将会执行下列步骤:
1)、 寻找适当的应答上下文。
2)、 用临时应答来更新定时器C
3)、 从最上边移除Via
4)、 在应答上下文中增加应答
5)、 检查这个应答是否需要立刻发送
6)、 如果需要,从应答上下文中选择最好的终结应答。
7)、 需要合并认证头域值。
8)、 可选的重写Record-Route头域值
9)、 转发应答
10)、 产生合适的CANCEL请求。

(3)从最上边移除Via
如果在这个应答中没有这个Via头域值,那么应答的含义就是说这个应答不应当被这个proxy转发。
(4)在应答上下文中增加应答
收到的终结应答都会保存在应答的上下文中,直到收到一个由服务端事务产生的针对这个上下文的终结应答为止。这个应答是从那个服务端事务中收到最佳终结应答的一个候选。即使这个应答不会被选中作为最佳应答,这个应答的信息也需要用来构造成为最佳应答。
(5)检查这个应答是否需要立刻发送
当终结应答到达服务端事务的时候,下列应答包必须立刻转发。
- 任何非100(trying)的临时应答
- 任何2xx应答。
如果收到一个6xx应答,那么就不立刻进行转发,如果是有状态的proxy,那么还需要cancel所有的依赖于这个事务的客户端(在10节中描述的那样),并且不能在上下文中创建新的分支。
在服务端事务上发送了终结应答之后,下列的应答应当立刻被发送:
- 任何给INVITE请求的2xx应答。
一个有状态的proxy必须不能立刻转发其他的应答。特别是,一个有状态的poxy必须不能转发任何100(Trying)应答。这些应答是作为后续将被转发”最佳”应答的候选,通过上边的”在上下文中增加应答”的步骤增加到应答上下文中。
(6)选择最佳的应答 (略)
(8)Record-Route
如果最终发送的应答中包含Record-Route头域值,并且是这个proxy所原创提供的值,那么在发送这个应答前,proxy可能需要重写这个值。
(9)转发应答
当”合并认证头域”和”Record-Route”步骤完成以后,proxy可以对这个应答做其他的附加处理。但是这个proxy不能增加、修改、删除消息体。并且除非另有指示,除了Via头域值之外,proxy不能删除任何头域值。
proxy必须把应答传递到跟这个应答上下文相关的服务端事务。这会导致应答发送到最上的Via头域值的地方。

6Proxy Route处理的总结
在没有本地策略的情况下,proxy对于包含Route头域的请求处理可以归结于如下的步骤:
1、proxy会检查Request-URI。如果它指向的是本proxy所负责的区域,那么proxy会用位置服务的结果来替换这个URI。否则,proxy不改变这个URI。
2、proxy会检查Route头域的最上URI。如果这个URI指向这个proxy,这个proxy从Route头域中移除(这个路由节点已经到达)。
3、proxy会转发请求到最上的Route头域值所标志的URI,或者Request-URI(如果没有Route头域)。proxy通过RFC3263的步骤来产生地址,端口,通讯协议等等用来转发请求所必须的参数。

如果在请求的路径中,没有严格路由节点,Request-URI会始终标志着请求的目的地。

7无状态的Proxy
当作为无状态的时候,proxy就是一个简单的消息转发者。很多无状态的处理步骤和有状态的时候很类似。不同的地方在下边描述。
一个无状态的proxy并没有事务的概念,或者用于描述有状态proxy行为的应答上下文。相反的是,无状态的proxy处理消息,无论是请求还是应答,都是直接从通讯层处理的。当然,无状态proxy自己也不重发这些消息。他们只是转发他们收到的任何重发的消息(他们本身并没有能力来分辩那些消息是重发的,那些消息是原始消息)。进一步说,当无状态的处理一个请求的时候,这个节点并不产生它自己的100(Trying)或者其他临时应答。

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

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

相关文章

sklearn svm 调参_SVM(Support Vector Machine)

SVM是一种二元分类模型(当然它也可以处理回归问题),它通过训练样本寻找分隔两类样本的最优决策边界(超平面),使得两类样本距离决策边界的距离最远(例如H3)。其中距离决策边界最近的样本称为支持向量(即深色的苹果和香蕉),支持向量所在的与决策…

SAGA-GIS软件下载

官网: SAGA - System for Automated Geoscientific Analyseshttps://saga-gis.sourceforge.io/en/index.html点击下载按钮 点击后等几秒即可下载 下载时间过长 下载完解压即可使用

SIP路由

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

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请求的最大用处是取消需要服务器长时间处理的请求…