团队博客
从使用角度比较 Kamailio 和 OpenSIPS
小樱桃科技 2024-05
Kamailio 和 OpenSIPS 同根同源,很多语法、伪变量、模块使用方式,两者都极为相似。本文仅从使用角度对二者进行比较。但因受认识限制,描述的可能不够准确和全面,希望得到大家的批评指正。
核心、伪变量、转换函数等
- Kamailio 支持预处理,OpenSIPS 不支持预处理
- Kamailio RPC 的作用跟 OpenSIPS MI 大致相同
- Kamailio 的 route 函数不能带参数,而 OpenSIPS 则可以带参数
- 在 Kamailio $fU 和 $tU 可读可写,但在 OpenSIPS $fU 和 $tU 只读,如果需要修改主被叫号码,需要调用 uac 模块里面的函数
- Kamailio 有 $fs 伪变量(Force send socket 的缩写),OpenSIPS 3.2 和 3.4 版本则换成了 $socket_out
- Kamailio 有 $sut 伪变量(Source address as full URI 的缩写),而 OpenSIPS 用三个伪变量加到一起来与之对应($socket_in(ip), $socket_in(port), $socket_in(proto))
- Kamailio 有 Selects 变量,比如在请求路由里面执行
xlog("got $sel(msg)\n",就可以打印 SIP 消息,非常方便。而 OpenSIPS 则没有 Selects 变量
缓存
Kamailio 的 htable 模块提供缓存功能,OpenSIPS cache 函数用起来也很方便。
用户位置共享
要实现用户位置共享,Kamailio 需启用 dmq 和 dmq_uscloc 模块。OpenSIPS 则需要 proto_bin 和 clusterer 等模块。
拓扑隐藏模块
Kamailio 有 topoh、topos、topos_redis 三个拓扑隐藏模块,而 OpenSIPS 的 topology_hiding 模块貌似更实用,一是没有 RR 头(好处是包更小);二是把 Contact 头换成 OpenSIPS 自己的地址。
uac-trunk-auth
这是 uac-trunk-auth 的典型流程:
1. A -> INVITE -> Proxy B 2. A Proxy -> INVITE -> B 3. A Proxy <- 401(7) <- B 4. A Proxy -> INVITE (auth) -> B (CSeq 加一) 5. A Proxy <- 200 <- B 6. A <- 200 <- Proxy
在第 4 步时,CSeq 需要加一
OpenSIPS 需要用路由脚本实现这个加一的操作,而 Kamailio 配置 dialog 模块的一个参数即可,比较方便。
中间注册模块
OpenSIPS 有中间注册模块 mid_registrar,而 Kamailio 则无,当然可以在 Kamailio 的路由脚本里面实现该功能。
LUA 支持
OpenSIPS 虽然也支持 LUA 语言来写路由脚本,但显然 Kamailio 的 KEMI 更强大更方便。
结束语
二者能进行比较的显然不只上面提到的这些内容,比如都有 dispatcher 模块,功能大致相同,但细节不太一样。限于篇幅不再展开。
本人当然更熟悉 Kamailio 一些,但同时非常喜欢 OpenSIPS。可能有的读者会问,如果二选一该怎么办,我的回答是都可以,但有人这么说过:目前 OpenSIPS 用户数量更多,但查二者的邮件列表(Mailing List),Kamailio 程序崩溃更少一些。