Osip源代码框架09--网关背靠背和代理模式处理dialog

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八月的雨季997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值