1.4 Kamailio基本架构
类似于FreeSWITCH,Kamailio也是由核心和可加载模块组成的。Kamailio的核心非常短小精悍,负责基本的SIP消息处理,而模块则扩展了核心的功能。Kamailio的模块实现了一些命令和函数,可以在配置文件(或称脚本)中使用,而配置文件则是这些命令和函数的黏合剂,实现相应的业务逻辑。
Kamailio的配置文件默认为kamailio.cfg,由以下几部分组成。
□ 全局定义:配置全局参数,如日志、调试级别、监听的IP地址和端口等。全局参数影响Kamailio核心以及所有模块。
□ 模块:模块使用loadmodule指令加载,加载后就可以使用模块里面的函数。
□ 模块配置:可以使用modparam))函数配置模块的参数,如“modparam)模块名,参数名, 参数值)”。
□ 主路由块:处理SIP请求,是最先接触到SIP消息的地方。
□ 次级路由块:类似于子函数,可以使用route()命令定义其他路由块。
□ 回复路由块:用于处理临时或最终响应的SIP消息(如200 OK等)。
□ 失败路由块:用于处理失败或异常,如忙或超时等。
□ 分支路由块:在对SIP进行Fork操作的时候,处理每个分支的逻辑。
□ 本地路由块:用于在Kamailio内部产生一条通过TM模块主动发送的消息(仅在作为UAS时)。
配置文件使用类似C语言的语法实现,示例如下(仅作为示例,并不是完整的配置):
从这里可以看出,写Kamailio的配置文件基本上相当于用C语言写程序,所以,不仅需要懂SIP,还需要懂Kamailio的各种路由逻辑,即需要学习这门新的配置“语言”,这对维护人员或程序员来说要求还是比较高的。如果本书的名字叫“Kamailio从入门到放弃”,那本书到这里就可以结束了。但如果你不言放弃,那么请继续学习,后面还有更有趣的内容等着你。
[1]参见https://www.kamailio.org/。
[2]想了解更多FreeSWITCH相关知识的话,可参考笔者所著的《FreeSWITCH权威指南》。
[3]参见https://www.kamailio.org/w/2021/09/kamailio-20-years-of-development/。
[4]Kamailio由OpenSER改名而来。Kamailio意为讲话、交流。这个名字在欧洲和北美以及全球范围内有其独特性,也契合软件本身的意义,不失为一个好名字。参见https://www.kamailio.org/w/openser-renamed-to-kamailio/。另外,可以到https://www.kamailio.org/pub/kamailio-jingle/页面上听一听Kamailio的正宗发音。
[5]参见https://www.voip-info.org/about-openser。
[6]至于分裂的“恩怨”我们不得而知,现在两个团队都分别有年度会议——Kamailio World和OpenSIPS Summit,每年的ClueCon年度会议上他们也都会有各自的主题演讲。
[7]参见http://tools.ietf.org/html/rfc2543。
[8]参见http://tools.ietf.org/html/rfc3261。
[9]参见http://tools.ietf.org/html/rfc4566。
[10]参见http://tools.ietf.org/html/rfc4579。
[11]Henning Schulzrinne教授是多媒体领域的先驱人物。他是IEEE通信协会互联网技术委员会的联合主席,同时也是Journal of Communications and Networks的编辑。他领导和开发了VoIP协议,并为SIP、RTP和RTSP等多媒体领域中的关键网络传输协议做出了重要贡献。他已发表250余篇期刊会议论文,以及70多个RFC标准。
[12]参见https://mp.weixin.qq.com/s/ZoERYGOX1DQm5jstP33fXA。
[13]全称是User Agent,即用户代理,与HTTP协议中的UA类似。浏览器就是一个UA。
[14]即Pre-ACK,在IMS中常用,用于对与早期媒体(如回铃音、彩铃、呼叫不通的提示音)相关的临时消息(180或183消息)等进行证实,又称为100rel(100%Reliability,百分之百可靠)。
[15]某些服务器在收到呼叫请求时会检查主叫是否已注册,若未注册则不允许继续呼叫,这是策略问题,不是必做事项。
[16]参见http://tools.ietf.org/html/rfc3264。
[17]严格来说应该是HTTP 2.0及以下版本是用TCP承载的,从3.0版本开始,HTTP开始基于QUIC协议实现,这是使用UDP承载的。
[18]当然,仁者见仁,智者见智。笔者也听有人说过由于使用了TCP,客户端可以不用总发注册消息来保持连接或穿越NAT等,反而节省了资源。可惜找不到原文出处了。
[19]参见http://zh.wikipedia.org/wiki/安全套接层。
[20]参见http://datatracker.ietf.org/doc/draft-ietf-sipcore-sip-websocket/。
[21]参见http://www.webrtc.org/http://zh.wikipedia.org/wiki/WebRTC。