2014-02-28 40 views
1

我希望在代理来自下游UAS的401响应时,对SIP代理的预期行为进行一些说明。SIP代理401响应处理

我们的SIP代理被配置为以循环方式代理下游请求。如果下游UAS响应带有401的INVITE,我希望SIP代理保持足够的状态,以便在始发上游UAC发送包含认证凭证的第二个INVITE时,选择与目标相同的UAS。

相反,我所看到的是SIP代理将代理401响应,从上游UAC接收ACK,并立即销毁与此对话有关的所有状态。然后,当上游UAC以认证证书发送第二个INVITE时,SIP代理将以循环方式转发该请求。如果我们运气好的话,SIP代理将为第二个INVITE选择相同的UAS,但大多数时候它会选择其他下游目标。

我是SIP新手,我一直在阅读RFC 3261,试图理解正确的行为应该是什么,但我没有看到明显的答案。

回答

0

我认为你真正要问的是对对话框内工作的进一步要求的理解。为此,您需要了解“Record-Route”/“Route”标题。

它确实不会响应代码是什么,对话框中的下一个请求将直接转到远程URI,除非(并且几乎总是)提供一个路由集。

从RFC 3261的部分12:

路由集合是需要被遍历以 发送给对等体的请求的服务器的列表。

从第16.6节请求转发

4. Record-Route 

    If this proxy wishes to remain on the path of future requests 
    in a dialog created by this request (assuming the request 
    creates a dialog), it MUST insert a Record-Route header field 
    value into the copy before any existing Record-Route header 
    field values, even if a Route header field is already present. 

从20.34路线

的Route头字段被用于强制通过代理的所列出的组路由用于请求 。使用 Route头域的例子在Section 16.12.1中。

从12.1.2 UAC行为

路由集合必须被设置为在记录 - 路由
头域的URI从所述响应中的列表中,以相反的顺序取出和保存 所有URI参数。如果
响应中没有Record-Route头域,那么路由集必须设置为空集。此路线设置为 即使为空,也会覆盖此对话框中未来
请求中的任何预先存在的路线集。

从16。代理路由的12汇总处理

在没有本地策略的,相反,一个
代理执行对包含Route头字段的请求的处理可以是
总结于下面的步骤。

1. The proxy will inspect the Request-URI. If it indicates a 
     resource owned by this proxy, the proxy will replace it with 
     the results of running a location service. Otherwise, the 
     proxy will not change the Request-URI. 

    2. The proxy will inspect the URI in the topmost Route header 
     field value. If it indicates this proxy, the proxy removes it 
     from the Route header field (this route node has been 
     reached). 

    3. The proxy will forward the request to the resource indicated 
     by the URI in the topmost Route header field value or in the 
     Request-URI if no Route header field is present. The proxy 
     determines the address, port and transport to use when 
     forwarding the request by applying the procedures in [4] to 
     that URI. 

看到这个example它是如何工作。

所以基本上,初始请求应该建立“路由集”,然后用于在以下请求中生成“路由”标头。

因此,对于您的问题,听起来好像“路由集”未被构建和/或被回送到响应中,或者UAC未使用远程目标和路由集来构建请求-URI和路由标题为下一个请求正确。

strict and loose routing这也有可能在这里玩的区别。我会假设你会使用lr tho。

+0

你是正确的,没有记录路由或路由头被插入交换中的任何地方。但是,我想知道为什么这是必需的。 Record-route只能通过代理插入,所以如果代理之后的下一跳不是另一个代理,而是远程URI(就像代理只是一个负载平衡器一样),那么肯定不会在记录路由头中列出。代理仍然需要记住之前的选择以正确处理第二个INVITE。 我注意到第二个INVITE没有来自第一个INVITE的“to-tag”,所以也许这是相关的? – bs1982

+0

添加一条记录 - 路线是可操作的。因此,对于可以从循环中“丢弃”的代理,是的,他们不会添加记录路由。很难知道谁在这里有问题。你可以说这是sip代理不添加到Record-Route中,你可以指责主代理处理邀请。如果认证是“很好地”实现的,那么代理获取INVITE并不重要,它应该能够验证它是否成功通过认证。 –

+0

还有一个问题,即如果请求已签名,则除非您辞职,否则无法修改请求。因此,中间代理必须是无状态的,或者知道如何验证请求。 –