<!-- title: 电话总在30秒挂断 -->

**概述**：接通后第30秒，通话准时被掐断——这不是玄学，是定时器在报警。本文以一次VoLTE互联方向的疑难掉话、一次凌晨批量基站闪断为线索，拆解SIP事务定时器、SCTP心跳与防火墙会话表之间的“契约关系”，并给出一套运维可直接落地的“计时器台账”方法与验收清单。全文以IETF标准RFC 9260（SCTP）与RFC 3261（SIP）为解读主轴，所有关键数值均注明出处。

## 目录

- 一张工单：30秒，精准断线
- 30秒从哪来：一个ACK的死亡倒计时
- 第二现场：凌晨三点，基站集体掉线
- 计时器台账：把全网时钟对一遍
- 排障打法：从现象到根因的五步
- 经验教训与验收清单

## 一张工单：30秒，精准断线

先讲一个典型场景（按公开排障帖与社区案例综合还原，细节已脱敏）。某省运营商的网络部门收到一批VoLTE投诉，投诉内容高度雷同：与它网互通的呼叫，接通后30秒左右准时掉线，主叫听到“嘟”的忙音，被叫手机界面甚至还没反应过来。本网内用户互打完全正常，问题只集中在某几条互联路由上。

工单在客服、网优、核心网三个部门之间转了三天，没有结论。最后是靠一个不起眼的数据视角破了案：**把掉话按“通话时长”分桶统计**。正常网络里，掉话时长应该是随机分布的——10秒的、47秒的、3分钟的都有，因为无线侧的覆盖空洞、切换失败、干扰不挑时间。但这份统计里，有一条刺眼的尖峰，死死卡在30～32秒的位置。

这是非常典型的“定时器指纹”。掉话钉在一个固定刻度上，几乎可以排除无线原因，问题十有八九出在传输层或信令层的某个超时机制上。范围一下子从“几万个基站”缩小到“几台互联设备”。

## 30秒从哪来：一个ACK的死亡倒计时

30秒这个数字，在SIP协议里有一个精确的出身。

SIP（RFC 3261）定义了一个基础时钟T1，默认500毫秒，是往返时延的估计值。当一个SIP事务（比如一次INVITE）发出请求后等不到应答，就按指数退避重发：0.5秒、1秒、2秒、4秒、8秒、16秒——把它们加起来，正好32秒。这个“重发到放弃”的总时长，就是RFC 3261里的Timer H（64×T1=32秒）。

把镜头对准呼叫建立的最后一步：被叫侧发出200 OK表示“接通了”，主叫侧必须回一个ACK确认，事务才算完结。如果这个ACK永远到不了，被叫侧不会立刻拆线，而是按上述节奏反复重发200 OK——0.5、1、2、4、8、16秒——直到32秒超时，然后放弃、拆线。用户侧的体感就是：**接通后30秒出头，电话莫名断了**。这个现象在国外VoIP圈有个老名字，就叫“30-second hangup”。Palo Alto Networks的官方知识库里专门有一条处置记录，原话大意是：如果200 OK对应的ACK没有收到，呼叫会在大约30秒后断开。社区里Asterisk、FreePBX论坛的相关帖子可以堆成山，成因全部指向同一条：ACK在半路被NAT或防火墙吞了。

回到工单。抓包对账显示：主叫侧确实发出了ACK，但对端核心网从没收到。嫌犯有三个：NAT映射老化、防火墙会话表丢弃、SIP ALG改写惹祸。本案是第三个——互联防火墙上开着SIP ALG（应用层网关），它自作聪明地把200 OK里Contact头中的地址改写成了防火墙自己的外网地址。主叫侧按改写后的地址回ACK，这个新五元组在防火墙上没有对应的会话表项，被静默丢弃。对端等来的不是ACK，而是无穷的等待。

修复动作反而简单：关掉ALG，改用静态地址映射，让SBC自己处理NAT穿越。掉话尖峰当周消失。

```mermaid
sequenceDiagram
    participant U as 主叫侧
    participant F as 互联防火墙
    participant R as 对端核心网
    U->>F: INVITE发起呼叫
    F->>R: 放行并登记会话
    R-->>F: 200 OK接通
    F-->>U: 转发但改写了地址
    U->>F: ACK发往改写地址
    F->>F: 五元组无会话表项 丢弃
    Note over R: 等不到ACK 按0.5秒起指数重发200 OK
    R->>R: 32秒后Timer H超时 拆线
```

## 第二现场：凌晨三点，基站集体掉线

第二个场景换了舞台。某地市5G SA商用后不久，网管在连续几个凌晨爆出批量告警：gNodeB的NGAP链路闪断、S1链路重建，天亮后又自行恢复。诡异的是，白天业务高峰反而一切正常，出事的全是流量偏小的郊区站。

老运维看到“越闲越死”四个字，心里已经有数了——这又是一场定时器对不上的事故，只是主角换成了SCTP。

4G/5G核心网与基站之间的控制面信令（S1-MME、NGAP）跑在SCTP上。本文解读的主轴、IETF在2022年发布的RFC 9260（SCTP协议的最新版本，取代经典的RFC 4960）在第16节给出了建议参数：心跳（HEARTBEAT）间隔**30秒**，路径最大重传次数**5次**——也就是说，一条空闲的SCTP路径，靠每30秒一次的心跳包证明自己活着；连续5次心跳没有应答（约2.5分钟），才判定路径失效。第8.3节同时明确：心跳只发给“空闲”路径，有业务流量的路径不发。这套设计本身很优雅，但它有一个隐含假设：**路径上所有设备对这条流的耐心，都必须比30秒长**。

出事当晚之前，那地市刚做过一次安全加固割接，把一批防火墙的空闲会话老化时间从10分钟压到了25秒——参数抄自互联网出口的加固模板。25秒小于30秒，心跳追不上会话表的老化速度：链路一空闲，防火墙表项先没了，下一个心跳包进来时无家可归，被丢弃；核心网侧连续5次心跳无应答，判定路径失效、链路拆除。而市区大站业务包源源不断，会话表项一直被刷新，反而毫发无伤。这就是“凌晨爆告警、白天自动好、越偏远越容易断”的完整解释。Netgate论坛上有一个几乎同构的案例：防火墙对SCTP会话设了900秒超时，期间到达的报文被直接丢弃，用户百思不得其解。

修复与预防各半：防火墙老化时间恢复到心跳间隔的3倍以上（30秒心跳，至少90秒老化）；同时给防火墙启用SCTP感知能力。Fortinet的技术文档描述过其session-helper如何检查SCTP关联并重写地址，Palo Alto的服务商文档也明确写了“会话超时控制防火墙何时结束一条SCTP关联”——主流防火墙都能认SCTP，前提是有人记得去开。对彻底不支持SCTP（IP协议号132被当未知协议拒绝）的老设备，还有一条标准后路：RFC 6951，把SCTP整个装进UDP壳里，让防火墙按熟悉的UDP来维护会话。

## 计时器台账：把全网时钟对一遍

两起事故，机理一模一样：**一端在用保活机制证明自己活着，另一端的会话表先失去了耐心**。这不是哪个厂商的 bug，而是分布式系统的固有难题——全网没有一个统一的时钟委员会，每个协议、每台设备各自揣着一套出厂默认值，而这些默认值之间没有任何人负责对齐。

所以在成熟的运维团队里，应该有一份东西叫“计时器台账”。它长这样：

| 协议/链路 | 保活机制 | 常见默认值 | 出处 | 典型误伤场景 |
|---|---|---|---|---|
| S1/NGAP信令（SCTP） | HEARTBEAT心跳 | 30秒，5次判死 | RFC 9260 §16 | 防火墙老化时间短于心跳，空闲链路闪断 |
| Diameter（S6a鉴权等） | Device-Watchdog | 30秒级 | RFC 6733 | 代理防火墙超时更短，鉴权间歇失败 |
| GTP-C（S11/S8口） | Echo Request回声 | 约60秒，5次判路径故障 | 3GPP TS 29.274 | 中间盒超时短于60秒，路径被误判故障 |
| SIP信令 | Timer H等ACK | 64×T1=32秒 | RFC 3261 | ACK被NAT/防火墙吞掉，30秒掉话 |
| IPsec隧道（NDS/IP） | NAT-T Keepalive | 默认20秒 | RFC 3948 | 安全网关老化时间偏短，隧道反复重建 |
| NAT/防火墙本体 | UDP会话空闲老化 | 各设备不同，常为30秒级 | 各设备文档 | 以上所有机制的“暗雷” |

值得注意的是，标准建议值、操作系统内核默认值、中间盒默认值三者常常各说各话。比如Red Hat的官方文档记载，Linux内核的SCTP心跳参数net.sctp.hb_interval默认是5000毫秒，与RFC建议的30秒完全不同——这正是“台账必须记录实际生效值、而不是文档值”的原因。另外，RFC 4787对NAT提出过底线要求：UDP映射的保持时长不应短于2分钟（仅对纯出向映射允许放宽），但现实设备远比标准激进，30秒级的UDP老化在现网随处可见。

台账的验收红线只有一句话：**任何保活间隔，必须小于路径上最短空闲超时的1/2到1/3**。30秒心跳对25秒防火墙老化，是1.2倍，不合格；对90秒老化，是3倍，合格。把全网每一条跨安全域的链路按这个公式过一遍，绝大多数“深夜闪断”“越闲越死”的悬案，在配置阶段就能掐灭。

## 排障打法：从现象到根因的五步

遇到疑似定时器问题，老手的打法是固定套路。第一步看指纹：掉话按时长分桶，钉在固定刻度的是定时器病，随机分布的转无线侧。第二步对刻度：30秒上下找SIP的ACK和防火墙会话表，60秒找GTP-C回声和UDP老化，30分钟或1小时整点找SIP会话刷新定时器和TCP保活——Linux默认的TCP keepalive是两小时，经过NAT的网管连接挂死，多半是它。第三步抓包对账：在故障链路两端同时抓包，回答三个问题——ACK发没发？发到了哪个地址端口？对端收没收到？两份pcap一对比，丢在哪一跳立刻现形。第四步审中间盒：NAT映射寿命、防火墙会话表、ALG开关、负载均衡的空闲超时，逐个核对台账。第五步闭环验证：修复后必须做“空闲挂机测试”——把链路静置一到两个小时，闪断计数归零才算收工，绝不能以“改完看起来正常”结单。

```mermaid
flowchart TD
    A["掉话工单进来"] --> B{"掉话时长是否<br/>集中在固定值"}
    B -->|集中在30秒上下| C["查SIP信令重传"]
    B -->|集中在小时整点| D["查会话刷新定时器<br/>与TCP保活"]
    B -->|随机分布| E["转无线侧排查<br/>覆盖切换与干扰"]
    C --> F["链路两端同时抓包"]
    F --> G{"ACK是否到达对端"}
    G -->|没有到| H["查NAT映射寿命<br/>与防火墙会话表"]
    H --> I["关ALG或调大老化时间"]
    G -->|到了仍掉| J["查SDP协商<br/>媒体地址与端口"]
    I --> K["空闲挂机测试验证"]
    J --> K
    D --> K
    K --> L["更新计时器台账<br/>沉淀验收项"]
```

## 经验教训与验收清单

两起事故复盘下来，值得刻进团队记忆的教训有四条。

第一，**定时器是全网契约，不是单点配置**。SCTP心跳30秒是RFC的建议，SIP Timer H 32秒是RFC的定义，但契约能否履行，取决于路径上每一台状态设备是否守约——任何一个环节的默认值都可能单方面撕毁合同，而且撕毁时不会有任何告警告诉你原因。

第二，**越空闲，越危险**。保活机制存在的唯一意义就是对付空闲，因此所有定时器类故障都偏爱深夜、凌晨和偏远小站——那恰恰是值班人最困、告警最容易被淹没的时段。把“低话务时段闪断”列为定时器问题的第一怀疑对象，能省掉大量无效排查。

第三，**以实际生效值为准**。标准建议值、内核默认值、中间盒出厂值三方经常不一致，割接前的参数核对必须落到“这台设备上当前跑的是多少”，而不是翻文档。

第四，**把指纹识别写进新人教材**。“掉话时长分桶”这一个问题，就能把一半的疑难工单挡在正确的大门里，成本几乎为零。

落到工程上，建议把这几项纳入日常验收清单：新开互联路由或安全域时，双方交换保活参数与中间盒老化时间的对账表；所有跨防火墙链路完成至少1小时空闲挂机测试；掉话统计平台常设“固定时长掉话占比”指标，一旦某固定刻度占比异常抬头，自动生成专项工单；防火墙侧关闭不必要的ALG，确需NAT穿越的由SBC或隧道封装（如RFC 6951）承担。

30秒，说长不长，说短不短。对用户，它是一次没说完的话；对工程师，它是一串定时器的合唱——每个音都来自某个RFC的某一节，只要台账在手，这支合唱随时可以逐个点名。

## 参考来源

1. [RFC 9260: Stream Control Transmission Protocol](https://www.rfc-editor.org/rfc/rfc9260.txt) — IETF官方标准，本文主轴。§16给出HB.interval=30秒、Path.Max.Retrans=5等建议参数，§8.3定义空闲路径心跳机制（已全文核对）
2. [RFC 3261: SIP: Session Initiation Protocol](https://www.rfc-editor.org/rfc/rfc3261.txt) — SIP基础协议，T1=500ms与Timer H=64×T1=32秒的定义出处
3. [VoIP call drops after 30 seconds — UDP Consulting](https://udpconsulting.com/knowledge-base/voip-call-drops-after-30-seconds/) — 系统解释30秒（32-35秒）掉话由NAT/防火墙拦截SIP报文导致及修复方法
4. [VOIP Traffic Disconnects Every 30 Seconds — Palo Alto Networks KB](https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA10g000000ClKoCAK) — 厂商知识库对“收不到200 OK的ACK约30秒断开”的官方处置记录
5. [SCTP Association — Palo Alto Networks Documentation](https://docs.paloaltonetworks.com/service-providers/11-1/mobile-network-infrastructure-getting-started/sctp/sctp-introduction/sctp-association) — 防火墙会话超时控制SCTP关联拆除的官方说明；另参考[Red Hat: How is SCTP heartbeat timeout calculated](https://access.redhat.com/solutions/7072740)（内核hb_interval默认5000ms）

---
> 本文由「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 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
