当前位置: 首页 > article >正文

kamailio常见问题解答

常见问题解答

本页面接受贡献,你必须通过注册表单创建一个用户账户:

https://www.kamailio.org/wiki/start?do=register

如果你有一个适合收录进常见问题解答的问题,并且你不知道答案,那就添加这个问题,并将答案设置为“待确定(TBA)”,其他人可以看到这个问题并给出正确答案。

目录
  1. 常见问题解答
    1. 常规问题
      • 什么是Kamailio?
      • Kamailio是一个B2BUA(背靠背用户代理)吗?
      • Kamailio可以用作SIP重定向服务器吗?
      • Kamailio可以用作SIP注册服务器和位置服务器吗?
      • Kamailio可以用作SIP代理服务器吗?
      • Kamailio可以用作SIP负载均衡服务器吗?
      • 我可以使用Kamailio对Asterisk或FreeSwitch进行负载均衡吗?
      • Kamailio可以用作SIP最低成本路由服务器吗?
      • 是否可以重新加载Kamailio的配置文件?
      • Kamailio的许可证是什么?
      • 它可以安装在Windows系统上吗?
    2. 传输层问题
      • Kamailio实现了哪些传输层协议?
      • Kamailio支持WebSocket吗?
      • Kamailio可以在传输层之间进行网关转换吗?
      • Kamailio可以用于从Web浏览器(WebRTC)呼叫传统SIP电话吗?
    3. 模块问题
      • 什么是Kamailio模块?
      • Kamailio模块位于哪里?
      • 默认编译哪些模块?
      • 我如何编译和安装默认排除的模块?
      • 我使用了“make all”命令,但无法得到db_mysql.so文件。我该如何获取它?
      • 如何仅编译一个模块?
    4. SIP消息处理问题
      • 为什么对头信息或消息体所做的更改不会立即显示出来?
      • 为什么From/To头信息的部分内容会多次出现?
      • 为什么SIP消息的消息体或其他部分会多次出现?
      • 如何为SIP请求的每个目的地设置不同的头信息值?
      • 当一个头信息多次出现时,如何删除其中一个单独的头字段?
      • 为什么SIP请求会收到“483跳数过多”或“513消息过大”的回复?
      • 我向Kamailio发送了SIP请求,但没有任何反应,为什么?
    5. 媒体流问题
      • Kamailio会中继媒体流吗?
      • Kamailio支持哪些编解码器?
      • Kamailio可以用于视频通话吗?
    6. 入门问题
      • 在开始使用Kamailio之前,最低的知识要求是什么?
      • 有没有安装Kamailio的分步指南?
    7. 支持问题
      • 有没有可以询问关于Kamailio问题的公共邮件列表?
      • 发布关于Kamailio问题的规则是什么?
      • 我可以在哪里报告问题?
      • 我在哪里可以购买商业支持?
    8. DNS问题
      • 它支持ENUM吗?
      • 它可以进行哪些类型的DNS查询?
      • 它可以进行基于DNS(SRV)的负载均衡吗?
      • 如何避免在进行源IP比较时进行反向DNS查询?
    9. 即时消息和状态呈现问题
      • 它可以路由SIP即时消息请求(页面模式,RFC3428)吗?
      • 它可以为离线用户存储即时消息,并在用户上线时传递这些消息吗?
      • 它可以使用MSRP(RFC4975)路由即时消息吗?
      • 它可以处理端到端的状态呈现请求吗?
      • 它支持SIP SIMPLE状态呈现(状态代理模型)吗?
      • 它支持资源列表服务吗?
      • 它可以充当状态呈现用户代理吗?
      • 它可以处理对话状态的订阅请求(也就是“闪烁指示灯”)吗?
      • 它支持处理XCAP吗?
    10. NAT穿越问题
      • Kamailio可以与从NAT后面连接的电话一起使用吗?
      • Kamailio可以安装在NAT后面(例如在Amazon EC2上)吗?
    11. 配置文件处理问题
      • 我可以检查配置文件的语法错误吗?
      • 对于SIP消息,我必须删除在配置文件中添加的AVP(属性值对)吗?
      • 什么是伪变量?
      • 如何遍历逗号分隔字符串中的各项?
      • 如何评估函数的返回码?
      • 如何处理SIP请求的重传?
    12. 故障排除问题
      • 我遇到了“内存不足”错误,该怎么办?
    13. 工具问题
      • 如何在命令行生成HA1值?
      • 如何在命令行生成HA1B值?
      • Kamctl给出了一个关于打开FIFO文件的错误,为什么?
      • Kamcmd有时无法使用数字参数执行RPC命令,为什么?
  2. 常规问题
    1. 什么是Kamailio?
      • Kamailio是一个SIP服务器,实现了RFC3261中的规范。其核心功能是路由任何类型的SIP数据包。除此之外,还实现了许多概念性的功能,更多信息请查看:
      • [Kamailio功能](Kamailio Features)
    2. Kamailio是一个B2BUA吗?
      • 不是,Kamailio是一个灵活的SIP代理。许多人将Asterisk、FreeSWITCH、SEMS或其他产品与Kamailio集成,以实现B2BUA功能。
        • [[http://ftp.iptel.org/pub/sems/doc/current/ModuleDoc_sbc.html|SEMS B2BUA]]
    3. Kamailio可以用作SIP重定向服务器吗?
      • 可以。
    4. Kamailio可以用作SIP注册服务器和位置服务器吗?
      • 可以。
    5. Kamailio可以用作SIP代理服务器吗?
      • 可以。
    6. Kamailio可以用作SIP负载均衡服务器吗?
      • 可以。
    7. 我可以使用Kamailio对Asterisk或FreeSwitch进行负载均衡吗?
      • 可以。
    8. Kamailio可以用作SIP最低成本路由服务器吗?
      • 可以。
    9. 是否可以重新加载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)。
    10. Kamailio的许可证是什么?
      • Kamailio是一个根据GNU通用公共许可证第2版(即GPLv2)授权的开源应用程序。它可以在你的基础设施上免费使用(就像免费啤酒一样)。请记住,如果你将其作为二进制文件分发给客户,你还需要分发你所做更改的源代码。有关更多信息,请查看GPLv2常见问题解答。
      • 从2008年底开始,对核心和几个模块的贡献是在BSD许可证下进行的。这意味着它的部分内容可以提取出来,并根据BSD许可证条款使用。但总的来说,当作为一个应用程序使用时,必须遵循GPLv2的条款,因为GPLv2具有传染性。
    11. 它可以安装在Windows系统上吗?
      • 不可以。目前没有官方的开发工作朝着这个方向进行,Linux/Unix实际上是运行服务器的首选平台。但是,使用类似于Windows下的Cygwin这样的类Linux环境来编译它可能并不困难。
  3. 传输层问题
    1. Kamailio实现了哪些传输层协议?
      • 在网络层,Kamailio支持IPv4和IPv6。
      • 在传输层,Kamailio支持UDP、TCP、TLS和SCTP。传输可以在异步模式下进行(配置选项),包括TCP和TLS。
      • Kamailio可用于在这些协议的任意组合之间进行桥接,例如,在IPv4上通过UDP接收SIP数据包,并在IPv6上通过TLS发送出去。
      • 从4.0.0版本开始,Kamailio支持WebSocket传输协议,允许现代Web浏览器直接通过Kamailio相互通话。
    2. Kamailio支持WebSocket吗?
      • 支持,从4.0.0版本开始。它支持通过TCP(WS)和TLS(WSS)的WebSocket,同时支持IPv4和IPv6。
    3. Kamailio可以在传输层之间进行网关转换吗?
      • 可以。你可以使用Kamailio在一种传输方式上接收SIP消息,并在另一种传输方式上发送出去。例如,在IPv6上接收TLS协议的消息,并在IPv4上通过UDP发送出去。
    4. Kamailio可以用于从Web浏览器(WebRTC)呼叫传统SIP电话吗?
      • 从信令的角度来看是可以的。请记住,Kamailio是一个SIP数据包路由器,根本不处理媒体平面。简单来说,Kamailio可以对所有SIP消息进行从WebSocket到UDP、TCP、TLS或SCTP的网关转换。
      • 然而,请注意,媒体平面(RTP流)需要对RTP数据包进行特殊的安全编码,而旧的SIP电话可能不支持这种编码。
  4. 模块问题
    1. 什么是Kamailio模块?
      • 模块是一个扩展,它编译成一个单独的目标文件,并可以在Kamailio启动时加载。通常,一个模块会导出一些新的函数,这些函数可以在配置文件的路由块中使用。
    2. Kamailio模块位于哪里?
      • 在源代码树中,有三个目录:
      • modules/
      • modules_k/ - 自4.0.0版本起不再使用
      • modules_s/ - 自4.0.0版本起不再使用
      • 每个模块都位于其自己的子文件夹中。包含在Kamailio软件包中的模块的文档可在以下网址获取:
      • http://kamailio.org/docs/modules/stable/
    3. 默认编译哪些模块?
      • 与Kamailio核心具有相同依赖项的模块会被默认编译。那些默认不编译的模块会保留在Makefile的“exclude_modules”变量中。要打印被排除模块的列表,请执行以下命令:
      • make printvar v=exclude_modules
    4. 我如何编译和安装默认排除的模块?
      • 将其添加到“make cfg”命令的“include_modules”变量中。例如,编译和安装app_lua和db_mysql模块:
      • make FLAVOUR=kamailio include_modules=“app_lua db_mysql” cfg
      • make all
      • make install
    5. 我使用了“make all”命令,但无法得到db_mysql.so文件。我该如何获取它?
      • 该模块默认不编译,因为它依赖于libmysqlclient。使用以下命令进行编译和安装:
      • make modules include_modules=“db_mysql”
      • make install include_modules=“db_mysql”
    6. 如何仅编译一个模块?
      • 首先,确保使用以下命令能正常编译核心:
      • make
      • 要编译单个模块,请使用:
      • make modules modules=modules/modname
      • 将modname替换为你要编译的模块的实际名称——例如,仅编译tls模块:
      • make modules modules=modules/tls
  5. SIP消息处理问题
    1. 为什么对头信息或消息体所做的更改不会立即显示出来?
      • 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 {
         # 这部分不会执行
      }
      
    2. 为什么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、 tUtu等),但使用uac_replace_from()或uac_replace_to()等函数时,行为是相同的。
    3. 为什么SIP消息的消息体或其他部分会多次出现?
      • 这与From/To部分多次出现的原因实际上是相同的。
      • 配置文件执行了多次更改头信息或消息体部分的操作。例如,如果消息体中有两个连接的用于媒体流的IP地址,那么很可能是rtpproxy函数被使用了两次,或者,如果SDP出现了两次,那么很可能是rtpengine函数被使用了两次。
      • 如果更新需要多次进行,请在中间使用msg_apply_changes()函数,否则请重构配置,使其仅执行一次操作(例如,RTP中继函数应在branch_route块中使用)。
    4. 如何为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中多次执行相同的操作

http://www.kler.cn/a/549588.html

相关文章:

  • 【NLP】文本预处理
  • wordpress按用户ID调用用户信息
  • TikTok 推出新 IDE Trae,用于快速构建 AI 应用
  • xml 和json互转工具
  • 大语言模型的解码策略与关键优化总结
  • IDEA集成DeepSeek AI助手完整指南
  • Redis问题排查常用命令
  • Docker-数据卷
  • pikachu靶机-越权、目录遍历、敏感信息泄露
  • Dify 是什么?Dify是一个开源的LLM应用开发平台,支持快速搭建生成式AI应用,具有RAG管道、Agent功能、模型集成等特点
  • C#开源大型商城系统之B2B2C+O2O一体化_OctShop
  • 关于conda换镜像源,pip换源
  • CentOS 7.8 安装MongoDB 7教程
  • 【深度解析】图解Deepseek-V3模型架构-混合专家模型(MoE)
  • 浏览器打开Axure RP模型
  • 鸿蒙应用开发-在Worker中实时修改页面数据(在不同线程中修改主线程中的UI界面)
  • redis分页查询
  • Postman桌面版登录问题use authorization token to sign in
  • 2010年下半年软件设计师考试上午真题的知识点整理(附真题及答案解析)
  • 【Kubernetes】k8s 部署指南