Kamailio实战
上QQ阅读APP看书,第一时间看更新

Preface
前言

早就想写这样一本书了。

自《FreeSWITCH权威指南》于2014年出版以来,我收获了好多读者,也收到了很多很好的反馈,很多读者说希望能看到一本关于SIP代理服务器的书。因为随着业务规模扩大,FreeSWITCH势必要做集群,而做集群就需要一个SIP代理服务器。Kamailio是一个很好的SIP代理服务器,在过去的几年里,我们也在很多项目中用到了它。与其说为了满足读者的期盼,不如说我自己想写一本关于Kamailio的书。因为我们团队的小伙伴要看,我们给客户做培训要用,而关于Kamailio的中文资料却少之又少。

我与Kamailio的渊源

我与Kamailio的故事还得从很久以前说起。

我大学毕业后的第一份工作是在烟台电信[1]做程控交换机的运维,在大学里学的“程控数字交换与现代通信网”课程算是派上了用场。那时候,运营商使用的交换机还是程控交换机,非常庞大且笨重。我维护的交换机主要是上海贝尔S1240系列以及华为的CC08系列。感谢那些工作,让我做到了将理论与实践相结合,并对通信网和七号信令有了深入的理解。那些年,我也见证了电信改通信、通信改网通的行业变革。至于运营商混合所有制改革,那都是后来的事。

后来我又学习了Asterisk和FreeSWITCH,并加入一家北京的在线教育公司,使用FreeSWITCH做实时在线口语教学。良好的通信知识基础和开放的团队氛围让我很快学会了FreeSWITCH,并最终加入FreeSWITCH开源社区,成了FreeSWITCH开源项目的核心贡献者。我提交了很多补丁,涉及核心交换功能以及很多外围的模块,其中视频相关的代码和模块前期几乎都是我写的。后来,我整理了自己的学习笔记及博客文章,又编写了一些新内容,出版了《FreeSWITCH权威指南》一书。该书出版时我已经辞职,开始独立创业,主要提供FreeSWITCH、OpenSIPS、Kamailio相关的技术开发和咨询工作。现在我的工作主要是带领团队基于这些开源项目打造与IP-PBX、软交换和呼叫中心相关的实时通信产品和服务。

随着我对FreeSWITCH的深入理解和使用、维护的系统规模的扩大,以及客户对安全性、稳定性的要求越来越高,单机版的FreeSWITCH已经无法满足我的需求,因此,我又学习了Kamailio以及OpenSIPS,并成功将它们应用于多个大型项目中。当时的Kamailio和OpenSIPS版本都还比较低,Kamailio中还有很多处于独立目录中的OpenSER模块。也许是无知者无畏,当时我们还直接拉了Kamailio的代码按客户的要求进行大改,后来虽然测试成功了,但是我们最终决定只用FreeSWITCH,而我们编写的那些代码也没有上线。不过我们因此积累了很多宝贵的一手经验。

再后来,我们在另一个大型项目中使用了OpenSIPS,用其与FreeSWITCH配合。当时我们使用了一种非常简单但有效的架构:SIP话机使用基于UDP的SIP协议通过OpenSIPS注册到FreeSWITCH,话机做主叫时会经过OpenSIPS做负载均衡,做被叫时FreeSWITCH直接呼叫话机而不经过OpenSIPS。这种架构简单好用,一直没出过问题,直到数年后我们遇到仅支持TCP且不太规范的SIP终端。

Kamailio和OpenSIPS都是OpenSER的延续版,在最初的版本中两者其实差别不大。我在《FreeSWITCH实例解析》[2]中写过一些OpenSIPS相关的内容。至于为什么是OpenSIPS而不是Kamailio,大概是因为OpenSIPS的名字中含有SIP吧,也可能是因为我们感觉国内的OpenSIPS用户要更多一些,但无论如何总得选一个吧。实际上,两者一直在更新版本,但主要功能没多大差别,在我的项目中两者也都用过,具体用哪个主要看甲方的偏好。

我跟Kamailio和OpenSIPS的主要作者在ClueCon上见过多次面,喝过啤酒,聊过天。他们人也都很好,同是程序员,我和他们有聊不完的话题。现在,OpenSIPS团队在罗马尼亚,Kamailio主要作者则在德国柏林。2017年我们还邀请OpenSIPS开发团队到我们主办的“FreeSWITCH开发者沙龙”上做过远程演讲。

最近在项目中使用Kamailio比较多,主要是因为我比较喜欢Kamailio中的KEMI接口,可以直接用Lua语言写路由逻辑。事实上,本书将主要介绍KEMI和Lua路由脚本。

Kamailio主要是一个代理服务器(Proxy),它不会主动发起呼叫,而是对呼叫SIP消息进行转发,因此不能“开箱即用”,你需要自己写一些转发逻辑。从另一个方面来讲,如果使用Kamailio,你必将会用到像FreeSWITCH或Asterisk那样的软件。简单来讲,Kamailio与FreeSWITCH最大的不同是——前者是一个代理服务器,而后者是一个B2BUA。

或许你已经了解了FreeSWITCH,事实上,本书中将会多次提到FreeSWITCH。虽然具备FreeSWITCH基础知识并不是阅读本书的必要条件,但如果你了解FreeSWITCH,那阅读本书会事半功倍。当然,本书也可以助你深入了解SIP,进而更了解FreeSWITCH。

本书面向的读者

在开始写作本书时,Kamailio刚刚庆祝完20周岁的生日,所以我希望以本书作为献给Kamailio的生日礼物,同时希望能帮助初学者快速掌握Kamailio,帮助资深运维和开发人员深入理解和灵活使用Kamailio。

具体来说,我希望本书能对以下人员有帮助。

1)FreeSWITCH从业者

这些人大部分应该已读过我的《FreeSWITCH权威指南》。相信本书能从另一个角度、另一个维度帮助他们理解SIP,理解通信逻辑。无论最终是否使用Kamailio,本书都会给他们带来帮助。即使他们自己不使用Kamailio,他们的对端也有可能在使用Kamailio,知己知彼,百战百胜;如果自己要使用Kamailio,阅读完本书自然能事半功倍。

2)VoIP系统、软交换系统、电信设备开发人员

这些开发人员必定会与SIP打交道,有的甚至要自主研发SIP协议栈和设备,这时就要与别人对接,Kamailio可以是一个很好的测试和验证平台。另外,他山之石可以攻玉,说不定看看Kamailio的源代码能得到很多启发。无论如何,参考Kamailio的KEMI,将Lua等嵌入式脚本语言融入这些电信设备,必将大大增加系统的可扩展性和兼容性。

3)Asterisk开发者

跟大多数Asterisk开发者一样,我也是读着《Asterisk,电话未来之路》《Trixbox[3]不相信眼泪》一路走过来的。与FreeSWITCH类似,Asterisk也需要做集群,若做集群,则Kamailio是不二之选。

4)VoIP系统实施、维护人员

对于实施、维护呼叫中心、IP-PBX等系统的人员来说,本书也是不可多得的SIP教程。运维人员通常需要进行现场诊断、排错,还要分析SIP包等。扎实的SIP功底是高效做好这些事情的必要条件。Kamailio以及本书提到的一些SIP工具可以帮助模拟信令流程,进而帮助这些人更快地定位问题并排错。甚至,可以临时将Kamailio串联到系统中,处理不兼容设备间的信令适配问题。

5)电信企业的维护人员、销售人员、决策人员

广大电信企业的人员在以往的工作中积累了大量的工作经验,但往往局限于华为、中兴等设备厂家提供的解决方案和技术架构。技术瞬息万变,在市场竞争日益激烈,国内电信政策调整并逐渐宽松之际(如虚拟运营商牌照的发放),只有了解另一种解题思路,掌握新技术,才能更好地把握市场方向,为客户提供更好的服务。

6)电信企业的开发人员

现在,国内的电信企业内部都有自己的研究院,以支撑电信系统以及周边系统的选型与建设。在软件国产化、“信创”、自主可控的产业背景下,如果用到SIP处理,Kamailio当然是一个很好的选择。

7)呼叫中心从业人员

可以预见,在不远的将来,将有很多呼叫中心是基于FreeSWITCH和Kamailio开发的。而本书中丰富的基础知识和详尽的功能介绍将对使用、管理呼叫中心系统起到很好的指导作用。

8)在校教师和学生

大部分学校的教材只讲了VoIP原理及SIP,很枯燥。老师教育学生“要理论与实践相结合”,而本书正是理论与实践的最佳结合点。学生在本书中学到的知识和技能可以直接用在日后的工作中。

9)互联网RTC从业人员

随着We b RTC的飞速发展,基于互联网的实时通信也发展迅猛,各种互联网教育、直播连麦、在线音视频会议等都会使用新兴的RTC技术。但We b RTC是一个媒体层的标准,没有规定信令,而Kamailio实现了SIP over WebSocket信令,支持浏览器中的WebRTC呼叫。另外,不管使用何种信令,基于互联网的RTC系统也难免与传统的通信系统对接,深入了解SIP才能更好地做好互联网与传统电信系统的无缝互联与融合。

10)开发经理、技术决策人员

了解本书所讲的知识有助于技术选型和决策。本书虽然主要讲Kamailio,但对相关的技术和产品(如FreeSWITCH、OpenSIPS等)也都有对比和分析。全面了解各种技术有助于做出更好的决策。

11)OpenSIPS用户

Kamailio与OpenSIPS同根同源,很多概念和理论都是相通的。虽然本书的示例主要使用KEMI,在OpenSIPS中还没有对应的方法,但是,在呼叫流程的处理、SIP消息头域管理、号码变换、路由选择、负载均衡和高可用等方面都是相通的。事实上,KEMI在Kamailio中也是很新的概念,本书的示例也有很多是从原生脚本的示例中翻译过来的。如果读懂本书,就能将这些示例翻译回原生脚本,使其适用于Kamailio和OpenSIPS。

本书的内容及特色

本书从Kamailio的历史、基本概念和逻辑讲起,即使没有相关经验的读者也能轻松入门。如果读者还有一些通信相关的行业背景知识以及相关的计算机网络基础知识,读起来会更轻松。为了照顾对通信和SIP不太熟悉的读者,本书附带了大量的脚注信息和相关链接,供读者查阅。本书的附录部分也有对FreeSWITCH、Docker和Lua语言等相关基础知识的介绍,即使不熟悉这些内容的读者也能快速入门并无障碍地阅读本书。此外,如果你读过《FreeSWITCH权威指南》,你就有了阅读本书的非常好的基础。

鉴于本书的章节安排,本书适合按从头到尾的顺序阅读。当然,所谓顺序阅读并不是需要逐字逐句阅读。尤其是第3章中列出的参数众多,初次阅读时观其大略即可。读完一遍后,再反复阅读某些章节,相信每次你都会有新的收获。

本书的主要特色是KEMI,以及通过Lua写路由脚本。Lua是一门轻量级的编程语言,非常适合写路由脚本。Lua除了用在Kamailio中外,还被广泛用在FreeSWITCH、Nginx(OpenResty)、PostgreSQL、VLC、Wireshark等知名软件中。

排版及约定

□ 有些代码行或日志输出较长,为适应版面,进行了人工换行和排版。

□ 提示符:对于命令行的输入输出来说,在Linux及Mac等UNIX类平台上,前面的$或#为操作系统命令提示符;在不至于引起混淆的情况下,可能会省略系统提示符。

□ 注释:在Kamailio原生脚本中,统一使用#或//表示注释(有的情况下#也代表命令行提示符,请注意区分),而在Lua脚本和SQL语句中,使用--表示注释。

□ 本书给出的示例代码,如果在随书附赠的源代码中也有,一般会给出源代码文件名,如mtree.lua,以方便读者运行对照。

□ 为节省篇幅,本书的示例代码中加了大量的注释,这样处理可以使注释更便于阅读且更有针对性。所以代码内的注释也是本书很重要的部分。

资源和勘误

□ kamailio.org是Kamailio社区官方网站,上面有各种资源。

□ kamailio.org.cn是Kamailio中文网站,由我和SIP/VoIP专家James Zhu共同维护。

□ book.dujinfang.com是本书的在线站点,提供本书的源代码下载及勘误服务等。

□ dujinfang@gmail.com是我的电子邮箱,如果你对本书有任何意见、建议或批评,请发到该邮箱。

□ https://weibo.com/dujinfang是我的个人微博,我很乐意与各位读者进行交流。

□ RTS.cn是一个探讨开源和商业最佳结合的技术社区,有Kamailio、FreeSWITCH相关的技术交流以及年度技术论坛——RTSCon。

□ FreeSWITCH-CN是FreeSWITCH中文社区的微信公众号,未来也会多发一些Kamailio的内容,欢迎大家搜索“FreeSWITCH-CN”关注。

由于我水平有限,书中错误和疏漏在所难免,欢迎广大读者朋友批评指正。

致谢

本书在写作时参考的大量资料都来自Kamailio开源社区及其官方网站上公开的信息,包括但不限于网页、演讲PDF、YouTube视频等,以及SIP Routing with Kamailio这本电子书[4]。Daniel-Constantin Mierla是Kamailio开发者之一,为本书的写作提供了很多指导和建议。Kamailio软件发展到今天,是德国的FhG FOKUS研究所、参与开源社区的众多个人开发者和公司共同努力的成果,在此一并致谢。

感谢机械工业出版社。机械工业出版社对中文原创计算机图书的支持让我倍感温馨。感谢杨福川编辑,他的图书出版理念给了我许多启发和写作的动力。感谢孙海亮编辑,他的耐心和细致保证了本书的质量和写作进度。

感谢我的妻子吕佳娉,她是本书的第二作者,也是本书的第一读者。她编辑整理了前三章和附录中的部分内容,也常常帮我修订文字错误。她基本上包揽了所有的家务和孩子的功课辅导,让我有更多的时间写作。

感谢我的儿子杜昱凝。他从很小就帮我测FreeSWITCH电话,现在已经是初中生的他也经常帮我调试Kamailio路由脚本并测试电话。也感谢他对我的理解,我总是忙于上班和写作,少了很多陪他玩耍的时间。

感谢我的同事韩小仿、景朝阳、杜林君、杨小金等,他们帮我提供了很多案例,做了很多测试和验证。感谢我的同事林彦君设计了本书封面。感谢烟台小樱桃网络科技有限公司,为本书的出版提供了人力和资金支持。没有他们,便没有此书。

杜金房

2022年5月于烟台


[1]电信这个名字大家应该都很熟悉。中国电信业在短短的几年内经过了数次重组改制,我离开时叫烟台网通,现在叫烟台联通,而烟台电信是我刚参加工作时的名字,与现在的烟台电信不是同一家公司。

[2]我写的一本电子书,介绍了很多FreeSWITCH实例,但未正式出版。

[3]基于Asterisk的一款PBX软件,提供了图形配置界面、安装维护系统等。

[4]又称为Kamailio Admin Book,作者为Daniel-Constantin Mierla及Elena-Ramona Modroiu,参见https://www.asipto.com/sw/kamailio-admin-book/。