kamailio中的PV,PV Headers,App Lua,Dialog,UUID,Dianplan等模块的讲解
课程总结
今天的课程围绕 Kamailio模块 和 SIP服务器类型 展开,详细讲解了多个核心模块的功能、参数和使用方法,并深入探讨了SIP中B2BUA和Proxy Server的区别与应用场景。以下是今天课程的主要内容总结:
今日主题
Kamailio模块与SIP服务器类型详解
重要知识点总结
模块/主题 | 重要知识点 | 备注 |
---|---|---|
PV模块 | - 伪变量的定义与使用 - pv_isset 、pv_unset 、is_int 等函数的使用 | 伪变量用于动态访问SIP消息、数据库等信息。 |
PV Headers模块 | - 消息头的收集与修改 - pvh_collect_headers 、pvh_apply_headers 等函数 | 支持对SIP消息头的灵活操作,适用于复杂消息头处理场景。 |
App Lua模块 | - Lua脚本的执行 - lua_dofile 、lua_run 等函数- KEMI框架与 KSR 模块 | 通过Lua脚本实现复杂的SIP逻辑,支持KEMI框架。 |
App Lua SR模块 | - 旧版sr 模块的支持- register 参数的使用 | 主要用于旧版Lua脚本的平滑迁移,未来可能被废弃。 |
Dialog模块 | - 会话状态管理 - 会话分类(Profiling) - dlg_manage() 、dlg_bye() 等函数 | 用于管理SIP会话的生命周期和状态。 |
UUID模块 | - 生成唯一标识符 - $uuid(g) 、$uuid(r) 、$uuid(t) 等变量 | 适用于需要唯一标识的场景,如SIP实例标识、会话ID等。 |
SIP服务器类型 | - Proxy Server:信令转发、负载均衡 - B2BUA:会话控制、媒体流处理 | Proxy Server 适合高性能场景,B2BUA 适合复杂业务逻辑和媒体流处理场景。 |
Proxy Server | - 无状态与有状态模式 - 路由、负载均衡、安全控制 | 专注于信令转发,不处理媒体流。 |
B2BUA | - 会话终止与重建 - 媒体流控制、协议转换 | 完全控制会话和媒体流,支持复杂业务逻辑。 |
详细内容回顾
1. PV模块
- 用于管理和操作伪变量(Pseudo-Variables),支持动态变量操作。
- 重要函数:
pv_isset
、pv_unset
、is_int
、typeof
等。
2. PV Headers模块
- 用于简化SIP消息头的处理,支持消息头的收集、修改和应用。
- 重要函数:
pvh_collect_headers
、pvh_apply_headers
、pvh_modify_header
等。
3. App Lua模块
- 允许在Kamailio中执行Lua脚本,支持KEMI框架和
KSR
模块。 - 重要函数:
lua_dofile
、lua_run
、lua_runstring
等。
4. App Lua SR模块
- 导出旧版
sr
模块,支持Lua脚本的平滑迁移。 - 重要参数:
register
,用于注册Kamailio子模块到Lua中。
5. Dialog模块
- 用于管理SIP会话(Dialog),跟踪会话状态。
- 重要功能:会话分类、会话超时控制、会话统计。
- 重要函数:
dlg_manage
、dlg_bye
、dlg_get
等。
6. UUID模块
- 用于生成唯一标识符(UUID),适用于需要唯一标识的场景。
- 重要变量:
$uuid(g)
、$uuid(r)
、$uuid(t)
。
7. SIP服务器类型
- Proxy Server:
- 功能:信令转发、负载均衡、安全控制。
- 模式:无状态与有状态。
- 应用场景:路由、注册、负载均衡。
- B2BUA:
- 功能:会话控制、媒体流处理、协议转换。
- 应用场景:呼叫中心、SIP Trunking、协议转换。
总结
今天的课程内容涵盖了Kamailio中多个核心模块的功能和使用方法,包括伪变量操作、消息头处理、Lua脚本执行、会话管理、唯一标识生成等。同时,我们还深入探讨了SIP中B2BUA和Proxy Server的区别与应用场景。通过学习,我们掌握了如何通过Kamailio实现灵活的SIP逻辑处理,并理解了不同SIP服务器类型的特点和适用场景。希望这些知识能够帮助大家在实际项目中更好地设计和实现SIP相关功能。
Dialog模块
Dialog模块的主要功能是管理SIP会话(Dialog),并提供对会话状态的跟踪和控制。
1. 概述
Kamailio通过TM模块可以作为有状态代理(stateful proxy)运行。这里的“有状态”指的是事务状态(transaction state),而不是会话状态(dialog state)。某些应用场景可能需要代理能够感知整个会话(call),而不仅仅是事务。
例如,常见的需求是限制某个终端、账户或用户组可以同时进行的呼叫数量。为了实现这种限制,代理需要能够跟踪整个会话,而不仅仅是事务。Dialog模块提供了这种会话感知能力,能够跟踪当前会话、提供会话信息(如活跃会话数量),并管理会话的各种特性。
2. 工作原理
- 当收到初始的INVITE请求时,可以通过调用
dlg_manage()
函数来创建会话。这个函数需要在创建对应的事务之前执行。 - 当收到BYE请求时,会话会自动销毁。如果没有收到BYE,会话的生命周期由默认超时时间(
default_timeout
)和自定义超时时间(timeout_avp
)控制。 - 每次处理顺序请求时,会话的超时时间会被重置。
3. 会话状态
会话有以下几种状态:
- 未确认会话(Unconfirmed dialog)
- 早期会话(Early dialog,例如振铃中)
- 已确认会话(Confirmed dialog,等待ACK)
- 活跃会话(Active call)
- 已删除会话(Deleted dialog)
其中,早期会话和已删除会话的状态不会更新到数据库中。
4. 会话分类(Dialog Profiling)
会话分类是一种机制,用于对会话进行分类、排序和跟踪。分类标准可以是管理员定义的任何属性,例如SIP消息属性、伪变量、自定义值等。会话可以动态地添加到一个或多个分类表中。
会话分类有两种类型:
- 无值分类:会话仅属于某个分类,例如“出站呼叫”。
- 有值分类:会话属于某个分类,并且有一个特定的值,例如“主叫号码”。
一个会话可以同时属于多个分类。
5. 依赖
Dialog模块依赖于以下Kamailio模块:
- TM模块:事务管理模块。
- RR模块:Record-Route模块。
- PV模块:伪变量模块。
6. 参数
Dialog模块提供了许多配置参数,以下是一些重要的参数:
- enable_stats:是否启用统计功能。
- hash_size:用于存储会话的哈希表大小。
- rr_param:用于存储会话cookie的Record-Route参数名称。
- default_timeout:默认的会话超时时间。
- early_timeout:未确认或早期会话的超时时间。
- db_url:用于存储会话信息的数据库URL。
- db_mode:会话信息同步到数据库的模式(实时、延迟、关闭时等)。
7. 函数
Dialog模块提供了许多函数,可以在配置脚本中使用。以下是一些常用的函数:
- set_dlg_profile(profile[, value]):将当前会话添加到指定的分类中。
- unset_dlg_profile(profile[, value]):从指定的分类中移除当前会话。
- is_in_profile(profile[, value]):检查当前会话是否属于指定的分类。
- dlg_bye(side):向会话的一方或双方发送BYE请求。
- dlg_manage():处理当前的SIP请求并管理会话。
8. 统计
Dialog模块提供了以下统计信息:
- active_dialogs:当前活跃的会话数量。
- early_dialogs:早期会话的数量。
- processed_dialogs:自启动以来处理的会话总数。
- expired_dialogs:自启动以来过期的会话总数。
- failed_dialogs:失败的会话数量。
9. RPC命令
Dialog模块支持通过RPC命令进行管理,例如:
- dlg.list:列出所有活跃的会话。
- dlg.terminate_dlg:终止指定的会话。
- dlg.profile_get_size:获取指定分类中的会话数量。
10. 导出变量
Dialog模块导出了以下变量,可以在配置脚本中使用:
- $DLG_count:当前活跃的会话数量。
- $DLG_status:当前会话的状态。
- $DLG_lifetime:当前会话的持续时间。
- $dlg_var(key):用于存储与会话相关的自定义值。
11. 事件路由
Dialog模块提供了以下事件路由:
- event_route[dialog:start]:当处理INVITE的200 OK响应时执行。
- event_route[dialog:end]:当处理BYE请求或会话超时时执行。
- event_route[dialog:failed]:当会话未完成时执行(例如收到300或更高的响应)。
12. 开发者指南
Dialog模块提供了API,开发者可以通过注册回调函数来扩展功能。例如:
- register_dlgcb():注册一个新的回调函数。
- terminate_dlg():终止指定的会话。
13. 常见问题
- use_tight_match参数去哪了?
该参数在1.3版本中被移除,因为严格匹配(tight matching)已成为强制功能,不可配置。 - 哪里可以找到更多关于Kamailio的信息?
可以参考Kamailio的官方网站:https://www.kamailio.org/。 - 如何报告Bug?
可以在GitHub上提交Issue:https://github.com/kamailio/kamailio/issues。
总结
Dialog模块是Kamailio中非常重要的模块,用于管理SIP会话的生命周期。通过该模块,可以实现对会话的跟踪、分类、限制和统计等功能。开发者可以通过配置脚本和API进一步扩展其功能。
这段代码是关于Kamailio中Dialplan模块的详细说明。Dialplan模块用于实现基于匹配和替换规则的通用字符串转换。它可以用来处理请求URI(Request URI)或伪变量(PV),并将其转换为新的格式或值。Dialplan模块非常灵活,适用于多种场景,例如呼叫路由、号码前缀重写等。
Dianplan
1. 概述
Dialplan模块实现了基于匹配和替换规则的通用字符串转换功能。它可以用于:
- 修改请求URI或伪变量。
- 将输入值转换为新的格式或值。
- 根据匹配规则获取一组属性。
Dialplan模块的典型应用场景包括:
- 自动补全拨打的号码(例如将国内号码转换为国际号码)。
- 将通用号码转换为特定号码(例如紧急号码)。
- 检测号码范围或集合,并将其映射到某个服务或场景。
2. 工作原理
- 模块启动时,会从数据库中加载一组匹配和转换规则。这些规则按Dialplan组(dpid)进行分组。
- 每条规则描述了如何匹配输入值、如何修改输入值以及匹配成功后设置哪些属性。
- 输入值可以通过正则表达式、字符串比较或fnmatch(类似shell的通配符匹配)进行匹配。
- 如果多个规则匹配,优先级(priority)高的规则会被优先处理。
- 匹配成功后,模块会应用定义的转换规则,并返回输出值。如果规则定义了属性,这些属性也会返回给脚本。
3. Dialplan的用例
Dialplan模块可以用于以下场景:
- 号码转换:例如将国内号码转换为国际号码。
- 服务检测:例如将一组号码映射到某个服务,并通过属性返回额外信息。
- 非SIP字符串转换:例如将国家名称的不同格式转换为标准格式(如“UK”、“England”、“United Kingdom” -> “GB”)。
- 其他基于字符串的转换或检测需求。
4. 依赖
4.1 Kamailio模块
- 数据库模块:用于从数据库加载规则。
4.2 外部库
- libpcre:用于支持正则表达式匹配。
5. 参数
Dialplan模块提供了许多配置参数,以下是一些重要的参数:
- db_url:用于加载规则的数据库URL。
- table_name:存储规则的数据库表名。
- dpid_col:存储Dialplan组ID的列名。
- pr_col:存储规则优先级的列名。
- match_op_col:存储匹配操作类型的列名。
- match_exp_col:存储匹配表达式的列名。
- match_len_col:存储匹配字符串长度的列名。
- subst_exp_col:存储替换表达式的列名。
- repl_exp_col:存储替换结果的列名。
- attrs_col:存储规则属性的列名。
- attrs_pvar:用于存储匹配规则属性的伪变量。
- fetch_rows:每次从数据库加载的行数。
- match_dynamic:是否支持动态匹配(即匹配表达式中包含脚本变量)。
- append_branch:是否在修改请求URI后添加新的分支。
- reload_delta:规则重新加载的时间间隔(秒)。
6. 函数
Dialplan模块提供了以下函数,可以在配置脚本中使用:
6.1 dp_replace(dpid, inval, outvar)
- 功能:根据指定的Dialplan组(dpid)对输入值(inval)进行转换,并将结果存储在输出变量(outvar)中。
- 参数:
dpid
:Dialplan组ID。inval
:输入值。outvar
:输出变量。
- 示例:
dp_replace("240", "$rU", "$var(newru)"); xlog("'$rU' was translated to '$var(newru)'\n");
6.2 dp_match(dpid, inval)
- 功能:根据指定的Dialplan组(dpid)匹配输入值(inval),并返回匹配规则的属性。
- 参数:
dpid
:Dialplan组ID。inval
:输入值。
- 示例:
dp_match("240", "+49$rU"); xlog("the attributes associated with '+49$rU' are '$var(attrs)'\n");
6.3 dp_translate(id, [src[/dest]])
- 功能:根据指定的Dialplan组(id)对输入值(src)进行转换,并将结果存储在输出变量(dest)中。
- 参数:
id
:Dialplan组ID。src
:输入值。dest
:输出变量。
- 示例:
dp_translate("240", "$ruri.user/$avp(s:dest)"); xlog("translated to var $avp(s:dest) \n");
6.4 dp_reload()
- 功能:从数据库重新加载规则。
- 示例:
dp_reload();
7. RPC命令
Dialplan模块支持通过RPC命令进行管理,例如:
- dialplan.dump:导出指定Dialplan组的内容。
- dialplan.reload:从数据库重新加载规则。
- dialplan.translate:对输入字符串应用转换规则。
8. 安装
Dialplan模块需要一个数据库表(dialplan
)来存储规则。可以通过Kamailio提供的SQL脚本(dialplan-create.sql
)创建该表。
9. 示例规则
以下是一个Dialplan表的示例规则:
dpid: 1
pr: 1
match_op: 1
match_exp: ^0[1-9][0-9]+$
match_len: 0
subst_exp: ^0([1-9][0-9]+)$
repl_exp: 0049\1
attrs: de
- dpid:Dialplan组ID。
- pr:优先级。
- match_op:匹配操作类型(0:字符串比较,1:正则表达式,2:fnmatch)。
- match_exp:匹配表达式。
- subst_exp:替换表达式。
- repl_exp:替换结果。
- attrs:匹配成功后设置的属性。
10. 开发者指南
Dialplan模块目前没有提供API供其他Kamailio模块使用。
总结
Dialplan模块是Kamailio中非常强大的工具,适用于各种字符串转换和匹配场景。通过配置数据库中的规则,可以实现灵活的号码转换、服务检测等功能。开发者可以通过脚本函数和RPC命令进一步扩展其功能。
这段代码是关于Kamailio中UUID模块的详细说明。UUID模块用于生成唯一的标识符(UUID),这些标识符可以用于SIP消息中的+sip.instance
媒体特性标签,或者用于定义一组SIP会话的唯一会话ID。
以下是对这段代码的中文讲解:
UUID模块
1. 概述
UUID模块导出了$uuid(type)
类变量,这些变量使用libuuid
库中的函数生成唯一的值。UUID(通用唯一标识符)在SIP中常用于+sip.instance
媒体特性标签,但也可以用于其他场景,例如为一组SIP会话定义唯一的会话ID。
2. 依赖
2.1 Kamailio模块
- 无。
2.2 外部库
- libuuid:用于生成UUID的库。
3. 使用
UUID模块提供了以下变量,可以在配置脚本中使用:
3.1 $uuid(g)
- 功能:使用
uuid_generate()
函数生成UUID。 - 示例:
$var(uuid) = $uuid(g); xdbg("生成的UUID是 [$var(uuid)]\n"); add_rr_param(";uuid=$var(uuid)");
3.2 $uuid(r)
- 功能:使用
uuid_generate_random()
函数生成基于随机数的UUID。 - 示例:
$var(uuid) = $uuid(r); xdbg("生成的随机UUID是 [$var(uuid)]\n");
3.3 $uuid(t)
- 功能:使用
uuid_generate_time()
函数生成基于时间的UUID。 - 示例:
$var(uuid) = $uuid(t); xdbg("生成的时间UUID是 [$var(uuid)]\n");
3.4 $uuid(s)
- 功能:使用
uuid_generate_time_safe()
函数生成基于时间的UUID。如果生成不安全,则返回$null
。 - 注意:在Mac OS X上不可用,此时返回的值与
uuid_generate_time()
相同。 - 示例:
$var(uuid) = $uuid(s); if ($var(uuid) != $null) { xdbg("生成的安全时间UUID是 [$var(uuid)]\n"); } else { xdbg("UUID生成不安全\n"); }
4. 示例
以下是一个完整的示例,展示如何在Kamailio配置脚本中使用UUID模块:
# 生成一个UUID
$var(uuid) = $uuid(g);
xlog("生成的UUID是 [$var(uuid)]\n");
# 将UUID添加到Record-Route头中
add_rr_param(";uuid=$var(uuid)");
# 生成一个随机UUID
$var(random_uuid) = $uuid(r);
xlog("生成的随机UUID是 [$var(random_uuid)]\n");
# 生成一个基于时间的UUID
$var(time_uuid) = $uuid(t);
xlog("生成的时间UUID是 [$var(time_uuid)]\n");
# 生成一个安全的时间UUID
$var(safe_uuid) = $uuid(s);
if ($var(safe_uuid) != $null) {
xlog("生成的安全时间UUID是 [$var(safe_uuid)]\n");
} else {
xlog("UUID生成不安全\n");
}
5. 总结
UUID模块是Kamailio中一个简单但非常有用的工具,用于生成唯一的标识符。通过$uuid(g)
、$uuid(r)
、$uuid(t)
和$uuid(s)
等变量,可以灵活地生成不同类型的UUID,并将其应用于SIP消息或其他场景中。
这段代码是关于Kamailio中Utils模块的详细说明。Utils模块实现了各种与SIP无关的实用功能,主要包括:
- 动态转发功能:允许通过FIFO命令在运行时配置消息转发。
- XCAP授权状态检查:用于检查订阅者是否有权订阅某个用户的“presence”事件。
Utils模块
1. 概述
Utils模块提供了多种实用功能,主要包括:
- 动态转发功能:通过FIFO命令在运行时配置消息转发。转发功能在脚本回调的预处理阶段执行,因此会在路由脚本处理当前消息之前生效。
- XCAP授权状态检查:用于从Presence服务器的数据库中检查订阅者是否有权订阅某个用户的“presence”事件。
2. 依赖
2.1 Kamailio模块
- 数据库模块:如果启用了
xcap_auth_status
功能,则需要加载数据库模块。
2.2 外部库
- 无。
3. 参数
Utils模块提供了以下配置参数:
3.1 forward_active
(整数)
- 功能:定义是否启用转发回调功能。
- 默认值:
0
(禁用)。 - 示例:
modparam("utils", "forward_active", 1)
3.2 pres_db_url
(字符串)
- 功能:定义Presence服务器的数据库URL。如果未设置,则
xcap_auth_status
功能会被禁用。 - 默认值:无。
- 示例:
modparam("utils", "pres_db_url", "mysql://foo:secret@localhost/pres")
3.3 xcap_table
(字符串)
- 功能:定义Presence服务器数据库中XCAP表的名称。
- 默认值:
"xcap"
。 - 示例:
modparam("utils", "xcap_table", "pres_xcap")
4. 函数
Utils模块提供了以下函数:
4.1 xcap_auth_status(watcher_uri, presentity_uri)
- 功能:检查订阅者(watcher)是否有权订阅某个用户(presentity)的“presence”事件。该函数会查询Presence服务器的数据库。
- 参数:
watcher_uri
:订阅者的URI(伪变量)。presentity_uri
:被订阅用户的URI(伪变量)。
- 返回值:
ACTIVE_STATUS
:允许订阅。PENDING_STATUS
、TERMINATED_STATUS
、WAITING_STATUS
:不允许订阅。-1
:发生错误。
- 示例:
if (method=="MESSAGE") { xcap_auth_status("$fu", "$ru"); if ($retcode == 1) { t_relay(); } else { send_reply("403", "Forbidden"); } }
5. MI命令
Utils模块支持通过MI(Management Interface)命令进行管理,主要包括:
5.1 forward_list
- 功能:列出当前活动的转发规则。
- 示例:
kamctl fifo forward_list
5.2 forward_switch
- 功能:激活或禁用转发规则。
- 示例:
kamctl fifo forward_switch 0=on
5.3 forward_filter
- 功能:为指定的转发规则ID设置过滤器。只有匹配过滤器的消息才会被转发。
- 示例:
kamctl fifo forward_filter 0=REGISTER:INVITE
5.4 forward_proxy
- 功能:为指定的转发规则ID设置转发目标。
- 示例:
kamctl fifo forward_proxy 0=host-c.domain-c:5060
6. 配置语法
Utils模块的配置语法如下:
6.1 switch_setting_list
- 语法:
switch_setting { "," switch_setting }
- 示例:
0=on,1=off
6.2 filter_setting_list
- 语法:
filter_setting { "," filter_setting }
- 示例:
0=REGISTER:INVITE,1=REQUEST
6.3 proxy_setting_list
- 语法:
proxy_setting { "," proxy_setting }
- 示例:
0=host-a.domain-a:5060,1=host-b.domain-b:5060
6.4 switch_setting
- 语法:
id "=" switch
- 示例:
0=on
6.5 filter_setting
- 语法:
id "=" filter_list
- 示例:
0=REGISTER:INVITE
6.6 proxy_setting
- 语法:
id "=" proxy
- 示例:
0=host-a.domain-a:5060
6.7 switch
- 语法:
"off" | "on"
- 示例:
on
6.8 filter_list
- 语法:
filter { ":" filter }
- 示例:
REGISTER:INVITE
6.9 proxy
- 语法:
host ":" port
- 示例:
host-a.domain-a:5060
6.10 filter
- 语法:
special_filter | regular_filter
- 示例:
REQUEST
6.11 special_filter
- 语法:
"REQUEST" | "REPLY"
- 示例:
REQUEST
6.12 regular_filter
- 语法:任意不包含
:
的字符串。 - 示例:
REGISTER
6.13 host
- 语法:
char { char }
- 示例:
host-a.domain-a
6.14 port
- 语法:
number
- 示例:
5060
6.15 id
- 语法:
number
- 示例:
0
6.16 number
- 语法:
digit {digit}
- 示例:
5060
6.17 digit
- 语法:
0-9
- 示例:
5
7. 总结
Utils模块是Kamailio中一个非常实用的工具模块,提供了动态转发和XCAP授权状态检查等功能。通过FIFO命令和MI命令,可以灵活地配置和管理转发规则。xcap_auth_status
函数则可以帮助实现基于数据库的订阅授权检查。
这段代码是关于Kamailio中Usrloc模块的详细说明。Usrloc模块用于管理用户位置表(User Location Table),存储用户的注册信息(如SIP地址、联系人信息等),并提供对这些信息的访问接口。该模块本身不直接导出可供路由脚本使用的函数,而是通过其他模块(如Registrar模块)间接使用。
Usrloc模块
1. 概述
Usrloc模块维护一个用户位置表,并为其他模块提供访问该表的接口。该模块的核心功能是管理用户的注册信息,包括:
- 用户地址(AOR,Address of Record):用户的SIP地址(如
sip:user@domain
)。 - 联系人信息(Contact):用户设备的实际SIP地址(如
sip:user@192.168.1.100:5060
)。 - 注册状态:如注册时间、过期时间、支持的SIP方法等。
1.1 联系人匹配
在NAT穿越(NAT Traversal)场景中,联系人匹配是一个重要问题。由于NAT的存在,同一用户的不同设备可能会使用相同的联系人信息,或者同一设备的重新注册可能会被视为新的联系人。为了解决这些问题,Usrloc模块提供了多种联系人匹配算法:
- 仅基于联系人(Contact Only):严格遵循RFC 3261,仅匹配联系人字符串,并检查Call-ID和Cseq。
- 基于联系人和Call-ID(Contact and Call-ID):扩展了第一种算法,要求联系人和Call-ID都匹配,且Cseq必须比之前的值更高。
- 基于联系人和Path(Contact and Path):扩展了第一种算法,要求联系人和Path都匹配,且Cseq必须比之前的值更高。
- 仅基于Call-ID(Call-ID Only):仅匹配Call-ID,忽略联系人和Path。
可以通过matching_mode
参数(见3.30节)选择匹配算法。
2. 依赖
2.1 Kamailio模块
- 数据库模块:可选,用于持久化存储用户位置信息。
2.2 外部库
- 无。
3. 参数
Usrloc模块提供了许多配置参数,以下是一些重要的参数:
3.1 nat_bflag
(整数)
- 功能:用于标记联系人是否位于NAT后。
- 默认值:未设置。
- 示例:
modparam("usrloc", "nat_bflag", 3)
3.2 use_domain
(整数)
- 功能:是否在用户标识中使用域名部分。适用于多域名场景。
- 默认值:
0
(禁用)。 - 示例:
modparam("usrloc", "use_domain", 1)
3.3 db_mode
(整数)
- 功能:定义Usrloc模块的数据库访问模式:
0
:禁用数据库,仅使用内存。1
:写穿透(Write-Through),所有更改立即写入数据库。2
:写回(Write-Back),更改先写入内存,定时同步到数据库。3
:仅数据库(DB-Only),无内存缓存,所有操作直接操作数据库。4
:启动时从数据库加载记录,运行时仅使用内存。
- 默认值:
0
。 - 示例:
modparam("usrloc", "db_mode", 2)
3.4 timer_interval
(整数)
- 功能:定时器运行的时间间隔(秒),用于删除过期联系人、同步数据库等。
- 默认值:
60
。 - 示例:
modparam("usrloc", "timer_interval", 120)
3.5 matching_mode
(整数)
- 功能:选择联系人匹配算法:
0
:仅基于联系人。1
:基于联系人和Call-ID。2
:基于联系人和Path。3
:仅基于Call-ID。
- 默认值:
0
。 - 示例:
modparam("usrloc", "matching_mode", 1)
3.6 ka_mode
(整数)
- 功能:控制内部保活机制的模式:
0
:禁用保活。1
:为所有联系人启用保活。2
:仅为NAT后的联系人启用保活。4
:仅为UDP联系人启用保活。
- 默认值:
0
。 - 示例:
modparam("usrloc", "ka_mode", 1)
4. RPC命令
Usrloc模块支持通过RPC命令进行管理,例如:
- ul.dump:导出用户位置表的内容。
- ul.lookup:查找指定AOR的联系人信息。
- ul.rm:删除指定AOR的记录。
- ul.add:为指定AOR添加新的联系人。
5. 统计
Usrloc模块导出了以下统计信息:
- users:当前内存缓存中的AOR数量。
- contacts:当前内存缓存中的联系人数量。
- expires:已过期的联系人数量。
- registered_users:所有域中注册的用户总数。
6. 开发者指南
Usrloc模块提供了一组API,供其他模块使用。例如:
- ul_register_domain:注册一个新的域。
- ul_insert_urecord:插入一个新的用户记录。
- ul_delete_urecord:删除指定AOR的记录。
- ul_get_urecord:获取指定AOR的记录。
7. 总结
Usrloc模块是Kamailio中非常重要的模块,用于管理用户的注册信息。通过灵活的配置参数和RPC命令,可以实现高效的用户位置管理。开发者可以通过API进一步扩展其功能,例如实现自定义的联系人匹配算法或保活机制。
PV模块
PV模块(Pseudo-Variables Module)是Kamailio的核心模块之一,用于管理和操作伪变量(Pseudo-Variables)。伪变量是Kamailio配置脚本中用于动态访问和操作SIP消息、数据库、系统信息等的特殊变量。
1. 概述
PV模块提供了核心的伪变量(Pseudo-Variables),这些变量可以在Kamailio配置文件中使用。伪变量的完整列表可以在Kamailio的Wiki文档中找到:Pseudo-Variables Section。
2. 依赖
2.1 Kamailio模块
- 无。
2.2 外部库
- 无。
3. 参数
PV模块提供了以下配置参数:
3.1 shvset
(字符串)
- 功能:设置共享变量(
$shv(name)
)的初始值。该参数可以多次设置。 - 格式:
name=type:value
name
:共享变量名称。type
:值类型(i
:整数,s
:字符串)。value
:要设置的值。
- 默认值:
NULL
。 - 示例:
modparam("pv", "shvset", "debug=i:1") modparam("pv", "shvset", "pstngw=s:sip:10.10.10.10")
3.2 varset
(字符串)
- 功能:设置脚本变量(
$var(name)
)的值。该参数可以多次设置。 - 格式:
name=type:value
name
:脚本变量名称。type
:值类型(i
:整数,s
:字符串)。value
:要设置的值。
- 默认值:
NULL
。 - 示例:
modparam("pv", "varset", "init=i:1") modparam("pv", "varset", "gw=s:sip:11.11.11.11;transport=tcp")
3.3 avp_aliases
(字符串)
- 功能:为AVP伪变量定义别名。
- 默认值:
NULL
。 - 示例:
modparam("pv", "avp_aliases", "email=s:email_addr;tmp=i:100")
4. 函数
PV模块提供了以下函数,可以在配置脚本中使用:
4.1 pv_isset(pvar)
- 功能:检查伪变量的值是否为
null
。 - 参数:
pvar
- 伪变量标识符。 - 示例:
if(pv_isset("$avp(s:x)")) { ... }
4.2 pv_unset(pvar)
- 功能:取消设置伪变量的值(例如删除AVP或设置为
null
)。 - 参数:
pvar
- 伪变量标识符。 - 示例:
pv_unset("$avp(s:x)");
4.3 is_int(pvar)
- 功能:检查伪变量是否包含整数值。
- 参数:
pvar
- 伪变量标识符。 - 返回值:
1
(是整数),-1
(不是整数)。 - 示例:
if (is_int("$var(foo)")) { xlog("L_INFO", "variable foo contains integer value\n"); }
4.4 typeof(pvar, vtype)
- 功能:检查伪变量的类型是否匹配指定的类型。
- 参数:
pvar
- 伪变量标识符。vtype
- 类型(int
:整数,str
:字符串,null
:空值)。
- 返回值:
true
(类型匹配),false
(类型不匹配)。 - 示例:
if (typeof("$var(foo)", "str")) { xdbg("variable foo is a string\n"); }
4.5 not_empty(pvar)
- 功能:检查伪变量是否为非空字符串。
- 参数:
pvar
- 伪变量标识符。 - 返回值:
true
(非空),false
(空)。 - 示例:
if (not_empty("$var(foo)")) { append_hf("X-Foo: $var(foo)\r\n"); }
4.6 xavp_copy(source_name, source_index, destination_name)
- 功能:复制并追加一个XAVP。
- 参数:
source_name
- 源XAVP名称。source_index
- 源XAVP索引。destination_name
- 目标XAVP名称。
- 示例:
xavp_copy("a", "2", "b");
4.7 xavp_params_explode(sparams, xname)
- 功能:将参数字符串转换为XAVP属性。
- 参数:
sparams
- 参数字符串(格式:name1=value1;name2=value2
)。xname
- 目标XAVP名称。
- 示例:
xavp_params_explode("a=b;c=d;e=f", "x");
4.8 xavp_params_implode(xname, pvname)
- 功能:将XAVP属性序列化为参数字符串。
- 参数:
xname
- 源XAVP名称。pvname
- 目标变量名称。
- 示例:
xavp_params_implode("x", "$var(out)");
5. RPC命令
PV模块支持通过RPC命令进行管理,例如:
- pv.shvSet:设置共享变量的值。
- pv.shvGet:获取共享变量的值。
6. 总结
PV模块是Kamailio中非常重要的模块,提供了丰富的伪变量操作功能。通过配置参数和函数,可以实现灵活的变量管理和操作。开发者可以通过RPC命令进一步扩展其功能,例如动态设置和获取共享变量的值。
这段代码是关于Kamailio中PV Headers模块的详细说明。PV Headers模块的主要目标是将SIP消息头的处理转移到XAVI动态容器中,并提供高级方法和伪变量来简化SIP消息头的修改。
PV Headers 模块
1. 概述
PV Headers模块的核心功能是将SIP消息头的处理转移到XAVI动态容器中,并提供高级方法和伪变量来简化SIP消息头的修改。通过该模块,可以轻松地收集、修改和应用SIP消息头。
2. 依赖
2.1 Kamailio模块
- uac模块:用于处理From/To头的修改。
- tm模块:如果
auto_msg
参数设置为1,则需要加载tm模块。
2.2 外部库
- 无。
3. 参数
PV Headers模块提供了以下配置参数:
3.1 xavi_name
(字符串)
- 功能:定义存储收集到的消息头的XAVI名称。
- 默认值:
"headers"
。 - 示例:
结果:modparam("pv_headers", "xavi_name", "headers")
$xavi(headers[0]=>From)
$xavi(headers[0]=>To)
$xavi(headers[0]=>Call-ID)
3.2 header_value_size
(整数)
- 功能:定义SIP消息头值的最大长度。超过该长度的头值将被截断。
- 默认值:
1024
。 - 示例:
modparam("pv_headers", "header_value_size", 512)
3.3 header_collect_flag
(整数)
- 功能:用于标记消息头是否已被收集。如果消息头已被收集,则后续的收集操作将失败。
- 默认值:
27
。 - 示例:
modparam("pv_headers", "header_collect_flag", 17)
3.4 header_apply_flag
(整数)
- 功能:用于标记消息头是否已被应用。如果消息头已被应用,则后续的应用操作将失败。
- 默认值:
28
。 - 示例:
modparam("pv_headers", "header_apply_flag", 18)
3.5 skip_headers
(字符串)
- 功能:定义需要跳过的消息头列表(逗号分隔)。这些消息头在应用时不会被处理。
- 默认值:
"Record-Route,Via,Route,Content-Length,Max-Forwards,CSeq"
。 - 示例:
modparam("pv_headers", "skip_headers", "Record-Route,Via,Route")
3.6 split_headers
(字符串)
- 功能:定义需要拆分的消息头列表(逗号分隔)。如果这些消息头的值是逗号分隔的列表,则会被拆分为多个消息头。
- 默认值:
""
。 - 示例:
结果:modparam("pv_headers", "split_headers", "Diversion")
- 原始消息头:
Diversion: <user1@test.local>,<user2@test.local>,<user3@test.local>
- 拆分后:
Diversion: <user1@test.local>
,Diversion: <user2@test.local>
,Diversion: <user3@test.local>
- 原始消息头:
3.7 auto_msg
(整数)
- 功能:定义是否自动收集传入消息的头,并在转发消息时自动应用头。
- 默认值:
1
(启用)。 - 示例:
modparam("pv_headers", "auto_msg", 1)
4. 函数
PV Headers模块提供了以下函数,可以在配置脚本中使用:
4.1 pvh_collect_headers()
- 功能:将消息中的所有头收集到XAVP中。通常在接收到SIP消息时调用。
- 示例:
pvh_collect_headers();
4.2 pvh_apply_headers()
- 功能:将XAVP中的头状态应用到实际的消息头中。通常在消息即将离开Kamailio时调用。
- 示例:
pvh_apply_headers();
4.3 pvh_reset_headers()
- 功能:重置XAVP中的头状态。
- 示例:
pvh_reset_headers();
4.4 pvh_check_header(hname)
- 功能:检查指定的头是否已存在于XAVP中。
- 参数:
hname
- 头名称。 - 示例:
if (pvh_check_header("From")) { ... }
4.5 pvh_append_header(hname, hvalue)
- 功能:在XAVP中追加一个新的头。
- 参数:
hname
- 头名称。hvalue
- 头值。
- 示例:
pvh_append_header("X-My-Header", "MyValue");
4.6 pvh_modify_header(hname, hvalue, [idx])
- 功能:修改XAVP中已存在的头。
- 参数:
hname
- 头名称。hvalue
- 头值。idx
- 头的索引(可选)。
- 示例:
pvh_modify_header("From", "sip:alice@example.com");
4.7 pvh_remove_header(hname, [idx])
- 功能:从XAVP中移除指定的头。
- 参数:
hname
- 头名称。idx
- 头的索引(可选)。
- 示例:
pvh_remove_header("X-My-Header");
4.8 pvh_value_exists(hname, hparameter)
- 功能:检查指定的头中是否包含指定的参数。
- 参数:
hname
- 头名称。hparameter
- 参数名称。
- 示例:
if (pvh_value_exists("From", "tag")) { ... }
4.9 pvh_remove_header_param(hname, hparameter)
- 功能:从指定的头中移除指定的参数。
- 参数:
hname
- 头名称。hparameter
- 参数名称。
- 示例:
pvh_remove_header_param("From", "tag");
5. 导出变量
PV Headers模块导出了以下伪变量,可以在配置脚本中使用:
$x_hdr
:消息头。$x_fu
:From头的URI部分。$x_fU
:From头的用户名部分。$x_fd
:From头的域名部分。$x_fn
:From头的显示名称。$x_ft
:From头的标签部分。$x_tu
:To头的URI部分。$x_tU
:To头的用户名部分。$x_td
:To头的域名部分。$x_tn
:To头的显示名称。$x_tt
:To头的标签部分。$x_rs
:Reply-To头的URI部分。$x_rr
:Record-Route头的URI部分。
6. 总结
PV Headers模块是Kamailio中用于简化SIP消息头处理的强大工具。通过该模块,可以轻松地收集、修改和应用SIP消息头,同时提供了丰富的伪变量和函数来支持复杂的头操作。开发者可以通过配置参数和函数进一步扩展其功能,例如动态修改From/To头或移除特定的头参数。
APP_LUA模块
1. 概述
App Lua模块允许在Kamailio配置文件中执行Lua脚本,并实现了KEMI框架。KEMI框架允许通过外部脚本语言(如Lua)来控制Kamailio的行为,而不需要直接修改C代码。
Lua是一种快速且易于嵌入的脚本语言。Kamailio通过KSR
模块向Lua脚本导出API,开发者可以通过Lua脚本来操作SIP消息、调用Kamailio函数等。
App Lua模块有两个Lua上下文:
- 第一个上下文:用于
lua_dofile()
和lua_dostring()
函数。 - 第二个上下文:用于
lua_run()
函数和load
参数。这个上下文用于缓存模式,避免每次执行时都重新读取文件。
2. 依赖
2.1 Kamailio模块
- 无。
2.2 外部库
- liblua5.1-dev:Lua开发库(支持5.2、5.3、5.4版本)。
- libluajit-5.1-dev:如果使用LuaJIT编译器,则需要此库。
3. 参数
App Lua模块提供了以下配置参数:
3.1 load
(字符串)
- 功能:设置启动时要加载的Lua脚本路径。加载后,可以使用
lua_run(function, params)
在运行时执行脚本中的函数。 - 默认值:
null
。 - 示例:
modparam("app_lua", "load", "/usr/local/etc/kamailio/lua/myscript.lua")
3.2 reload
(布尔值)
- 功能:是否启用脚本重载功能。如果设置为1,则可以通过RPC命令
app_lua.reload
重载脚本。 - 默认值:
1
(启用)。 - 示例:
modparam("app_lua", "reload", 0)
3.3 log_mode
(整数)
- 功能:控制日志消息的输出内容。如果设置了第1位,则模块会为每个KEMI导出函数打印调试消息。
- 默认值:
0
。 - 示例:
modparam("app_lua", "log_mode", 1)
4. 函数
App Lua模块提供了以下函数,可以在配置脚本中使用:
4.1 lua_dofile(path)
- 功能:执行指定路径的Lua脚本。
- 参数:
path
- Lua脚本路径(可以是包含伪变量的字符串)。 - 示例:
lua_dofile("/usr/local/etc/kamailio/lua/myscript.lua");
4.2 lua_dostring(script)
- 功能:执行参数中的Lua脚本。
- 参数:
script
- Lua脚本(可以是包含伪变量的字符串)。 - 示例:
if(!lua_dostring("KSR.log([[err]], [[----------- Hello World from $fU\n]])")) { xdbg("SCRIPT: failed to execute lua script!\n"); }
4.3 lua_run(func [, params])
- 功能:执行Lua脚本中的指定函数,并传递参数。
- 参数:
func
- Lua函数名。params
- 传递给函数的参数(最多3个字符串参数)。
- 示例:
if(!lua_run("sr_append_fu_to_reply")) { xdbg("SCRIPT: failed to execute lua function!\n"); }
4.4 lua_runstring(script)
- 功能:执行参数中的Lua脚本。脚本在启动时加载的Lua上下文中执行。
- 参数:
script
- Lua脚本(可以是包含伪变量的字符串)。 - 示例:
if(!lua_runstring("KSR.log([[err]], [[----------- Hello World from $fU\n]])")) { xdbg("SCRIPT: failed to execute lua script!\n"); }
5. RPC命令
App Lua模块支持通过RPC命令进行管理,例如:
- app_lua.list:列出通过
load
参数加载的所有脚本。 - app_lua.reload:标记需要重载的脚本。
- app_lua.api_list:列出导出的KEMI函数。
6. 使用示例
创建一个Lua脚本并存储在文件系统中,例如:/usr/local/etc/kamailio/lua/myscript.lua
。
function sr_append_fu_to_reply()
KSR.hdr.append_to_reply("P-From: " .. KSR.pv.get("$fu") .. "\r\n");
end
在Kamailio配置文件中加载脚本并执行函数:
modparam("app_lua", "load", "/usr/local/etc/kamailio/lua/myscript.lua")
route {
...
if(!lua_run("sr_append_fu_to_reply")) {
xdbg("SCRIPT: failed to execute lua function!\n");
}
...
}
7. 总结
App Lua模块是Kamailio中用于执行Lua脚本的强大工具,通过KEMI框架导出了丰富的API供Lua脚本使用。开发者可以通过Lua脚本来实现复杂的SIP消息处理逻辑,而无需修改Kamailio的C代码。通过配置参数和RPC命令,可以灵活地管理和重载Lua脚本。
这段代码是关于Kamailio中App Lua SR模块的详细说明。App Lua SR模块导出了Lua模块sr
,这是在KEMI框架之前存在的旧API。该模块依赖于app_lua
模块,并主要用于支持旧版Lua脚本的平滑迁移。
App Lua SR模块
1. 概述
App Lua SR模块导出了Lua模块sr
,这是在KEMI框架之前存在的旧API。该模块的主要目的是为了支持使用sr
模块的旧版Lua脚本平滑迁移到KEMI框架和KSR
模块。
注意:该模块将在未来被标记为过时并最终移除。如果发现sr
模块中有任何函数在KSR
模块中没有对应的替代函数,请报告给sr-dev
邮件列表。
Lua是一种快速且易于嵌入的脚本语言。Kamailio通过sr
模块向Lua脚本导出API,开发者可以通过Lua脚本来操作SIP消息、调用Kamailio函数等。
2. 依赖
2.1 Kamailio模块
- app_lua模块:Lua解释器模块。
- 其他模块:由
register
参数指定的模块。
2.2 外部库
- liblua5.1-dev:Lua开发库。
- libluajit-5.1-dev:如果使用LuaJIT编译器,则需要此库。
3. 参数
App Lua SR模块提供了以下配置参数:
3.1 register
(字符串)
- 功能:将Kamailio子模块注册到Lua中。可注册的子模块包括:
alias_db
:注册alias_db
模块的函数到sr.alias_db
。auth
:注册auth
模块的函数到sr.auth
。auth_db
:注册auth_db
模块的函数到sr.auth_db
。dispatcher
:注册dispatcher
模块的函数到sr.dispatcher
。maxfwd
:注册maxfwd
模块的函数到sr.maxfwd
。msilo
:注册msilo
模块的函数到sr.msilo
。presence
:注册presence
模块的函数到sr.presence
。presence_xml
:注册presence_xml
模块的函数到sr.presence_xml
。pua_usrloc
:注册pua_usrloc
模块的函数到sr.pua_usrloc
。registrar
:注册registrar
模块的函数到sr.registrar
。rls
:注册rls
模块的函数到sr.rls
。rr
:注册rr
模块的函数到sr.rr
。sanity
:注册sanity
模块的函数到sr.sanity
。sdpops
:注册sdpops
模块的函数到sr.sdpops
。siputils
:注册siputils
模块的函数到sr.siputils
。sl
:注册sl
模块的函数到sr.sl
。sqlops
:注册sqlops
模块的函数到sr.sqlops
。textops
:注册textops
模块的函数到sr.textops
。tm
:注册tm
模块的函数到sr.tm
。xhttp
:注册xhttp
模块的函数到sr.xhttp
。
注意:sr
、sr.hdr
和sr.pv
模块始终会注册到Lua中。
- 默认值:
null
。 - 示例:
modparam("app_lua_sr", "register", "sl")
4. 总结
App Lua SR模块是为了支持旧版Lua脚本而存在的过渡模块,导出了sr
模块供Lua脚本使用。随着KEMI框架的引入,推荐使用KSR
模块来替代sr
模块。开发者可以通过register
参数将Kamailio子模块注册到Lua中,以便在Lua脚本中调用这些模块的函数。
在SIP(Session Initiation Protocol)协议中,B2BUA(Back-to-Back User Agent) 和 Proxy Server 是两种常见的服务器类型,它们在SIP通信中扮演不同的角色。以下是对它们的详细讲解:
1. Proxy Server(代理服务器)
1.1 概述
Proxy Server 是SIP协议中的一种中间服务器,负责转发SIP消息(如INVITE、REGISTER等)。它不直接参与媒体流的传输,而是专注于路由和转发SIP信令。
1.2 主要功能
- 消息路由:根据SIP消息中的路由信息(如Request-URI、Route头字段)将消息转发到目标用户或下一个代理服务器。
- 负载均衡:在多服务器环境中,Proxy Server可以将请求分发到不同的服务器,以实现负载均衡。
- 安全控制:可以对SIP消息进行认证、鉴权和加密(如TLS)。
- 会话管理:支持会话的建立、修改和终止,但不直接处理媒体流。
1.3 工作模式
- 无状态代理(Stateless Proxy):
- 不维护会话状态,仅转发消息。
- 适用于高性能场景,但对复杂业务支持有限。
- 有状态代理(Stateful Proxy):
- 维护会话状态,能够处理复杂的业务逻辑(如重试、超时处理)。
- 适用于需要会话管理的场景。
1.4 典型应用场景
- SIP注册服务器:处理用户的注册请求(REGISTER)。
- SIP路由服务器:根据路由策略转发SIP消息。
- SIP负载均衡器:将请求分发到多个服务器。
1.5 优点
- 轻量级,专注于信令转发。
- 支持高并发和负载均衡。
- 易于扩展和部署。
1.6 缺点
- 不直接处理媒体流,无法对媒体流进行控制或修改。
- 对复杂业务逻辑的支持有限。
2. B2BUA(Back-to-Back User Agent,背靠背用户代理)
2.1 概述
B2BUA 是一种特殊的SIP服务器,它同时扮演UAC(User Agent Client) 和 UAS(User Agent Server) 的角色。B2BUA 会终止来自一端的SIP会话,并重新发起一个新的SIP会话到另一端,因此它可以完全控制会话的建立和媒体流的传输。
2.2 主要功能
- 会话控制:B2BUA 可以完全控制会话的建立、修改和终止。
- 媒体流控制:B2BUA 可以插入自己作为媒体流的中间节点,对媒体流进行修改或录制。
- 协议转换:B2BUA 可以在不同的协议之间进行转换(如SIP到H.323)。
- 业务逻辑支持:支持复杂的业务逻辑,如呼叫转移、呼叫保持、录音等。
2.3 工作模式
- 会话终止与重建:
- B2BUA 会终止来自一端的SIP会话,并重新发起一个新的SIP会话到另一端。
- 例如,当A呼叫B时,B2BUA 会终止A的INVITE请求,并重新发起一个INVITE请求到B。
- 媒体流控制:
- B2BUA 可以作为媒体流的中间节点,对媒体流进行录制、转码或转发。
2.4 典型应用场景
- 呼叫中心系统:支持复杂的呼叫控制逻辑(如呼叫转移、呼叫保持)。
- SIP Trunking:在企业PBX和运营商之间充当中间节点。
- 协议转换:在不同协议之间进行转换(如SIP到H.323)。
- 媒体流处理:支持媒体流的录制、转码或转发。
2.5 优点
- 完全控制会话和媒体流。
- 支持复杂的业务逻辑。
- 可以在不同协议之间进行转换。
2.6 缺点
- 复杂性高,开发和维护成本较大。
- 性能开销较大,不适合高并发场景。
3. B2BUA 和 Proxy Server 的区别
特性 | Proxy Server | B2BUA |
---|---|---|
会话状态 | 无状态或有状态 | 有状态 |
媒体流处理 | 不处理媒体流 | 可以处理媒体流 |
会话控制 | 仅转发信令 | 完全控制会话 |
协议转换 | 不支持 | 支持 |
复杂性 | 简单 | 复杂 |
性能 | 高性能,适合高并发 | 性能开销较大 |
典型应用 | 路由、负载均衡、注册 | 呼叫控制、协议转换、媒体流处理 |
4. 选择 B2BUA 还是 Proxy Server?
-
选择 Proxy Server 的场景:
- 需要高性能的信令转发。
- 不需要对媒体流进行控制。
- 业务逻辑简单,仅需路由和负载均衡。
-
选择 B2BUA 的场景:
- 需要对会话和媒体流进行完全控制。
- 需要支持复杂的业务逻辑(如呼叫转移、录音)。
- 需要在不同协议之间进行转换。
5. 实际应用示例
5.1 Proxy Server 示例
- 场景:用户A呼叫用户B,Proxy Server 负责将INVITE请求转发到用户B。
- 流程:
- 用户A发送INVITE请求到Proxy Server。
- Proxy Server 根据路由策略将INVITE请求转发到用户B。
- 用户B回复200 OK,Proxy Server 将响应转发回用户A。
- 用户A和用户B直接建立媒体流。
5.2 B2BUA 示例
- 场景:用户A呼叫用户B,B2BUA 作为中间节点控制会话和媒体流。
- 流程:
- 用户A发送INVITE请求到B2BUA。
- B2BUA 终止用户A的会话,并重新发起一个INVITE请求到用户B。
- 用户B回复200 OK,B2BUA 将响应转发回用户A。
- B2BUA 作为媒体流的中间节点,控制用户A和用户B之间的媒体流。
6. 总结
- Proxy Server 是一种轻量级的中间服务器,专注于信令的转发和路由,适合高性能、低复杂度的场景。
- B2BUA 是一种功能强大的中间服务器,能够完全控制会话和媒体流,适合需要复杂业务逻辑和媒体流处理的场景。
根据实际需求选择合适的服务器类型,可以更好地满足SIP通信的需求。