32秒断开可能与SIP或RTP的超时设置有关
在FreeSWITCH的生产环境中遇到了大量通话在32秒后断开的现象。通过抓包分析中发现,SIP消息中的Contact
地址被错误地设置为媒体地址。这种情况确实会导致SIP消息和媒体流的同步问题,从而引发通话中断。所以导致在发送200ok接通后,对方ack回不来,32秒后自动拆线(ACK Timeout)。
1. SIP 配置问题
SIP配置中的Contact
地址应该正确指向SIP服务器的地址,而不是媒体地址。错误的Contact
地址会导致SIP消息和媒体流的不一致,从而造成通话断开。
-
检查SIP配置:确保FreeSWITCH的SIP配置文件中
internal
和external
配置文件的Contact
地址正确设置。 -
调整SIP配置:如果你的FreeSWITCH服务器配置了多个网络接口或IP地址,确保SIP配置正确指定了应该使用的IP地址。
<param name="sip-ip" value="your_sip_server_ip"/>
<param name="sip-contact-ip" value="your_sip_server_ip"/>
2. NAT 设置问题
如果FreeSWITCH服务器位于NAT后面,NAT设置可能会导致SIP和RTP流地址不匹配。
-
检查NAT配置:确保FreeSWITCH的NAT设置正确。你可以在
internal
和external
配置文件中检查和配置NAT相关的参数。例如:<param name="nat-support" value="true"/> <param name="rtp-ip" value="your_external_ip"/>
-
使用STUN服务器:如果FreeSWITCH位于NAT后,考虑配置STUN服务器,以帮助SIP客户端和服务器正确确定公共地址。
3. RTP 流设置
RTP流的配置错误也可能导致通话中断。
-
检查RTP配置:确保RTP流的配置正确,并且SIP消息中的媒体地址与实际RTP流的地址匹配。
调整RTP设置:在FreeSWITCH的配置文件中,检查RTP设置是否正确。
<param name="rtp-ip" value="your_rtp_ip"/>
4.正确的配置方法
方法一:直接修改配置文件:
/etc/freeswitch/conf/sip_profiles/internal.xml
<!-- param name="ext-rtp-ip" value="$${external_rtp_ip}"/ -->
<param name="ext-rtp-ip" value="$${local_ip_v4}"/>
<!-- param name="ext-sip-ip" value="$${external_rtp_ip}"/ -->
<param name="ext-sip-ip" value="$${local_ip_v4}"/>
方法二、在vars配置中修改external_rtp_ip变量
位置:/etc/freeswitch/conf/vars.xml.xml
<X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=stun:stun.freeswitch.org"/>
<X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=stun:stun.freeswitch.org"/>
修改为:
<X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=192.168.1.8"/>
<X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=192.168.1.8"/>
然后重启服务器即可。
总结,遇到这种问题,最可能的原因是SIP配置中的Contact
地址设置错误,或者NAT设置不正确。检查并纠正这些配置,通常可以解决通话中断的问题。通过详细的抓包分析,可以帮助你进一步定位问题。如果问题仍然存在,提供更详细的抓包数据或日志信息,可以帮助进行更深入的排查。