问题描述:在OpenSips压力测试中,遇到uac回复ACK时,OpenSips不能正确分发给FreeSwitch。
场景:SIPp(uac) ---> OpenSips ---> FreeSwitch(2个) ---> SIPp(uas)
部署: uac(92.37) OpenSips (92.33) FreeSwtich(92.38、92.139) uas(21.28)
问题分析:
1、正常流程
(图片糙略,见谅)
UAC会在收到200 OK 之后回复ACK。(此ACK可以通过OSs转发,也可直接发给FS)
2、问题发生
此ACK包只能发到OSs这里,不会再往后走到FS。
这里有X-lite软电话呼叫、SIPp(uac)模拟呼叫抓包对比。(92.33 是 OpenSips、92.38 是 FreeSwitch)
ACK包的Request-Line 的 IP地址不对。
3、问题原因
此 ACK 包是SIPp发起的。所以从SIPp找原因。
查看uac.xml
ACK sip:[service]@[remote_host]:[remote_port] SIP/2.0 这一行脚本对应抓包里的Request-Line。也就是说问题要从这里解决。
4、解决办法
现在知道 remote_host 变量要改,那要改成什么值呢?
【知识点】ACK 的目的地址,是在其之前相邻的 200 OK 的Contact 里有指示。
所以我们应该从200 OK 包里把Contact 指定的 ip 地址拿出来,用在ACK 包的Request-Line里。
(这个 92.139 是 FS 的地址,200 OK 从FS 发出时携带上,ACK也应该回复到这个ip。)
再一个【知识点】SIPp的脚本可以使用正则匹配一个想要的内容出来。
且看:
<recv response="200" rrs="true" rtd="true">
<action>
<ereg regexp="[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}" search_in="hdr" header="Contact:" check_it="true" assign_to="1" />
<log message="CONTACT is [$1]"/> # 使用方式 [$1]
</action>
</recv>
在uac.xml 里 <recv response="200" 的地方加一个<action>使用正则进行ip的匹配。
(示例参考https://blog.csdn.net/w0z1y/article/details/85159238)
至此,得到ip 后,修改 ACK 消息的 Request-Line 如
ACK sip:[service]@[$1]:[remote_port] SIP/2.0
OK啦,问题解决了吗?有问题可留言。
此内容仅供参考,如有疏漏,望指教。欢迎转载