FreeSWITCH如何强制每路新出局呼叫使用独立TCP/TLS连接实现SBC负载均衡
FreeSWITCH 双节点SBC出局呼叫负载均衡配置说明
问题根因
FreeSWITCH 的 Sofia SIP 协议栈默认会复用相同目的地址的已建立 TCP/TLS 连接,所有出局呼叫的 SIP 信令都会走同一个连接,最终流量全部发往该连接对应的 SBC 单节点,无法利用双节点的负载均衡能力。
可行实现方案
1. 关闭对应链路的连接复用能力
根据你的出局配置方式,可选择修改全局SIP Profile或者单条SIP Gateway的配置:
- 全局修改:在用于出局的 SIP Profile(默认路径为
conf/sip_profiles/external.xml)的配置块中添加:- 普通TCP传输场景:
tcp-connection-reuse=false - TLS传输场景:
tls-connection-reuse=false
- 普通TCP传输场景:
- 单网关修改:仅针对对接双SBC的这条出局网关,在默认路径
conf/sip_profiles/external/下对应的gateway配置文件中添加上述两个参数,不影响其他出局链路的原有连接复用逻辑。
该配置默认值为true,修改为false后,Sofia栈不会主动复用已建立的连接,每路新呼叫会优先发起新的连接请求。若使用的FreeSWITCH版本低于1.6,不支持上述连接复用配置,可通过定期触发Sofia栈清空已建立的TCP连接,配合DNS轮询实现分流,不过该方案会有短暂的呼叫中断风险,不建议生产环境使用。
2. 配合地址轮询实现节点分流
仅关闭连接复用还不够,需要确保FreeSWITCH能获取到两个SBC节点的地址,避免所有新连接都发起给同一个节点:
- 若双SBC使用同一域名对外提供服务,调小SIP Profile的DNS缓存配置,可添加
dns-cache-min=10、dns-cache-max=10,让FreeSWITCH每10秒重新解析一次SBC域名,拿到不同的节点IP发起新连接 - 若双SBC有独立的IP/域名,可在Dialplan的拨号逻辑中实现轮询调度,每次呼叫按顺序/随机选择其中一个SBC地址作为目的方,自然会建立对应节点的独立TCP连接。
注意事项
- 关闭连接复用会增加每次呼叫的TCP/TLS握手开销,若单节点并发呼叫量超过1000路以上,需要提前评估服务器的端口占用、连接数压力
- 若SBC自身有长连接保活逻辑,可适当调小SIP Profile的
tcp-keepalive间隔参数,避免旧连接被长期占用。
内容的提问来源于stack exchange,提问作者Sharath
相关产品推荐
相关产品推荐

