kamailio常见问题解答
常见问题解答
本页面接受贡献,你必须通过注册表单创建一个用户账户:
https://www.kamailio.org/wiki/start?do=register
如果你有一个适合收录进常见问题解答的问题,并且你不知道答案,那就添加这个问题,并将答案设置为“待确定(TBA)”,其他人可以看到这个问题并给出正确答案。
目录
- 常见问题解答
- 常规问题
- 什么是Kamailio?
- Kamailio是一个B2BUA(背靠背用户代理)吗?
- Kamailio可以用作SIP重定向服务器吗?
- Kamailio可以用作SIP注册服务器和位置服务器吗?
- Kamailio可以用作SIP代理服务器吗?
- Kamailio可以用作SIP负载均衡服务器吗?
- 我可以使用Kamailio对Asterisk或FreeSwitch进行负载均衡吗?
- Kamailio可以用作SIP最低成本路由服务器吗?
- 是否可以重新加载Kamailio的配置文件?
- Kamailio的许可证是什么?
- 它可以安装在Windows系统上吗?
- 传输层问题
- Kamailio实现了哪些传输层协议?
- Kamailio支持WebSocket吗?
- Kamailio可以在传输层之间进行网关转换吗?
- Kamailio可以用于从Web浏览器(WebRTC)呼叫传统SIP电话吗?
- 模块问题
- 什么是Kamailio模块?
- Kamailio模块位于哪里?
- 默认编译哪些模块?
- 我如何编译和安装默认排除的模块?
- 我使用了“make all”命令,但无法得到db_mysql.so文件。我该如何获取它?
- 如何仅编译一个模块?
- SIP消息处理问题
- 为什么对头信息或消息体所做的更改不会立即显示出来?
- 为什么From/To头信息的部分内容会多次出现?
- 为什么SIP消息的消息体或其他部分会多次出现?
- 如何为SIP请求的每个目的地设置不同的头信息值?
- 当一个头信息多次出现时,如何删除其中一个单独的头字段?
- 为什么SIP请求会收到“483跳数过多”或“513消息过大”的回复?
- 我向Kamailio发送了SIP请求,但没有任何反应,为什么?
- 媒体流问题
- Kamailio会中继媒体流吗?
- Kamailio支持哪些编解码器?
- Kamailio可以用于视频通话吗?
- 入门问题
- 在开始使用Kamailio之前,最低的知识要求是什么?
- 有没有安装Kamailio的分步指南?
- 支持问题
- 有没有可以询问关于Kamailio问题的公共邮件列表?
- 发布关于Kamailio问题的规则是什么?
- 我可以在哪里报告问题?
- 我在哪里可以购买商业支持?
- DNS问题
- 它支持ENUM吗?
- 它可以进行哪些类型的DNS查询?
- 它可以进行基于DNS(SRV)的负载均衡吗?
- 如何避免在进行源IP比较时进行反向DNS查询?
- 即时消息和状态呈现问题
- 它可以路由SIP即时消息请求(页面模式,RFC3428)吗?
- 它可以为离线用户存储即时消息,并在用户上线时传递这些消息吗?
- 它可以使用MSRP(RFC4975)路由即时消息吗?
- 它可以处理端到端的状态呈现请求吗?
- 它支持SIP SIMPLE状态呈现(状态代理模型)吗?
- 它支持资源列表服务吗?
- 它可以充当状态呈现用户代理吗?
- 它可以处理对话状态的订阅请求(也就是“闪烁指示灯”)吗?
- 它支持处理XCAP吗?
- NAT穿越问题
- Kamailio可以与从NAT后面连接的电话一起使用吗?
- Kamailio可以安装在NAT后面(例如在Amazon EC2上)吗?
- 配置文件处理问题
- 我可以检查配置文件的语法错误吗?
- 对于SIP消息,我必须删除在配置文件中添加的AVP(属性值对)吗?
- 什么是伪变量?
- 如何遍历逗号分隔字符串中的各项?
- 如何评估函数的返回码?
- 如何处理SIP请求的重传?
- 故障排除问题
- 我遇到了“内存不足”错误,该怎么办?
- 工具问题
- 如何在命令行生成HA1值?
- 如何在命令行生成HA1B值?
- Kamctl给出了一个关于打开FIFO文件的错误,为什么?
- Kamcmd有时无法使用数字参数执行RPC命令,为什么?
- 常规问题
- 常规问题
- 什么是Kamailio?
- Kamailio是一个SIP服务器,实现了RFC3261中的规范。其核心功能是路由任何类型的SIP数据包。除此之外,还实现了许多概念性的功能,更多信息请查看:
- [Kamailio功能](Kamailio Features)
- Kamailio是一个B2BUA吗?
- 不是,Kamailio是一个灵活的SIP代理。许多人将Asterisk、FreeSWITCH、SEMS或其他产品与Kamailio集成,以实现B2BUA功能。
-
- [[http://ftp.iptel.org/pub/sems/doc/current/ModuleDoc_sbc.html|SEMS B2BUA]]
- Kamailio可以用作SIP重定向服务器吗?
- 可以。
- Kamailio可以用作SIP注册服务器和位置服务器吗?
- 可以。
- Kamailio可以用作SIP代理服务器吗?
- 可以。
- Kamailio可以用作SIP负载均衡服务器吗?
- 可以。
- 我可以使用Kamailio对Asterisk或FreeSwitch进行负载均衡吗?
- 可以。
- Kamailio可以用作SIP最低成本路由服务器吗?
- 可以。
- 是否可以重新加载Kamailio的配置文件?
- 如果你使用的是原生脚本语言,在更新配置文件后必须重新启动。
- 但请注意,许多全局参数可以通过RPC/MI命令进行更改,而无需重新启动(例如,TCP连接超时、调试级别)。应用与已加载模块或路由块相关的更改始终需要重新启动。
- 如果你使用的是KEMI脚本语言(Lua、Python、JavaScript、Ruby、Squirrel),那么你可以通过发出RPC命令来重新加载路由逻辑脚本,而无需重新启动Kamailio(有关更多详细信息,请参阅KEMI解释器模块文档:app_lua、app_python、app_python3、app_jsdt、app_ruby、app_sqlang)。
- Kamailio的许可证是什么?
- Kamailio是一个根据GNU通用公共许可证第2版(即GPLv2)授权的开源应用程序。它可以在你的基础设施上免费使用(就像免费啤酒一样)。请记住,如果你将其作为二进制文件分发给客户,你还需要分发你所做更改的源代码。有关更多信息,请查看GPLv2常见问题解答。
- 从2008年底开始,对核心和几个模块的贡献是在BSD许可证下进行的。这意味着它的部分内容可以提取出来,并根据BSD许可证条款使用。但总的来说,当作为一个应用程序使用时,必须遵循GPLv2的条款,因为GPLv2具有传染性。
- 它可以安装在Windows系统上吗?
- 不可以。目前没有官方的开发工作朝着这个方向进行,Linux/Unix实际上是运行服务器的首选平台。但是,使用类似于Windows下的Cygwin这样的类Linux环境来编译它可能并不困难。
- 什么是Kamailio?
- 传输层问题
- Kamailio实现了哪些传输层协议?
- 在网络层,Kamailio支持IPv4和IPv6。
- 在传输层,Kamailio支持UDP、TCP、TLS和SCTP。传输可以在异步模式下进行(配置选项),包括TCP和TLS。
- Kamailio可用于在这些协议的任意组合之间进行桥接,例如,在IPv4上通过UDP接收SIP数据包,并在IPv6上通过TLS发送出去。
- 从4.0.0版本开始,Kamailio支持WebSocket传输协议,允许现代Web浏览器直接通过Kamailio相互通话。
- Kamailio支持WebSocket吗?
- 支持,从4.0.0版本开始。它支持通过TCP(WS)和TLS(WSS)的WebSocket,同时支持IPv4和IPv6。
- Kamailio可以在传输层之间进行网关转换吗?
- 可以。你可以使用Kamailio在一种传输方式上接收SIP消息,并在另一种传输方式上发送出去。例如,在IPv6上接收TLS协议的消息,并在IPv4上通过UDP发送出去。
- Kamailio可以用于从Web浏览器(WebRTC)呼叫传统SIP电话吗?
- 从信令的角度来看是可以的。请记住,Kamailio是一个SIP数据包路由器,根本不处理媒体平面。简单来说,Kamailio可以对所有SIP消息进行从WebSocket到UDP、TCP、TLS或SCTP的网关转换。
- 然而,请注意,媒体平面(RTP流)需要对RTP数据包进行特殊的安全编码,而旧的SIP电话可能不支持这种编码。
- Kamailio实现了哪些传输层协议?
- 模块问题
- 什么是Kamailio模块?
- 模块是一个扩展,它编译成一个单独的目标文件,并可以在Kamailio启动时加载。通常,一个模块会导出一些新的函数,这些函数可以在配置文件的路由块中使用。
- Kamailio模块位于哪里?
- 在源代码树中,有三个目录:
- modules/
- modules_k/ - 自4.0.0版本起不再使用
- modules_s/ - 自4.0.0版本起不再使用
- 每个模块都位于其自己的子文件夹中。包含在Kamailio软件包中的模块的文档可在以下网址获取:
- http://kamailio.org/docs/modules/stable/
- 默认编译哪些模块?
- 与Kamailio核心具有相同依赖项的模块会被默认编译。那些默认不编译的模块会保留在Makefile的“exclude_modules”变量中。要打印被排除模块的列表,请执行以下命令:
- make printvar v=exclude_modules
- 我如何编译和安装默认排除的模块?
- 将其添加到“make cfg”命令的“include_modules”变量中。例如,编译和安装app_lua和db_mysql模块:
- make FLAVOUR=kamailio include_modules=“app_lua db_mysql” cfg
- make all
- make install
- 我使用了“make all”命令,但无法得到db_mysql.so文件。我该如何获取它?
- 该模块默认不编译,因为它依赖于libmysqlclient。使用以下命令进行编译和安装:
- make modules include_modules=“db_mysql”
- make install include_modules=“db_mysql”
- 如何仅编译一个模块?
- 首先,确保使用以下命令能正常编译核心:
- make
- 要编译单个模块,请使用:
- make modules modules=modules/modname
- 将modname替换为你要编译的模块的实际名称——例如,仅编译tls模块:
- make modules modules=modules/tls
- 什么是Kamailio模块?
- SIP消息处理问题
- 为什么对头信息或消息体所做的更改不会立即显示出来?
- Kamailio始终处理接收到的SIP消息(请求或回复)。对头信息或消息体所做的更改会被保留为一个操作列表,在写入网络之前应用这些操作。这些更改可以是添加头信息、删除头信息、更新头信息的内容、添加或删除消息体,或者更新消息体的内容。
- 如果你希望更改立即应用,请使用textopsx模块中的msg_apply_changes()函数:
- http://kamailio.org/docs/modules/stable/modules/textopsx.html#textopsx.msg_apply_changes
- 使用时要小心,并且不要在record_route()之后使用它,因为这个函数必须插入一个包含将用于转发的本地套接字IP地址的头信息——在执行配置文件时,套接字尚未确定。
- 例如,假设传入消息中不存在X-Hdr头信息,以下是一些情况:
- 不应用更改:
append_hf("X-Hdr: xyz\r\n"); if(is_present_hf("X-Hdr")) { # 这部分不会执行 } else { # 这部分会执行 }
- 应用更改:
append_hf("X-Hdr: xyz\r\n"); msg_apply_changes(); if(is_present_hf("X-Hdr")) { # 这部分会执行 } else { # 这部分不会执行 }
- 为什么From/To头信息的部分内容会多次出现?
- 在进行头信息管理操作后,可能会导致From/To头信息的部分内容重复,或者结果是多个值的连接。这与前面的问题相关,因为更改不会立即应用,并且对头信息部分的更新不是一个简单的设置操作。
- 例如,如果From用户名是“alice”,并且配置文件中的操作是:
$fU = "bob"; ... $fU = "carol";
- 结果可能是From用户名变为“bobcarol”。
- 一种解决方案是在中间使用msg_apply_changes()函数:
$fU = "bob"; msg_apply_changes(); ... $fU = "carol";
- 另一种解决方案是将值保存在一个变量(例如,avp或xavp)中,并仅进行一次操作,如下所示:
$xavp(fuser) = "bob"; ... $xavp(fuser[0]) = "carol"; ... $fU = $xavp(fuser);
- 建议在branch_route中更新From/To头信息,特别是当需要为传出分支设置不同的值时。
- 上面的示例是对 f U 的赋值(也可以是其他变量,如 fU的赋值(也可以是其他变量,如 fU的赋值(也可以是其他变量,如fu、 t U 、 tU、 tU、tu等),但使用uac_replace_from()或uac_replace_to()等函数时,行为是相同的。
- 为什么SIP消息的消息体或其他部分会多次出现?
- 这与From/To部分多次出现的原因实际上是相同的。
- 配置文件执行了多次更改头信息或消息体部分的操作。例如,如果消息体中有两个连接的用于媒体流的IP地址,那么很可能是rtpproxy函数被使用了两次,或者,如果SDP出现了两次,那么很可能是rtpengine函数被使用了两次。
- 如果更新需要多次进行,请在中间使用msg_apply_changes()函数,否则请重构配置,使其仅执行一次操作(例如,RTP中继函数应在branch_route块中使用)。
- 如何为SIP请求的每个目的地设置不同的头信息值?
- 在branch_route中设置头信息的值。
- 在request_route中对SIP消息执行的所有操作(包括从request_route执行的子路由中的操作)对于所有传出分支都是通用的。如果你只想为特定的目的地进行更新,请使用branch routes。
- 示例:
- 仅在发送到语音邮件服务器时添加X-VBox头信息,在发送到其他地方时添加X-Peer-ID头信息:
request_route { ... if(is_method("INVITE")) { t_on_branch("SETHEADERS"); t_on_failure("REROUTE"); } t_relay(); exit; } branch_route[SETHEADERS] { if($rd=="voicemail.server.com") { append_hf("X-VBox: $fU\r\n"); } else { append_hf("X-Peer-ID: abc\r\n"); } } failure_route[REROUTE] { if (t_is_canceled()) { exit; } if (t_check_status("486|408")) { $du = $null; $ru = "sip:voicemail.server.com"; t_on_failure("REROUTE"); exit; } }
- 非常重要的是,也要注意在request_route中多次执行相同的操作
- 为什么对头信息或消息体所做的更改不会立即显示出来?