uac---->INVITE(invalid contact)--->Kamailio(或者FreeSWITCH)
Kamailio 路由脚本一般这样处理:
set_contact_alias();
Kamailio 把网络地址和网络端口加到 contact 头,在原来 contact 的基础上增加 alias 参数,详情可以查阅 nethelper 手册。Kamailio 一般不会记得内存里面的,加到 rr 头里面,或者加到 contact头里面。这是 Kamailio 的习惯做法。
在 WITHINDLG 路由里面这样处理:
if(!isdsturiset()) {
handle_ruri_alias();
}
同样的情况下 FreeSWITCH 处理方式是:
<action application="set" data="sip_sticky_contact=true"/>
通过设置通道变量来达到rewrite contact的目的。
查了下源码,似乎把通道变量 sip_nat_detected 设置为 true,还有 sip_route_uri 设置为 sip:+网络地址+:+网关端口(Kamailio 管这个叫 $sut)。
需要 rewrite contact 的场景比较多,不容易一一列举。
在上面的 call flow 里面如果不做 rewrite contact,后果是 uas 的后续 request(比如 re-Invite, bye等)发给了空气,到不了 uac。