最近一位客户报告了一个问题:他的外线始终无法注册到VoIP运营商的网络。这让人倍感奇怪,毕竟“外线”是MSS非常基础的功能,已经和众多VoIP运营商对接过,我们从没想到过“外线注册”居然会有问题。
抓取了相应的log,发现该运营商返回了“400 Bad Request”消息,其中携带了以下原因信息:
P-Registrar-Error: Invalid CSeq number
我们检查了REGISTER消息,MSS在处理CSeq时并没有任何问题。以下是MSS消息的摘要:
==>
REGISTER sip:sip.xxx.com SIP/2.0
...
Call-ID: 18BF67854AE23D6D2CD772AFMSS002A0001.
CSeq: 13 REGISTER
...
<==
SIP/2.0 401 Unauthorized
...
Call-ID: 18BF67854AE23D6D2CD772AFMSS002A0001.
CSeq: 13 REGISTER
...
==>
REGISTER sip:sip.xxx.com SIP/2.0
...
Call-ID: 18BF67854AE23D6D2CD772AFMSS002A0001.
CSeq: 14 REGISTER
...
<==
SIP/2.0 400 Bad Request
...
Call-ID: 18BF67854AE23D6D2CD772AFMSS002A0001.
CSeq: 14 REGISTER
P-Registrar-Error: Invalid CSeq number
...
我们再次检查了RFC3261规范中的定义:
A UA MUST increment the CSeq value by one for each REGISTER request with the same Call-ID.
显然我们是完全正确的,但是为什么对端会拒绝了注册呢?
最终我们尝试修改了Call-ID参数后注册成功。这让我们更感困惑!RFC3261规范很清楚地说明了注册流程中Call-ID参数的注意事项:
All registrations from a UAC SHOULD use the same Call-ID header field value for registrations sent to a particular registrar.
我们认为这个VoIP运营商的系统是不专业的。不幸的是,该运营商很难去升级他们的系统,因此我们在MSS中增加了一个开关变量来控制这种情况:
[sip]
gVarSipRegSameDialog=0
如果您在与某些VoIP运营商系统对接时遇到类似的问题,请在“mss_var_param.ini” 文件中增加上述参数并重启MSS。