SIP协议本身是一个无状态的呼叫建立协议——它只负责协商出一个会话(通过INVITE/200 OK/ACK三向握手),此后媒体流由RTP承载,信令面就"沉默"了。这种设计带来一个致命问题:当某一侧崩溃、断电、无线链路中断或信令链路被悄悄拆除时,对端无从感知,会话状态会一直挂在网络里,成为"僵死会话"(ghost call / stale session)。
在VoLTE/VoNR场景下,一个僵死会话的代价远超企业IP电话:它持续占用着一个专用QoS流(5QI=1的GBR承载),消耗着传输资源、P-CSCF/会话状态机内存,以及为该会话授权的保证比特率(GBR)。运营商网络的呼损率、寻呼容量、无线资源调度都会因此恶化。
为根治这个问题,IETF在RFC 4028《Session Timers in the Session Initiation Protocol (SIP)》中定义了会话定时器(Session Timer)扩展,3GPP在其IMS呼叫控制规范 TS 24.229 中将其强制纳入UE与P-CSCF的必选能力。本文聚焦VoNR/VoLTE网络中会话定时器的协商、刷新与超时释放全信令链,逐一拆解每个Information Element的设计意图与工程实战。
会话定时器是一个跨IETF与3GPP的复合机制,其规范来源分两层:
| 层级 | 规范 | 定位 |
|---|---|---|
| 协议语义层 | RFC 4028(draft-ietf-sipcore-rfc4028bis为其维护更新) | 定义头域、422响应、refresher协商、刷新规则 |
| IMS适配层 | 3GPP TS 24.229 §5.1.2.2.2、§5.4、§7.7 | 规定P-CSCF/UE如何使用、定时器默认值、与Rx接口联动 |
| 架构层 | 3GPP TS 23.228、TS 23.501 | P-CSCF在IMS/5G中的位置、与PCF的N5/Rx关系 |
3GPP TS 24.229 Section 7.7(SIP定时器)明确列出:会话定时器相关的 Min-SE 默认取值为 90秒,Session-Expires 由UE与P-CSCF协商确定,典型值在VoNR网络中为 1800秒(30分钟) 或 3600秒(1小时)。P-CSCF被要求在所有发往UE的INVITE/UPDATE中插入或校验 Session-Expires 头域,这是VoNR中"网络侧主导会话活性管理"的法律依据。
会话定时器的全部威力浓缩在三个SIP头域和一个响应码中。
graph TD
A["会话定时器IE体系<br/>RFC 4028 / TS 24.229"] --> B["Session-Expires 头域"]
A --> C["Min-SE 头域"]
A --> D["Supported/Require: timer 选项标签"]
A --> E["422 Session Interval Too Small 响应"]
B --> B1["参数: delta-seconds<br/>会话存活总时长(秒)"]
B --> B2["参数: refresher=uac/uas<br/>指定谁发起刷新"]
C --> C1["参数: delta-seconds<br/>可接受的最小刷新间隔"]
C --> C2["默认值: 90秒<br/>(TS 24.229 §7.7)"]
D --> D1["Supported: timer<br/>声明支持会话定时器"]
D --> D2["Require: timer<br/>强制对端启用"]
E --> E1["触发条件: Session-Expires < 对端Min-SE"]
E --> E2["必须携带Min-SE告知重试值"]
style B fill:#e1f5ff,stroke:#0277bd
style E fill:#fff3e0,stroke:#ef6c00
style C fill:#f3e5f5,stroke:#6a1b9a
| IE/参数 | 所在消息 | 含义 | 典型值 | 设计意图 |
|---|---|---|---|---|
Supported: timer |
INVITE/200 OK | 声明本端支持会话定时器(软要求) | 固定标签 | 允许能力探测,不强制对端 |
Require: timer |
INVITE/200 OK | 强制对端启用定时器(硬要求) | 固定标签 | P-CSCF用于强制UE保活 |
Session-Expires: <sec>;refresher=<uac\|uas> |
INVITE、2xx | 会话总存活时间及刷新方角色 | 1800;refresher=uas | 单一协商点确定"活多久"+"谁续命" |
Min-SE: <sec> |
INVITE、422、响应 | 本端能接受的最小刷新间隔下限 | 90 | 防止对端用极短间隔制造信令风暴 |
| 422响应 | 对INVITE的拒绝 | "会话间隔太小",必须回带Min-SE | — | 让发起方按新下限重试,避免盲目循环 |
| UPDATE(刷新载体) | 周期性 | 不改变Dialog状态的轻量刷新 | 无SDP或同SDP | 比re-INVITE开销小,不重协商媒体 |
下图为VoNR网络中一次会话定时器完整生命周期的时序,覆盖了初始协商失败→422重协商→正常刷新→超时强制释放四种路径。
sequenceDiagram
autonumber
participant UE as UE(主叫)
participant PCSCF as P-CSCF
participant SCSCF as S-CSCF
participant Term as 被叫UE
Note over UE,PCSCF: 阶段1: 初始INVITE(间隔过小)
UE->>PCSCF: INVITE<br/>Supported: timer<br/>Session-Expires: 60;refresher=uac<br/>Min-SE: 60
Note right of PCSCF: P-CSCF策略Min-SE=90<br/>60 < 90 → 拒绝
PCSCF-->>UE: 422 Session Interval Too Small<br/>Min-SE: 90
Note left of UE: 学习到对端Min-SE
Note over UE,PCSCF: 阶段2: 重协商INVITE(合规)
UE->>PCSCF: INVITE(重试)<br/>Require: timer<br/>Session-Expires: 1800;refresher=uac<br/>Min-SE: 90
PCSCF->>SCSCF: INVITE<br/>Session-Expires: 1800;refresher=uac
SCSCF->>Term: 透传INVITE
Term-->>SCSCF: 200 OK<br/>Session-Expires: 1800;refresher=uas
Note right of SCSCF: UAS可反转refresher角色
SCSCF-->>PCSCF: 200 OK
PCSCF-->>UE: 200 OK<br/>Session-Expires: 1800;refresher=uas
UE->>PCSCF: ACK
Note over UE,PCSCF: 阶段3: 周期刷新(由refresher=uas方发起)
Note right of PCSCF: 间隔1/2处(900s)发起刷新<br/>P-CSCF自荐为UAS刷新方
PCSCF->>UE: UPDATE(Session-Expires: 1800;refresher=uas)
UE-->>PCSCF: 200 OK(Session-Expires: 1800;refresher=uas)
PCSCF->>PCSCF: 重置会话时钟
Note over UE,PCSCF: 阶段4: 超时/刷新失败 → 强制释放
Note right of PCSCF: 刷新UPDATE无响应<br/>T1重传耗尽 + 等待至间隔到期
PCSCF->>PCSCF: 触发Rx会话终止<br/>AAR(NAS-Request)释放GBR承载
PCSCF-->>UE: BYE(Reason: timer)
Note left of UE: 会话状态机清理
步骤1-2:初始协商与422拒绝。 UE在初始INVITE中提议 Session-Expires: 60 并自荐为uac刷新方。P-CSCF根据TS 24.229本地策略(Min-SE=90)发现60秒低于下限,不修改INVITE直接以422回拒,并在422中回带 Min-SE: 90。RFC 4028规定:422是Session Timer协商失败的唯一正确响应,且必须携带Min-SE,否则UE无法知道该用多大的间隔重试,会陷入"猜测—被拒"的死循环。
步骤3-8:合规重协商。 UE以 Session-Expires: 1800 重发INVITE。注意被叫UE在200 OK中将 refresher 从 uac 反转为 uas——RFC 4028允许UAS在2xx中修改refresher角色,2xx中的Session-Expires头域为最终生效值。这意味着最终由被叫侧(在VoNR中通常就是P-CSCF代为发起)承担刷新责任。
步骤9-11:周期刷新。 refresh方在会话间隔的约一半时刻发起UPDATE(本例900秒)。RFC 4028规定刷新方在间隔1/2处首次尝试,若失败则按T1定时器(500ms)重传,直到间隔到期仍未成功才判定会话失效。UPDATE相比re-INVITE的优势是不触发媒体重协商、不改变Dialog ID,开销极小。
步骤12-14:超时强制释放。 当刷新UPDATE持续无响应直至间隔到期,P-CSCF判定会话已僵死,先通过Rx/N5接口向PCF发送AAR释放该会话的专用QoS流,再向UE发BYE。这一步是VoNR区别于企业SIP的核心:会话定时器不仅清理信令状态,更联动释放无线与传输面资源。
"谁来刷新"是会话定时器最易出错的部分。下图描绘UAC与UAS在INVITE/2xx往返中如何最终确定刷新方,以及异常分支。
stateDiagram-v2
[*] --> 发起INVITE: UAC插入<br/>Session-Expires;refresher=uac
发起INVITE --> 收到2xx: 协商成功
发起INVITE --> 收到422: 间隔过小
发起INVITE --> [*]: 其他失败响应
收到422 --> 发起INVITE: 按Min-SE调整后重试
note right of 收到422
RFC4028: UAC不得用旧值重试
必须采用422中的Min-SE
end note
收到2xx --> 判定refresher
note right of 判定refresher
优先级规则:
1) 2xx带refresher → 以2xx为准
2) 仅INVITE带refresher → UAC刷新
3) 都没带 → 双方都不刷新(向后兼容)
end note
判定refresher --> UAC刷新: refresher=uac
判定refresher --> UAS刷新: refresher=uas
UAC刷新 --> 周期UPDATE_UAC: 间隔1/2处
UAS刷新 --> 周期UPDATE_UAS: 间隔1/2处
周期UPDATE_UAC --> 会话存活: 收到2xx
周期UPDATE_UAS --> 会话存活: 收到2xx
周期UPDATE_UAC --> 释放会话: 超时无响应
周期UPDATE_UAS --> 释放会话: 超时无响应
释放会话 --> [*]: 发送BYE + 释放QoS
会话存活 --> [*]: 正常挂断BYE
设计意图解读: RFC 4028之所以把"刷新方"也放进协商而非固定由UAC负责,是为了让网络能力更强、电源不受限的一方(如P-CSCF)主动承担刷新,避免移动终端因频繁发送re-INVITE而耗电。这也是为什么运营商网络中P-CSCF几乎总是通过 Require: timer 并在2xx中把自己设为 refresher=uas 的原因。
在5G VoNR架构中,P-CSCF(通过SMF+UPF接入,经N3IWF或直接5G接入)扮演会话定时器的执行中心角色,其行为严格遵循TS 24.229 §5.1.2.2.2:
Require: timer,即使UE只声明 Supported: timer。这是运营商策略,确保无一台"懒惰终端"能逃过保活。refresher=uas,由网络侧周期下发UPDATE,减轻UE负担。值得注意的是,在5G非可信非3GPP接入(经N3IWF)场景下,re-INVITE/UPDATE需穿越IPSec隧道,刷新报文的延迟和丢包概率高于5G NR直连,因此运营商倾向于为非3GPP接入配置更短的Session-Expires(如600秒),以更快感知UE掉线。
在Wireshark中过滤SIP,识别会话定时器的关键标志:
- INVITE中含 Session-Expires 或 Supported/Require: timer → 会话定时器已启用;
- 出现422响应 → 协商失败,检查422中的Min-SE;
- 周期性出现的UPDATE,且无SDP或SDP未变 → 刷新报文;
- 会话超时后的BYE,Reason头含 cause=200;text="timer" → 定时器触发的释放。
可用显示过滤表达式:sip.Session_Expires or sip.Min_SE or sip.Status-Code == 422。
| 故障现象 | 根因 | 排错思路 |
|---|---|---|
| 呼叫建立后~90秒自动断开 | 双方Min-SE/Session-Expires协商失败,一方按默认90秒超时 | 抓包核对422往返,确认UE是否真正采用了P-CSCF的Min-SE重试 |
| 长时间通话突然掉线 | 刷新UPDATE因切换/无线抖动丢失,重传耗尽 | 检查刷新报文是否穿越了NAT/SBC,UDP刷新是否被老化的NAT映射丢弃 |
| 双方都不刷新 / 双方都刷新 | refresher参数在2xx中未被正确解析 | 核对2xx中Session-Expires的refresher值,确认是否被某中间B2BUA篡改 |
| 跨域呼叫建立失败循环422 | 主被叫域Min-SE策略差异大 | 协调跨域Min-SE为统一值,或由IBCF归一化 |
| VoNR专用承载未释放 | P-CSCF超时发BYE但未触发AAR释放 | 检查P-CSCF↔PCF的Rx链路与会话绑定 |
Q1:会话定时器和RTP/RTCP保活、媒体面DFD(Dead UE Detection)是什么关系? A:二者互补。会话定时器工作在信令面(SIP re-INVITE/UPDATE),保证SIP状态机和P-CSCF对会话活性的认知;RTP/RTCP保活工作在媒体面,靠RTCP RR/SR或RTP静默包检测媒体链路是否通畅。VoNR中两者都启用:信令面超时发BYE,媒体面长时间无RTP同样可触发P-CSCF的"媒体超时"释放。会话定时器是"信令级"的兜底。
Q2:为什么被叫UE在200 OK里把refresher从uac改成了uas,这是规范允许的吗? A:允许。RFC 4028明确:UAS可在2xx响应中重新指定refresher角色,2xx中的Session-Expires(含refresher参数)为最终生效值。这一设计让网络侧(P-CSCF)能在不修改UE发起INVITE的前提下,主动接管刷新责任以节省终端电量。UAC必须接受2xx中的refresher指定。
Q3:UPDATE和re-INVITE都能刷新会话,VoNR网络偏好哪个? A:VoNR网络几乎统一偏好UPDATE。原因是UPDATE不触发Offer/Answer媒体重协商、不改变Dialog、不要求对方重新协商编解码和QoS,信令开销约为re-INVITE的一半。re-INVITE仅在需要同时刷新会话并改媒体参数(如切换编码)时才使用。
Q4:如果UE不支持会话定时器(没带Supported: timer),P-CSCF怎么办?
A:根据TS 24.229,P-CSCF仍会插入 Session-Expires 并自荐为uas刷新方。由于UE未声明支持,刷新UPDATE可能被UE忽略或回488。此时P-CSCF依赖媒体面超时(长时间无RTP)和会话级绝对定时器来兜底释放。运营商通常要求入网UE强制支持timer选项标签,不支持者不予IMS语音授权。
Q5:422 Session Interval Too Small 在5G漫游场景下为何容易反复出现? A:漫游时主叫归属网络(HPLMN)P-CSCF与被叫拜访/远端网络P-CSCF的Min-SE策略可能不一致,若中间无IBCF做Min-SE归一化,UE提议的间隔会"两头不讨好"。标准做法是在IBCF或互通SBC上配置统一的Min-SE下限,并对穿越的INVITE做Min-SE改写,避免422在跨域链路上反复弹跳。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
