SIP理论篇13:分叉、并行振铃与重定向机制详解

一、为什么一个号码可能对应多个终端

在 SIP 中,一个用户标识并不一定只绑定到一个终端。一个用户可能同时登录了桌面软电话、移动端、Web 客户端,甚至多个分支设备。于是当一个 INVITE 到来时,系统会面临一个问题:到底把请求送到哪一个终端?

这就引出了分叉(Forking)、并行振铃和重定向等机制。

二、什么是分叉(Forking)

分叉指的是代理服务器在收到一个请求后,把它复制并转发到多个可能的目标分支。它的核心思想是:既然目标用户可能在多个位置可达,那就同时或按顺序去尝试这些位置。

分叉并不是“重复发送同一个请求而已”,它意味着代理要管理多个分支事务、多个临时响应,最终再收敛成合适的结果返回给上游。

三、并行分叉与串行分叉

1. 并行分叉

代理同时向多个目标发起请求。直观效果往往就是多个终端一起响铃,也就是常说的并行振铃。

2. 串行分叉

代理按顺序尝试多个目标,一个失败或超时后,再转到下一个目标。它更像“依次呼叫多个联系点”。

四、为什么分叉会让抓包变复杂

因为同一个上游 INVITE,可能在下游展开成多个分支事务,于是会出现:

  • 多个 180 Ringing
  • 多个 183 Session Progress
  • 不同分支返回不同失败码
  • 某一分支先返回 200 OK,其他分支需要被取消

这也是为什么分叉场景下,单纯按“一个请求对应一个响应”的线性思路看抓包,往往会被绕晕。

五、并行振铃的本质

并行振铃本质上不是一个独立协议功能,而是并行分叉在用户侧最直观的体现。多个已注册终端同时收到 INVITE,于是一起振铃;最终谁先接听,谁就可能成为胜出的那一支。

六、为什么有时一个分支接听了,其他分支会被 CANCEL

因为一旦某个分支成功建立会话,其余尚未完成的分支就不应继续保持等待状态。代理通常会向这些未胜出的分支发送 CANCEL,以便让状态收敛,避免多个终端都以为通话还在等待处理。

七、重定向(Redirect)和分叉有什么不同

重定向不是代理自己继续代为转发,而是告诉请求发起方:你应该改去联系另一个目标地址。典型理解是:

  • 分叉:代理自己负责把请求送往多个候选目标
  • 重定向:代理返回新的目标信息,让上游或客户端自行重新发起请求

所以两者的核心差别在于:谁继续承担后续路由动作

八、分叉场景下为什么 200 OK 特别值得关注

因为理论上多个分支都可能在时间上接近地返回成功响应,而上游最终只会接受其中一个有效会话。系统需要处理胜出分支与其余分支的收敛问题,这也是分叉复杂度高于单一路由的重要原因。

九、早期媒体与分叉为什么经常一起出现复杂现象

如果多个分支都返回 183 并携带 SDP,那么早期媒体处理会比普通单分支场景复杂得多。此时不仅要考虑哪个分支最终胜出,还要考虑临时响应、媒体选择、状态同步等问题。

十、从理论上抓住这类机制的关键

  • 一个逻辑目标可能对应多个物理联系点
  • 代理既可以并行尝试,也可以串行尝试
  • 并行振铃是并行分叉的用户体验体现
  • 重定向的重点不是代转发,而是返回新的目标信息
  • 分叉会让事务数量、临时响应和状态收敛都变复杂

十一、总结

分叉、并行振铃和重定向,本质上都在解决 SIP 的“用户定位与可达性”问题,只是解决方式不同:

  • 分叉:代理主动尝试多个位置
  • 并行振铃:并行分叉在终端侧的体现
  • 重定向:代理返回新目标,由请求方自行继续

理解这几个机制后,再看复杂呼叫、多个终端同时在线、多个临时响应并存的抓包现象,就不容易把它们误判成异常行为。


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇