您当前的位置是:  首页 > 技术 > 企业通信 > 文摘 >
当前位置:首页 > 技术 > 企业通信 > 文摘 > 关于SIP Proxy处理中的八大疑问讨论

关于SIP Proxy处理中的八大疑问讨论

2019-03-25 14:00:46   作者:james.zhu   来源:CTI论坛   评论:0  点击:


  在SIP呼叫过程中,SIP代理服务器具有非常重要的作用。呼叫双方通过SIP代理对呼叫定位管理,在通过代理时,代理服务器可能删减一些必要的字段,也可能修改一些请求的字段,满足完成呼叫的必要条件,达成一个完整的呼叫流程。那么,为什么SIP代理服务器会修改这些需求?笔者归纳了八个非常核心的问题,理解了这基本的八个问题会帮助读者彻底了解代理的角色和修改的原因。
  前面我们很多文章是从比较大的宽泛的角度来讨论SIP呼叫。关于proxy代理的定义,我们需要从官方的定义做寻找答案。根据RFC3261的定义,SIP proxy是:
  SIP proxies are elements that route SIP requests to user agent . servers and SIP responses to user agent clients.  A request may traverse several proxies on its way to a UAS.  Each will make routing decisions, modifying the request before forwarding it to the next element.
  https://tools.ietf.org/html/rfc3261#section-16
  为了回答这几个核心的问题,今天,我们从比较细节的流程来分析呼叫处理流程的创建。首先,结合上面的图例,我们需要了解proxy在对下游UA继续发送INVITE之前,它需要做哪些方面的处理?事实上,proxy在对下游发起INVITE之前,它需要做一些预处理工作。因为需要做这些工作,所以会导致我们对proxy产生的六大疑问,这也是比较重要的关于SIP创建呼叫所经常面对的终极问题。这八个终极问题涉及了Route header,Request URL,MAX-Forwards,Via header,100 Trying,ACK直接互发。下面,我们逐一针对这些常见的问题进行比较细致的分析。
  1、为什么移除Route header
  在讨论Route功能之前,我们首先说明一下Route的基本概念。在RFC3261中规定,此头是用来强制request路由多个proxy,很多环境环境可能经过多个proxy来处理呼叫。
  The Route header field is used to force routing for a request through  the listed set of proxies.
  https://tools.ietf.org/html/rfc3261#section-20.34
  如果用户需要了解具体的测试场景,用户可以下载任意一个开源平台的测试环境来进行测试。
  在前面的文章中我们已经介绍过,如果UAC需要发起一个呼叫的话,可以通过INVITE的地址request URL来查询定位服务器和注册服务器,然后进行呼叫。实际上,我们这里忽略了一个非常核心的header-Route。大家现在看看这个基本的示例:
  在实际发起请求的过程中,如果Route存在的话,request其实首先根据Route对代理服务器发起请求,然后再发送INVITE中的具体账号信息。这里,Route可以是FQDN格式,此头则通过DNS查询来获得IP地址。
  这个请求抵达下一个proxy以前,此Route地址会在proxy中移除。因为,这个Route的任务已经完成。另外,从双方的INVITE消息中可以看出,针对这个INVITE的请求中,UAS端的消息中已经移除了Route header。
  因此,笔者提醒读者必须理解以下“黄金定律”:
  1. Route 头决定proxy下一跳的路由地址
  2. 继续下一跳之前,移除Route header
  3. Route头比request URL具有更高优先级
  4. 如果Route不存在,则使用request URL
  5. Route header支持FQDN查询处理,解析为IP地址
  6. 路由总是使用最顶端Route header地址(后面介绍)
  在以前的介绍中,我们已经介绍了Route header, request URL,Contact address和Via 地址。现在,笔者简单总结几个路由地址的区别:
  • Route header是针对下一跳的路由,如果有此头,则request会根据此header被路由到下游
  • Request URL:如果Route header不存在的话,则请求根据此header路由。
  • Contact header:终端IP地址,为其他终端提供subsequent requests返回路由,例如ACK或者BYE消息发送。
  • Via header: 支持UAC地址或者proxy地址,为下游设备提供返回响应的路由,总是从Via 顶部地址优先路由,proxy在转发到下游前移除自己的地址。
  这里我们可以看到,经过proxy到达UAS时,Route需要移除,然后根据request URL来