一、为什么一个号码可能对应多个终端
在 SIP 中,一个用户标识并不一定只绑定到一个终端。一个用户可能同时登录了桌面软电话、移动端、Web 客户端,甚至多个分支设备。于是当一个 INVITE 到来时,系统会面临一个问题:到底把请求送到哪一个终端?
这就引出了分叉(Forking)、并行振铃和重定向等机制。
二、什么是分叉(Forking)
分叉指的是代理服务器在收到一个请求后,把它复制并转发到多个可能的目标分支。它的核心思想是:既然目标用户可能在多个位置可达,那就同时或按顺序去尝试这些位置。
分叉并不是“重复发送同一个请求而已”,它意味着代理要管理多个分支事务、多个临时响应,最终再收敛成合适的结果返回给上游。
三、并行分叉与串行分叉
1. 并行分叉
代理同时向多个目标发起请求。直观效果往往就是多个终端一起响铃,也就是常说的并行振铃。
2. 串行分叉
代理按顺序尝试多个目标,一个失败或超时后,再转到下一个目标。它更像“依次呼叫多个联系点”。
四、为什么分叉会让抓包变复杂
因为同一个上游 INVITE,可能在下游展开成多个分支事务,于是会出现:
- 多个 180 Ringing
- 多个 183 Session Progress
- 不同分支返回不同失败码
- 某一分支先返回 200 OK,其他分支需要被取消
这也是为什么分叉场景下,单纯按“一个请求对应一个响应”的线性思路看抓包,往往会被绕晕。
五、并行振铃的本质
并行振铃本质上不是一个独立协议功能,而是并行分叉在用户侧最直观的体现。多个已注册终端同时收到 INVITE,于是一起振铃;最终谁先接听,谁就可能成为胜出的那一支。
六、为什么有时一个分支接听了,其他分支会被 CANCEL
因为一旦某个分支成功建立会话,其余尚未完成的分支就不应继续保持等待状态。代理通常会向这些未胜出的分支发送 CANCEL,以便让状态收敛,避免多个终端都以为通话还在等待处理。
七、重定向(Redirect)和分叉有什么不同
重定向不是代理自己继续代为转发,而是告诉请求发起方:你应该改去联系另一个目标地址。典型理解是:
- 分叉:代理自己负责把请求送往多个候选目标
- 重定向:代理返回新的目标信息,让上游或客户端自行重新发起请求
所以两者的核心差别在于:谁继续承担后续路由动作。
八、分叉场景下为什么 200 OK 特别值得关注
因为理论上多个分支都可能在时间上接近地返回成功响应,而上游最终只会接受其中一个有效会话。系统需要处理胜出分支与其余分支的收敛问题,这也是分叉复杂度高于单一路由的重要原因。
九、早期媒体与分叉为什么经常一起出现复杂现象
如果多个分支都返回 183 并携带 SDP,那么早期媒体处理会比普通单分支场景复杂得多。此时不仅要考虑哪个分支最终胜出,还要考虑临时响应、媒体选择、状态同步等问题。
十、从理论上抓住这类机制的关键
- 一个逻辑目标可能对应多个物理联系点
- 代理既可以并行尝试,也可以串行尝试
- 并行振铃是并行分叉的用户体验体现
- 重定向的重点不是代转发,而是返回新的目标信息
- 分叉会让事务数量、临时响应和状态收敛都变复杂
十一、总结
分叉、并行振铃和重定向,本质上都在解决 SIP 的“用户定位与可达性”问题,只是解决方式不同:
- 分叉:代理主动尝试多个位置
- 并行振铃:并行分叉在终端侧的体现
- 重定向:代理返回新目标,由请求方自行继续
理解这几个机制后,再看复杂呼叫、多个终端同时在线、多个临时响应并存的抓包现象,就不容易把它们误判成异常行为。