
简介七号信令协议是电信网络核心控制技术这套资料包面向通信工程师、网络开发者和相关专业学生系统整理了协议栈原理与实战讲解。压缩包内含六百零七个文件以四百六十五张图片和一百四十一个网页文档为主另有少量文本说明整体约三点四三兆字节。图片多用于呈现信令流程、网络拓扑等关键图解网页文档则深入讲解消息传递部分、信令连接控制部分、事务处理应用部分等分层机制及信令网组织方式便于按需翻阅。目前已有三百七十三人学习浏览内容覆盖七号信令与IP网络融合、安全漏洞防护等热点议题可帮助读者理解呼叫建立、路由与计费背后的信令逻辑是从入门到进阶的实用参考。1. 七号信令SS7为什么到今天还是排查话务异常的必修课一台交换机半夜报“中继群不可用”网管远程重启了两轮用户还是说打不通最后把信令抓包拉出来一看MTP3层连续重发SCCP消息根本没到对端。这种场景在电信机房里不算少见而问题最终都落在同一个名字上SS7 七号信令。它是控制交换机之间如何建立呼叫、传送短消息、查询用户位置的协议族三十多年过去VoLTE、VoNR 里的很多网元交互依然在借用它的寻址和事务思路。对做网络运维、信令测试、设备研发的工程师来说可以不写协议栈代码但必须能看懂抓包里每一层在说什么。这篇就按我在机房里排查话务问题时的习惯把这个“黑匣子”逐层拆开。2. 拆开 SS7 协议栈MTP、SCCP、TCAP 的分工不是靠猜的七号信令最大的入门门槛不是哪条消息太长而是它不像 TCP/IP 那样把功能都叠在四个抽象层里而是分成一整套彼此独立的子协议。刚开始上手时最容易犯的错是拿着 ISUP 消息去 SCCP 里找字段或者把 TCAP 的组件当成 MAP 的正文。先把每一层负责什么、在哪一层结束、往哪一层交在脑子里立住后面所有抓包和分析才有落点。2.1 SS7 分层到底分了几层别只记名字从下往上SS7 协议族常被描述成四层结构但实际抓包里看得最清楚的是一条从 MTP 到用户部分的链路MTP1 管物理传输MTP2 管相邻节点间的可靠传送MTP3 管消息路由再往上由 SCCP 提供端到端寻址和业务分拣最后才是 ISUP、TCAP 这类真正的用户层。如果拿 OSI 去套MTP1 对应物理层MTP2 对应链路层MTP3 大致是网络层SCCP 可以理解为网络层之上的“寻址增强层”TCAP 则更像会话层加应用层的混合体。很多资料会直接说“SS7 分 MTP、SCCP、TCAP、ISUP/MAP 四块”这个说法够用但不能把 MTP 当成一整块——排查故障时你最先看到的往往是 MTP3 的重传而不是 TCAP 里业务失败的回码。SS7 层次协议类比对象主要职责传输与信令数据链路MTP1物理层电气特性、速率、时隙信令链路层MTP2数据链路层定界、差错检测、重传信令网络层MTP3网络层路由、拥塞控制、链路管理网络服务层SCCP传输层增强端到端寻址、按 GT 翻译用户部分ISUP / TCAP / MAP应用层呼叫控制、事务交互、业务逻辑这个表格是整套排查思路的地图。抓到一个真实报文时先问自己一句我现在是在看 MTP2 的重传还是在看 MTP3 的链路状态还是在看 ISUP 的呼叫建立失败原因——这三者对应的是完全不同的工程问题。2.2 MTP 拆成三级是必然选择不是历史包袱MTP1 解决的是信令在物理链路上怎么传。传统七号信令用 64kbps 的时隙今天在 E1 中继里还是这个速率到了 IP 承载时代则换成 SCTP over IPMTP1 的角色被 IP 层接管但 MTP2 和 MTP3 的功能依然保留。MTP2 负责把比特流切成信令单元加上校验和序号在链路质量不好的时候重传。它干的事和 TCP 有相似之处但比 TCP 更简单直接。MTP3 则拿着路由标签在信令点之间找路。路由标签里有三个关键字段DPC 目的信令点编码、OPC 源信令点编码、SLS 信令链路选择码。SLS 的作用经常被忽略它本质上是一个哈希因子用来在多个链路之间分摊流量保证同一对通话的消息走同一条链路不乱序。MTP2/MTP3 之间还有一个容易让新手混淆的地方MTP2 只管“这一跳”而 MTP3 管“整条路”。一台 STP信令转接点收到消息后MTP2 确认并上交给 MTP3MTP3 查路由表后再从另一条 MTP2 链路发出去。也就是说同一条端到端信令可能在不同链路上以不同的 MTP2 帧格式出现但 MTP3 路由标签里的 DPC 和 OPC 全程不变。排查时如果只盯着 MTP2 有没有重传而忽略了 MTP3 的路由选择很容易把链路本地的瞬间误码误判成消息丢失。2.3 SPC、GT 和路由看消息怎么找人MTP3 用的地址是信令点编码 SPC本地区域内用 14 位二进制编码分为网络指示符、区域编码、信令点编码三段。对于同一个交换机网络中不同角色的 SPC 不能重复否则路由表会无所适从。但 SPC 是给机器看的不是给业务看的。真实业务里一个 SCCP 消息要找到对端用户通常靠 GT全局码来寻址。GT 长得像一串数字可能是被叫号码、IMSI 或专用的业务码。SCCP 在发送端做 GT 翻译把 GT 翻译成某个中介信令点的 DPC逐跳转译最后到达目的信令点。这就是为什么抓包时经常看到 DPC 一直不变但 SCCP 层里的被叫地址却在跳变——每一跳的 STP 都在做同样的事。参数配置上最容易出问题的就是 SPC 的长度和网络指示符不匹配。国内很多省份的七号信令网用的是 24 位编码而实验室模拟器默认按 14 位处理抓包里看起来就是 DPC 和 OPC 各种错位。我一般会让新手先学会一件事拿到任何抓包文件第一眼先看 Wireshark 解析出来的 DPC/OPC 是否落在一个合理的编码区间内。如果 DPC 变成几千上万的大数值先怀疑编码位长配置别急着怀疑路由表。3. 把 SS7 拉到自己眼前抓包解析和实验室环境搭建协议栈背得再熟不如亲手抓到一条 IAM 消息来得踏实。SS7 不像普通 HTTP 那样开个浏览器就能抓包它的环境和工具链都有一定门槛。但门槛没有想象中高一台带信令卡的语音网关、一个能抓 SCTP 报文的服务器或者干脆一份别人留下的 pcap 抓包样本都能让你把完整的解析链路跑通。3.1 准备一套能复现的 SS7 环境文件、样本和设备这类以“SS7.rar_protocols”命名的资料包打开后最常见的内容其实是三类东西协议规范文档ITU-T Q.700 系列和国内行标、一组真实抓包样本pcap 格式居多、以及某个厂家交换机的配置文件模板。拿到手的第一步不是去翻规范原文而是先把 pcap 样本导入 Wireshark 解一遍。一份干净样本的价值在于你能看到标准的 MTP2 帧头、MTP3 路由标签、ISUP 消息体和 TCAP 事务结构这些字段的十六进制排列比任何协议描述都直观。实验室环境里想要自己产生可观测的 SS7 流量常见做法是搭一台支持 E1 信令链路或者 IP 信令承载的软交换。Asterisk 加信令卡是成本最低的方案卡驱动起来之后MTP2 链路状态、MTP3 邻居是否激活都能在后台看到。如果没有硬件条件另一个可行路径是用抓包文件当“静态信号源”把 pcap 里的 SCTP 流拆出来在 Wireshark 里强制按 MTP3 解析。这样虽然不能交互但足够让你把协议的每一层都看清。3.2 Wireshark 打开 SS7 的最小配置一条命令先跑通解析Wireshark 对 SS7 的解析默认是开启的但前提是它必须能识别承载协议。传统 E1 抓包需要专门的采集设备平时接触最多的其实是 IP 承载的 M3UA/SCTP 流量。抓到 IP 包后Wireshark 能自动识别 SCTP却经常不确定 SCTP 里面的载荷是不是 MTP3此时需要手动指定数据链路类型# 查看本机有哪些抓包接口和链路类型 tshark -D # 从 pcap 文件读取并把 2905 端口的 SCTP 载荷强制解析为 MTP3 tshark -r ss7_trace.pcap -d tcp.port2905,mtp3 -Y mtp3 # 只看 ISUP 层的关键字段 tshark -r ss7_trace.pcap -d tcp.port2905,mtp3 \ -Y isup \ -T fields -e mtp3.dpc -e mtp3.opc -e isup.calling_party_number -e isup.called_party_number这里的关键参数是-d它的作用是覆盖 Wireshark 的自动协议判断。2905 是 M3UA 默认的 SCTP 端口如果你的实验环境用的是别的端口把端口号替换成实际值即可。-Y后面是显示过滤器MTP3 解析成功后过滤isup能看到所有 ISUP 消息过滤mtp3则能看到所有经过 MTP3 的信令单元。第一次跑通的时候你会看到 DPC、OPC 和消息类型整整齐齐列出来那种“黑匣子打开了”的感觉就是这个方向最值钱的复现体验。3.3 用过滤器和参数表快速定位一条呼叫的信令链路很多运维同事喜欢在 Wireshark 图形界面里点来点去但脚本化处理才是排查大量话单时最省力的方式。要定位某一对主被叫的所有信令消息用wireshark的显示过滤器直接写条件即可# 按被叫号码过滤 ISUP 消息号码用 0x 编码时需要留意大小端 tshark -r ss7_trace.pcap -Y isup.called_party_number \8613812345678\ -T fields -e frame.number -e mtp3.opc -e mtp3.dpc -e isup.message_type # 按 CIC电路识别码过滤一条中继上的所有呼叫 tshark -r ss7_trace.pcap -Y isup.cic 45 -T fields -e frame.time_delta -e isup.message_typeCIC 是 ISUP 消息里识别电路的关键字段一组中继电路上同一时刻可能有多个呼叫CIC 就是区分它们的 ID。过滤时看到的isup.message_type是数值对应关系常用查表1 是 IAM初始地址消息、6 是 ACM地址全消息、9 是 ANM应答消息、16 是 REL释放消息。这几个值记熟了抓包里一条呼叫的完整生命线一眼就能拉出来。4. 跑通两个经典流程ISUP 呼叫建立与 MAP 位置更新协议字段看得再多最终要落回到业务场景里才有意义。做语音互通的人天天和 ISUP 打交道做核心网用户数据的人则绕不开 MAP。两个流程一个偏电路控制一个偏事务交互正好把 SS7 的两条主要技术路线都覆盖到。4.1 ISUP 的呼叫故事IAM 到 RLC 的消息流一次最简单的局间呼叫从主叫交换机到被叫交换机消息顺序基本固定。先出发的是 IAM里面包含主叫号码、被叫号码和业务属性被叫交换机收到后回 ACM 表示“寻址完成”之后用户应答回 ANM通话建立。挂断时任意一方发 REL带一个原因值对端回 RLC 确认释放。这个“IAM→ACM→ANM→REL→RLC”的序列是所有 ISUP 排查的基线。如果中间缺了 ACM 直接出 ANM或者 REL 之后没有 RLC基本可以判断有一端处理流程异常。消息方向关键字段现实含义IAM主叫局 → 被叫局CIC、被叫号码、主叫号码请求占用电路并建立呼叫ACM被叫局 → 主叫局CIC被叫已振铃或寻呼完成ANM被叫局 → 主叫局CIC被叫应答开始计费REL任意一方CIC、释放原因值请求释放电路RLC另一方CIC确认释放完成日常排查中我看到最多的异常是 REL 里带一个奇怪的释放原因值比如 31normal unspecified本身没问题但配上了 16 之类的异常码。这时候不能只看消息类型要对照原因值表和业务预期一起判断。原因值字段在 Wireshark 里已经做了翻译直接看文本部分即可。4.2 MAP 位置更新SCCP 里藏着的 TCAPMAP 和 ISUP 完全不同。ISUP 直来直去一条消息对应一个行为MAP 则通过 TCAP 做“请求—响应”式的事务交互。一次位置更新先由拜访地 VLR 发起一条 TCAP Begin 消息里面装一个 MAP 的 invoke调用组件里面指名要执行的操作码归属地 HLR 收到后处理再通过 TCAP End 消息返回一个 returnResult返回结果组件。这个过程中SCCP 负责把 TCAP 的消息从 VLR 送到 HLR路由依据不是电路而是 GT 号码。在 Wireshark 里识别这类事务不是去翻 MAP 层具体字段而是先按 TCAP 的 Transaction ID 归类。建议按操作码过滤# 查看 TCAP 操作码为位置更新国内通常为 2的所有消息 tshark -r ss7_trace.pcap -Y tcap map.opcode 2 \ -T fields -e tcap.transaction_id -e mtp3.opc -e mtp3.dpc -e map.opcodeTCAP 事务里最容易看错的点是 Begin 和 End 不一定在同一个 SCCP 连接上因为 SCCP 有无连接和有连接两种模式MAP 多用无连接模式。无连接意味着每条 TCAP 消息独立路由、独立发送中间经过 STP 时路径可能不同所以抓包时常看到 Begin 走了一条链路End 走了另一条链路。这不是故障只要 Transaction ID 对得上就行。4.3 三步核查一个完整流程是否正常拿到一个呼叫或一次位置更新失败的工单我一般按三个步骤推进。第一步用被叫号码或用户标识把所有相关消息过滤出来确认从 IAM 到 RLC 或从 Begin 到 End 的序列是否完整。第二步逐条确认消息类型和关键字段重点看被叫号码是否在翻译后被改错、CIC 是否被另一呼叫占用、TCAP 的调用 id 是否匹配。第三步看时间戳。每一步之间如果出现超过几秒的间隔先怀疑对端系统处理慢再怀疑链路拥塞。这套顺序不依赖任何高级工具纯靠 tshark 加上三组过滤条件就能执行也是我处理信令问题最常用的手段。5. SS7 排查避坑指南5 个让人头疼的典型问题每次培训新人我都说 SS7 的坑不是协议多复杂而是“看起来正常的东西其实不对”。以下五条是这几年做信令梳理时反复遇到的真问题按现象、原因、解决三个层次写基本覆盖了从链路层到事务层最常见的翻车点。5.1 现象抓包里满天都是 MTP3 的 NRM链路没有任何呼叫但抓包里大量出现消息类型为 NRM 的信令单元。NRM 是“网络管理消息”正常情况下只在链路切换或拥塞时出现。如果它变成了报文主体原因多半是某条信令链路的状态在激活和恢复之间反复抖动。解决方法是先查 MTP2 层的重传统计确认链路误码率如果 MTP2 没问题再看 MTP3 的链路集配置常见原因是链路的 SLC信令链路码在两端不一致导致 MTP3 认为链路不可用。5.2 现象GT 翻译不过去被叫号码像“消失”了一样SCCP 消息送到了某个 STP 或端局但对端回 SCCP 层的“无翻译”错误或者干脆没有任何响应。最常见的原因是 GT 的位数和预期不匹配。国内移动用户号码用 E.164 格式但有些网络的 GT 配置里带了额外的 0 前缀翻译表匹配不上。解决方法是跟着 SCCP 的被叫地址字段走一遍看 GT 的编码方式是 BCD 还是 ASCII位数是否补齐到偶数翻译表里有没有对应号段。这类问题纯属参数配置代码层面没有玄学仔细核对就能定位。5.3 现象TCAP 等不到对端回包事务超时MAP 请求发出去之后TCAP 超时定时器到点事务被拆除业务失败。这种问题的排查顺序是先确认 SCCP 层是否把消息送到了正确信令点再看对端 HLR 或 VLR 的处理日志。很多时候并非网络问题而是对端业务系统处理时间超过了 TCAP 的等待时长。解决方法是拉长 TCAP 定时器或者在应用层做异步重试。值得注意的是盲目调长定时器会增加事务占用的资源生产环境要评估并发量后再改。5.4 现象Wireshark 不认 MTP3 层ISUP 显示为 Data抓到 IP 包后发现 SCTP 载荷没有被解析成 MTP3整个 ISUP 层显示成十六进制 Data。原因几乎都是 Wireshark 没有把对应的 SCTP 端口识别为 M3UA/SUA。解决办法就是前面提到的-d参数按端口强制指定协议。还有一种少见情况是 M3UA 的消息里没有包含 MTP3 层只有 SCCP 直接承载这种封装叫做 SUA需要用-d sctp.port14001,sua来解析。看清协议类型再下结论比反复调整显示过滤器更高效。5.5 现象链路质量正常但呼叫频繁掉线MTP2 没有重传链路状态也稳定但 ISUP 的 REL 消息里全是原因值 3无路由到被叫或 34无电路可用。很多人在这一条上踩坑后转向检查传输设备查了半天最后发现是交换机的电路配置里 CIC 和远端不一致。CIC 在中继两端必须一一对应一端配置了 1-31另一端从 32 开始配就会导致呼叫建到一半被 REL。解决方法是把两端的 CIC 配置拉出来逐条比对重点关注方向性错误。6. 最后手里留一招用一段脚本自动校验完整呼叫序列肉眼逐条看消息适合少量样本碰上要分析几万条信令时效率就撑不住了。我的习惯是把 tshark 当数据源把抓包导成结构化字段再用脚本做完整性校验。下面这段代码的思路是按 CIC 分组全部 ISUP 消息然后检查每个 CIC 上是否出现过完整的 IAM、ACM、ANM、REL、RLC 五元组。import csv import subprocess from collections import defaultdict # 用 tshark 导出关键字段避免加载整个 pcap 到内存 result subprocess.run( [tshark, -r, ss7_trace.pcap, -Y, isup, -T, fields, -e, isup.cic, -e, isup.message_type], capture_outputTrue, textTrue ) calls defaultdict(list) for line in result.stdout.strip().splitlines(): parts line.split(\t) if len(parts) 2: cic, msg_type parts[0], int(parts[1]) calls[cic].append(msg_type) expected {1, 6, 9, 16, 16} # IAM, ACM, ANM, REL, RLC for cic, msg_types in calls.items(): if not expected.issubset(set(msg_types)): print(fCIC {cic}: 消息序列不完整仅包含 {msg_types})这段脚本有两个值得留意的设计。一是用-T fields而不是-T json因为字段列表明确时tsv 输出的解析开销更小处理几万条消息不会卡二是用defaultdict(list)把消息类型按 CIC 聚合后续扩展成统计时延也很方便。消息类型 1、6、9、16 对应前面表格里的五类 ISUP 消息如果你抓的协议是国标变体对照 Wireshark 的解析结果改这几个数值即可。跑完脚本后我会再用一个tshark -r trace.pcap -z io,stat,1看整段抓包的流量分布确认没有异常的消息突发再下结论。把抓包变成可重复执行的校验脚本之后信令排查就不再是每次从零开始的黑匣子了。这也是我处理这类项目最深的体会协议本身不唬人唬人的是对字段没有手感多抓几次、多跑几遍脚本手感自然就有了。希望帮到你。本文还有配套的精品资源点击获取