文章目录
- SIP 路由关键字段
- SIP 路由图解
SIP 路由关键字段
SIP 协议实际上和 HTTP 类似,都是基于文本、可阅读的应用层协议,二者的不同之处在于 SIP 协议是有状态的
。在 SIP 协议中,影响报文路由的相关字段如下表所示,总结起来如下:
SIP 请求(INVITE、ACK 等带 Method 的包)
请求路由同时受到 Request-URI 和 Route 头的影响,其中 Route 的优先级更高。Route 为之前请求的对应响应中的 Record-Route 复制而来,SIP 请求每抵达一个 SIP 服务器,该服务器就会将自己的地址从 Route 中移除;Request-URI 则会被之前的交互报文中对端的 Contact 替换SIP 响应(180、200 等带状态码的包)
响应路由只受到 Via 头影响,SIP 响应包会沿着 Via 记录的地址依次返回服务器,每返回到一个 SIP 服务器,该服务器就会把自己的地址从响应报文的 Via 中移除
字段 | 解释 | 功能 |
---|---|---|
Request-URI | SIP 请求报文的请求行格式为 METHOD Request-URI SIP-Version ,例如请求行 INVITE sip:9@127.0.0.2:5080 SIP/2.0 中 sip:9@127.0.0.2: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 个部分:
INVITE 转发
- INVITE 请求从 FreeSWITCH 服务器发出,此时请求报文中的 Request-URI 为 sip:9@127.0.0.2:5080,Via 只有一个 127.0.0.1 表明请求只经过了一个 FreeSWITCH 服务器
- SIP 代理服务收到 INVITE 请求,首先将自己的地址加入到 Via 中,随后又将其加入到 Record-Route 头表明自己关心这个会话的后续请求。最后,SIP 代理服务器将请求的 Request-URI 替换为目标 SIP 终端的真实地址,并按照路由规则将请求转发到当前 Request-URI 指向的 SIP 终端
200 响应
- SIP 终端收到 INVITE 请求后,首先开始振铃,并将 180 响应包通过 Via 记录的地址一层层返回。当用户接通后,SIP 终端才产生 200 响应报文,并将自身的 Contact 和收到的 INVITE 请求中携带的 Record-Route 一并封装到报文中,完成后沿着 Via 记录将响应送回到 SIP 代理服务器
- SIP 代理服务收到 200 响应后,首先将自身的地址从 Via 中移除,然后继续沿着 Via 将报文送回到 FreeSWITCH 服务器
ACK 转发
- FreeSWITCH 收到 200 响应后,判断 SIP 会话可以建立,则生成 ACK 包与 SIP 终端确认。此时之前 INVITE 请求对应的 200 响应中的 Contact 被作为 ACK 请求的 Request-URI,其中的 Record-Route 则被复制为 ACK 请求的 Route 头。ACK 请求报文生成完毕,按照 Route 头优先级高于 Request-URI 的路由规则,请求包被发往 SIP 代理服务器
- SIP 代理服务器收到 ACK 请求包,首先将自己的地址从 Route 中移除,此时 Route 中已经没有数据,则根据路由规则将请求转发给 Request-URI 指向的 SIP 终端即可