SIP 协议路由规则详解

文章目录

  • SIP 路由关键字段
  • SIP 路由图解

SIP 路由关键字段

SIP 协议实际上和 HTTP 类似,都是基于文本、可阅读的应用层协议,二者的不同之处在于 SIP 协议是有状态的。在 SIP 协议中,影响报文路由的相关字段如下表所示,总结起来如下:

  1. SIP 请求(INVITE、ACK 等带 Method 的包)
    请求路由同时受到 Request-URI 和 Route 头的影响,其中 Route 的优先级更高。Route 为之前请求的对应响应中的 Record-Route 复制而来,SIP 请求每抵达一个 SIP 服务器,该服务器就会将自己的地址从 Route 中移除;Request-URI 则会被之前的交互报文中对端的 Contact 替换
  2. SIP 响应(180、200 等带状态码的包)
    响应路由只受到 Via 头影响,SIP 响应包会沿着 Via 记录的地址依次返回服务器,每返回到一个 SIP 服务器,该服务器就会把自己的地址从响应报文的 Via 中移除
字段 解释 功能
Request-URI SIP 请求报文的请求行格式为 METHOD Request-URI SIP-Version,例如请求行 INVITE sip:[email protected]:5080 SIP/2.0sip:[email protected]:5080 就是 Request-URI Request-URI 标识了报文的目标地址,如果在当次请求之前 SIP 通信双方已经进行过交互,则之前响应中的 Contact 会被复制为 Request-URI。在路由规则上,如果报文中不存在 Route 字段,则请求会被直接发往 Request-URI 指向的地址
Route SIP 请求报文的请求头,可存在多个 Route 字段标识了SIP 请求必须要经过的 SIP 服务器地址,该字段受到在本次请求之前的响应中的 Record-Route 字段影响。SIP 请求每到达一个 Route 指向的 SIP 服务器,该 SIP 服务器就会从 Route 中移除自己的地址
Via SIP 请求、响应报文的头,可存在多个 Via 被 SIP 服务器插入请求报文中,标识了请求经过的 SIP 服务器,可以用来检查路由环。该字段头只会影响当前请求的响应的路由,SIP 响应沿着 Via 从上到下原路返回,每经过一个 SIP 服务器,该服务器就会将响应报文 Via 中属于自己的地址移除
Record-Route SIP 请求、响应报文头,可存在多个 Record-Route 一般是被 SIP 代理服务器插入到请求中的,这个字段表明当前代理服务器关心这个 SIP 会话后续的请求,强制后续 ACK 、BYE 之类的请求必须要经过自己这边。该字段会随着响应报文回到最初发起请求的 SIP 端,并被复制到后续请求的 Route 头域中
Contact SIP 请求、响应报文的头 表明 SIP 终端的联系地址,请求响应的双方都会将自己的 Contact 放在报文中,该字段将会影响双方后续请求的 Request-URI

SIP 路由图解

以下是一个 SIP 会话建立的交互时序图,其中涉及到了一个 FreeSWITCH 服务器、一个 SIP 代理服务器以及一个 SIP 终端,笔者将其大致划分为 3 个部分:

  1. INVITE 转发
    1. INVITE 请求从 FreeSWITCH 服务器发出,此时请求报文中的 Request-URI 为 sip:[email protected]:5080,Via 只有一个 127.0.0.1 表明请求只经过了一个 FreeSWITCH 服务器
    2. SIP 代理服务收到 INVITE 请求,首先将自己的地址加入到 Via 中,随后又将其加入到 Record-Route 头表明自己关心这个会话的后续请求。最后,SIP 代理服务器将请求的 Request-URI 替换为目标 SIP 终端的真实地址,并按照路由规则将请求转发到当前 Request-URI 指向的 SIP 终端
  2. 200 响应
    1. SIP 终端收到 INVITE 请求后,首先开始振铃,并将 180 响应包通过 Via 记录的地址一层层返回。当用户接通后,SIP 终端才产生 200 响应报文,并将自身的 Contact 和收到的 INVITE 请求中携带的 Record-Route 一并封装到报文中,完成后沿着 Via 记录将响应送回到 SIP 代理服务器
    2. SIP 代理服务收到 200 响应后,首先将自身的地址从 Via 中移除,然后继续沿着 Via 将报文送回到 FreeSWITCH 服务器
  3. ACK 转发
    1. FreeSWITCH 收到 200 响应后,判断 SIP 会话可以建立,则生成 ACK 包与 SIP 终端确认。此时之前 INVITE 请求对应的 200 响应中的 Contact 被作为 ACK 请求的 Request-URI,其中的 Record-Route 则被复制为 ACK 请求的 Route 头。ACK 请求报文生成完毕,按照 Route 头优先级高于 Request-URI 的路由规则,请求包被发往 SIP 代理服务器
    2. SIP 代理服务器收到 ACK 请求包,首先将自己的地址从 Route 中移除,此时 Route 中已经没有数据,则根据路由规则将请求转发给 Request-URI 指向的 SIP 终端即可

SIP 协议路由规则详解_第1张图片

你可能感兴趣的:(随笔,Web,基础,SIP,SIP路由)