文章目录
1 UAC 和 UAS 定义
客户端(User Agent Client,UAC):
-
主动发起 SIP 请求的一方,例如发起呼叫的用户代理
-
Dialog 类型(type):通常为CALLER(呼叫方)
-
初始化方式:
当 UAC 发送请求并收到响应时,通过osip_dialog_init_as_uac初始化 Dialog,此时 Dialog 中的local_tag为 UAC 生成的标签,remote_tag为响应中对方(UAS)返回的标签。若 UAC 接收到来自 UAS 的请求(如被叫方回呼),则通过osip_dialog_init_as_uac_with_remote_request初始化,此时需从请求中提取对方的call_id、remote_tag等信息。
-
匹配逻辑:使用osip_dialog_match_as_uac,通过检查响应中的call_id、to_tag(即 UAC 的local_tag)和from_tag(UAS 的remote_tag)是否与 Dialog 中存储的信息一致来匹配 Dialog。若标签不存在,会降级匹配from_uri和to_uri
服务端(User Agent Server,UAS)
- 接收并处理 SIP 请求的一方,例如接听呼叫的用户代理。
- Dialog 类型(type):通常为CALLEE(被呼叫方
- 初始化方式:通过osip_dialog_init_as_uas初始化,此时local_tag为 UAS 生成的标签,remote_tag为请求中 UAC 携带的标签,call_id从请求中提取
- 匹配逻辑:使用osip_dialog_match_as_uas,匹配逻辑与 UAC 类似,通过请求中的call_id、from_tag(UAC 的remote_tag)和to_tag(UAS 的local_tag)进行匹配,标签缺失时同样降级匹配 URI
2 Dialog 在 UAC 与 UAS 中的典型流程
UAC 场景(如发起呼叫)
- UAC 生成call_id和local_tag,构造 INVITE 请求发送给 UAS,请求中携带from_tag(UAC 的local_tag)。
- UAS 接收到请求后,生成local_tag,通过osip_dialog_init_as_uas初始化 Dialog,并在响应中返回to_tag(UAS 的local_tag)。
- UAC 收到响应后,使用osip_dialog_init_as_uac初始化 Dialog,将响应中的to_tag存入remote_tag,完成 Dialog 建立。
UAS 场景(如接收呼叫)
- UAS 接收到 UAC 的 INVITE 请求,提取call_id和from_tag(UAC 的local_tag),生成自身local_tag,通过osip_dialog_init_as_uas建立 Dialog。
- 后续 UAC 发送的请求(如 ACK)或 UAS 返回的响应,均通过call_id和标签匹配到对应的 Dialog,确保消息属于同一会话。
3 网关处理dialog
网关的角色:通常作为代理服务器(Proxy Server) 或背靠背用户代理(B2BUA),不直接作为 UAC/UAS,而是转发或处理信令.
假设 Eyebeam A 发起呼叫,Eyebeam B 接听,网关作为中间设备:
Eyebeam A:
发起 INVITE 请求 → 扮演UAC。
向网关发送请求,请求中包含自身的local_tag和call_id。
网关:
接收 INVITE 请求,作为代理转发至 Eyebeam B → 不直接作为 UAC/UAS,而是处理信令路由(修改 Via、Route 头字段)。
若网关为 B2BUA,则会拆分为两个 Dialog:
与 Eyebeam A 的 Dialog 中扮演UAS;
与 Eyebeam B 的 Dialog 中扮演UAC。
Eyebeam B:
接收网关转发的 INVITE 请求 → 扮演UAS,返回响应(如 100 Trying、200 OK)。
Eyebeam 呼叫流程中的网关交互细节:
-
Eyebeam A(UAC)发起呼叫:
构造 INVITE 请求,包含call_id、from_tag(local_tag)。
发送至网关,请求中的Via头包含 Eyebeam A 的地址。 -
网关处理 INVITE 请求:
修改Via头,添加网关地址,移除 Eyebeam A 的地址(或保留多层 Via)
解析 To URI,确定 Eyebeam B 的地址,转发 INVITE 请求。 -
Eyebeam B(UAS)响应:
返回 200 OK 响应,包含to_tag(local_tag)。
响应经网关转发至 Eyebeam A,网关修改 Via 头以确保路径正确。 -
Eyebeam A 发送 ACK:
ACK 经网关转发至 Eyebeam B,完成 Dialog 建立。
4 网关代码关键逻辑(基于 osip 库)
/* 网关作为代理服务器的核心处理函数 */
int gateway_proxy_process_message(osip_message_t

最低0.47元/天 解锁文章
637

被折叠的 条评论
为什么被折叠?



