简介:SS7七号信令协议学习资料包以图片和网页文档形式系统整理了Signalling System No.7的核心内容,覆盖从MTP底层传输到SCCP、TCAP上层应用的完整协议栈,适合电信行业从业者、通信专业学生及协议研究者作为入门与进阶参考。压缩包内共607个文件,包含465个jpg图片、138个htm网页文档、3个html及1个txt说明文件,总大小仅3.43MB;jpg图片直观展示信令消息格式、网络拓扑与流程示例,htm文档则系统讲解MTP消息传递部分、SCCP信令连接控制、TCAP事务处理等各层功能。内容进一步涉及SS7网络架构、信令点与转接点配置、SCCP端到端连接、TCAP智能网应用、SS7与IP网络融合方案以及安全漏洞防护要点,并配有实例分析,举例说明呼叫建立、路由选择与计费场景,有助于读者理解七号信令在现网中的实际运作机制。已有371人学习下载,该资料包以图文结合的方式降低了协议学习门槛,适合需要系统梳理信令知识的通信工程师与研究人员收藏使用。
1. 为什么一套40年前的协议还在调度今天的电话与短信:SS7与七号信令
调试间里堆着三台信令服务器,指示灯全绿,但电话就是接不通。应用层日志没有任何报错,最后用抓包工具盯了十分钟,发现ISUP的IAM消息压根没从MTP3层交出去。这种时候你会意识到,SS7(七号信令)这套协议栈,虽然诞生于模拟电话时代,今天依然在核心网里承担着呼叫建立、计费、漫游、短信投递这些最底层的信令调度。它和常说的7层协议模型不冲突,它本身就是电信网自己的"另一套七层"——只不过每一层的历史包袱都还在。这篇文章不聊教科书定义,而是从"拿到一份SS7协议样本包之后,怎么解析、怎么看参数、怎么踩坑"出发,把链路层、网络层、业务层一条线走通。适合正在做核心网联调、网关对接、信令分析平台的工程师,也适合刚接触七号信令想快速上手抓包排查的人。
2. 拆开SS7协议栈:从MTP到TCAP,每一层在信令流程里做什么
2.1 四层结构里每一层完成什么任务
SS7不是单一协议,是一个协议族,ITU-T Q.700系列把它组织成分层结构。最底下是MTP1,处理物理层,要么是E1/T1的时隙,要么是经过SIGTRAN映射到IP承载。MTP2是链路层,负责帧定位、差错检测、重发和流量控制,类似TCP里确认与重传那套机制,但用的是信令单元的格式。MTP3是网络层,负责信令点之间的路由和流量管理,消息根据DPC(目的信令点编码)转发,相当于IP层加一部分路由协议的功能。
MTP3之上挂了若干用户部分。ISUP负责电路相关信令,比如一次普通电话呼叫的建立和释放,消息类型有IAM、ACM、ANM、REL、RLC,这是做呼叫分析最常接触的一层。SCCP(信令连接控制部分)在MTP3之上提供类似"端口号"的寻址能力,通过子系统号(SSN)找到GT(全局标题)对应的业务,TCAP(事务能力应用部分)承载的MAP、CAP这类移动网业务,以及智能网业务,都跑在SCCP之上。TUP是更老的回路线路控制协议,在不少现网里已经被ISUP取代了,遇到老样本包时偶尔还能看到。
分层之间的关系不是严格的"下层为上层服务"那么简单。ISUP和SCCP都挂在MTP3之上,ISUP关注的是电路,SCCP关注的是事务。TCAP本身不管电路,它只负责把一次远端操作的调用和返回对应起来,像MAP里的位置更新、短信发送、鉴权请求,都是通过TCAP的Invoke和ReturnResult完成的。理解这个分层,抓包时才能一眼看出问题在哪个层:MTP2的FSN不连续是链路问题,ISUP的IAM没响应是呼叫控制问题,TCAP的事务超时是应用层问题。
2.2 信令点编码、子系统号与链路类型:分析前必懂的三个概念
信令点编码(SPC)是SS7网络里每个节点的地址,常见的有ITU-T 14位格式和ANSI 24位格式,写出来像"3-128-1"或"1.2.3"这样。抓包时OPC是源信令点编码,DPC是目的信令点编码,很多分析工具默认按ITU-T格式显示,遇到ANSI的包会显示成很奇怪的大数字,这就是最常见的"看着地址不对,其实解码格式错了"的翻车点。
子系统号(SSN)是SCCP层的地址扩展,类似TCP端口号,比如移动用户就是SSN 6,MAP的各个服务有各自的SSN。还有SLS(信令链路选择码),它决定消息走哪条链路,同一对OPC/DPC之间的同一次会话,SLS必须保持一致,消息才能按序到达。业务指示语(SI)在SIO字节里,ISUP是SI=5,SCCP是SI=3,抓包过滤时用得上。
链路类型也直接影响分析。A链路连接两个信令点,B链路连接从属信令点与转接点,C链路连接两个转接点,D链路是准直联的延伸,E链路是跨网络冗余。实际抓包时不一定要分清所有类型,但要知道A/B/C/D/E中,同一条链路上的消息顺序是可靠的,跨链路汇聚过来的消息顺序不保证,后面分析TCAP事务时这很关键。
2.3 用tshark验证你手上的包来自哪一层
拿到一份未知样本,先别急着看懂内容,先用工具确认链路类型和解码层级。这步非常建议做,能省掉后面大量盲猜的时间。
capinfos sample.pcap | grep -E "Link type|Number of packets" tshark -r sample.pcap -c 5 -V 2>/dev/null | grep -E "Message type|Service indicator|Destination point code|Source point code"capinfos输出的Link type如果是ss7,说明抓包时已经指定了SS7链路类型,Wireshark会自动挂上MTP2解析器。如果显示ETHERNET或者USER0,说明包是裸IP承载或者链路类型没标对,后面要么手动指定decode as,要么重新抓包。第二条tshark命令取前5个包,直接看MTP3层的Destination point code和Service indicator,能快速判断样本是ISUP为主还是MAP为主。这个习惯帮我省掉了很多"打开包发现一片黑"的尴尬时间,建议养成。
3. 用Wireshark和tshark把SS7样本包拆成信令流程:过滤、导出与重放
3.1 解压样本先验明文件身份:rar压缩包与pcap的边界
标题里带了"rar_protocols",实际工作中拿到的协议样本经常是rar或zip压缩好的pcap,解压后第一件事不是双击打开,而是确认文件格式和链路类型。rar解压本身没什么技术含量,重点是解压后别被文件名骗了,一个叫"SS7_trace.pcap"的文件,里面可能是普通的UDP封装,也可能是真正的TDM链路采集。
unar SS7_Protocols.rar # 如果系统里没有unar,换成 unrar x SS7_Protocols.rar file sample.pcap capinfos sample.pcap | grep -E "Link type|Capture length|Number of packets"file命令确认pcap格式是pcap还是pcapng,capinfos是关键,它告诉你这个文件的链路层类型。如果Link type是ss7,可以直接用Wireshark按SS7解析;如果Link type是ETHERNET且包里带着SCTP源端口2905,说明是SIGTRAN承载,需要按SCTP/M3UA路径解析。这一步确定了,后面的过滤条件和协议变体选型才能选对。
3.2 用过滤语法拆出ISUP与TCAP:先看消息类型再看参数
Wireshark的显示过滤器对SS7支持得不错,关键是记住几个固定的过滤字段。只看MTP3层就用mtp3,只看ISUP就用isup,想看TCAP里的MAP操作就用tcap,这些字段在Wireshark的Protocol列表里都能看到,但命令行跑批处理时用tshark更顺手。
# 列出所有ISUP消息类型及各类型数量 tshark -r sample.pcap -Y "isup" -T fields -e isup.message_type | sort | uniq -c | sort -rn # 按消息类型导出关键字段:源点编码、目的点编码、SLS、CIC tshark -r sample.pcap -Y "isup" -T fields -e mtp3.opc -e mtp3.dpc -e mtp3.sls -e isup.cic -E header=y -E separator=,isup.message_type在Wireshark里显示为IAM、ACM、ANM这类可读字符串,导出后做统计非常直观。mtp3.opc和mtp3.dpc是MTP3层的源点和目的点编码,isup.cic是电路识别码,这是把一次呼叫串起来的核心字段。注意不同版本Wireshark的字段名可能略有差异,跑之前可以用tshark -G fields先确认字段名,这个技巧能避免拿到一堆空值。
3.3 用tcpreplay在本地回放:控制速率比控制内容更重要
抓包文件要在测试环境回放,常见做法是用tcpreplay。直接默认参数回放有两个坑:一是样本包可能是几小时甚至几天的采集,tcpreplay会在一瞬间全部发完;二是SS7样本的链路类型不是以太网时,tcpreplay会报错。
# 限速回放,不要全速突袭 tcpreplay --pps=50 -i lo sample.pcap # 如果样本链路类型不是以太网,先指定数据链路类型再回放 tcpreplay --pps=50 --dlt=ss7 -i lo sample.pcap--pps=50意思是每秒最多发50个包,适合让上层状态机有足够时间处理事务。--dlt=ss7是告诉tcpreplay样本原始链路类型是SS7,避免回放时被当成普通以太网帧拆解出错。如果目标是复现真实信令流量压力,可以把pps调大,但如果目的是验证业务流程,建议从低速率开始,观察对端有没有超时重发,再慢慢往上加。回放时可以同时起Wireshark抓回环口,用-L参数确认接口支持什么链路类型。
3.4 用Python按消息类型粗筛:把几千个包变成一张直方图
tshark做过滤已经很快,但需要做更复杂的统计、按呼叫维度聚合、或者把结果接进自研平台时,Python是绕不开的。我最常用的是pyshark,它封装了tshark的解析能力,可以当对象用,比直接调用命令行更好处理结构体。
import pyshark # 只加载ISUP层,keep_packets=False避免把整包内容全部保留在内存 cap = pyshark.FileCapture( "sample.pcap", display_filter="isup", keep_packets=False, ) count = {} for pkt in cap: try: mt = pkt.isup.message_type count[mt] = count.get(mt, 0) + 1 except AttributeError: # 个别包虽然有isup过滤命中的字段,但层对象不完整,跳过 continue print(sorted(count.items(), key=lambda x: x[1], reverse=True))pyshark的display_filter在FileCapture初始化时就传给tshark,比逐个包再判断效率高得多。pkt.isup.message_type是字符串,直接可以做分类统计。注意keep_packets=False这个参数,不做深层引用时尽量打开,否则几万包的文件内存占用会非常难看。AttributeError捕获的是那些在ISUP层解到一半但字段不齐全的包,这类异常在混合流量里很常见,不要让它中断整个循环。
注意:pyshark依赖tshark的可执行路径,跑之前先确认tshark在系统PATH里,否则FileCapture会直接抛ExecutableNotFound。
4. 七号信令联调参数:OPC/DPC、SLS、定时器与协议变体怎么配
4.1 链路参数速查表:这些参数填错了,信令根本不通
联调SS7网络时,最常打交道的参数就那几个。整理成表格方便对照检查:
| 参数 | 作用 | 常见取值/格式 | 填错时的表现 |
|---|---|---|---|
| OPC/DPC | 源/目的信令点编码 | ITU-T 14位点分式(如3-128-1);ANSI 24位 | 消息被对端丢弃,没有任何响应 |
| SIO | 服务信息八位组,含子业务字段和业务指示语 | ISUP固定SI=5;SCCP固定SI=3 | Wireshark能解出包,对端协议栈不认 |
| SLS | 信令链路选择码 | 值范围0~15或0~31,同一呼叫需相同 | 消息乱序,ISUP呼叫建立失败 |
| CIC | 电路识别码 | 16位(ITU-T变体)或12位(ANSI变体) | 呼叫与被叫电路对不上,REL放错电路 |
| SSN | 子系统号 | MAP用6,HLR、VLR各有定义 | SCCP路由失败,TCAP请求无响应 |
OPC/DPC配置错误是最难排查的一类问题,因为现象和"网络故障"很像,两边链路都显示正常,但消息发出去石沉大海。我遇到过一对OPC配置反了的案例,抓包看MTP3层地址完全反了,对端协议栈直接把它们当成来自错误信令点的消息丢弃了。所以联调第一步不是看业务,而是核对两端SPC表、SIO和SLS是否匹配。
4.2 ISUP、MAP与协议变体:ITU-T和ANSI真的不能混用
ISUP协议有两个主要变体:ITU-T Q.763和ANSI T1.113。两者在消息格式、参数编码和CIC位宽上有明显差异,混用的结果是消息能解出来,但关键参数错位,比如把IAM里的被叫号码读成了一串乱码。移动核心网里的MAP协议跑在TCAP上,规范可以在3GPP官网检索到,TS 29.002是MAP的基础规范,CAMEL的CAP在TS 29.078里。做核心网联调时,去3GPP官网找原始规范比看二手参数表靠谱得多,因为微小的字段顺序错误,在现网里就是一条闭塞电路。
协议变体选型要跟着现网走,而不是跟着代码习惯走。国内运营商之间的信令网基本是ITU-T变体,但接海外运营商或某些企业网关时,ANSI变体的出现频率不低。拿到一个样本包,先用tshark解一条ISUP消息,看CIC字段解出来是否合理,再决定后面整份文件按什么变体处理。Wireshark里可以在Telephony偏好设置里切换点编码格式和协议变体,改完之后所有已加载包的解码结果会立即刷新。
4.3 SIGTRAN承载下的配置:SCTP偶联与M3UA的联动
SS7不一定要跑在TDM链路上,SIGTRAN让M3UA、M2UA这些适配层跑在SCTP之上,IP网络承载SS7消息。这时候联调参数多了一层:SCTP偶联、M3UA的本地/远端路由上下文。SCTP偶联状态可以用lksctp-tools里的ss命令或者netstat -anp | grep sctp查看,确认偶联是ESTABLISHED而不是COOKIE_WAIT。
M3UA层要配置的是本地信令点编码和对端信令点编码,以及路由上下文(Routing Context)。实际项目中最常见的错误是M3UA配好了、SCTP也通了,但消息到对端后对端不知道往哪个应用层送上,因为路由上下文不匹配。排查时可以抓SCTP端口2905的包,看M3UA的DAFT和Notification里有没有给明确的错误原因码,Wireshark对M3UA的支持已经比较成熟,错误原因可以直接看到。
4.4 联调时最小可验证配置清单
我一般直接把联调流程拆成一个检查清单,每项通过再往下走:
- 物理链路或IP链路通:如果是SIGTRAN,sctp偶联状态为ESTABLISHED;如果是TDM,MTP2状态为"in service"。
- MTP3层能否互发管理消息:用SLTM/SLTA测试消息确认链路可用,对端应回复SLTA。
- SCCP路由是否可达:发起一个TCAP的Ping类操作,看对端是否回ReturnResult。
- ISUP呼叫回路:用测试号码发起一次呼叫,观察IAM、ACM、ANM的完整交互。
- 事务定时器检查:TCAP的对话超时时间、ISUP的T1定时器配置要与对端对齐,否则会出现一端已经释放、另一端还在等消息的死等。
这套清单的价值在于把"看起来通了"和"真的能承载业务"分开。很多联调卡在第四步,前两步全通,但IAM发过去没反应,这时候回头查OPC/DPC或者SIO往往能快速定位。
5. 避坑:SS7协议分析里最常见的五个翻车现场
5.1 现象:抓包文件打开全是黑色原始比特流,连LSSU都看不到
原因:Wireshark把包当成了普通以太网/UDP负载,没有启用SS7相关解析器。这最常见于SIGTRAN承载的抓包样本,Wireshark没识别出SCTP端口对应的M3UA/M2UA。解决:不要硬看十六进制,先用capinfos确认Link type,再通过Decode As把对应端口指认为mtp3或m3ua。tshark的命令行做法是-d sctp.port==2905,mtp3,把2905端口的SCTP载荷按MTP3解析。
5.2 现象:过滤isup一条消息都没有,但抓包时确实看到了IAM
原因:ISUP消息可能因为MTP3层SIO字节的解码不正常,导致Wireshark把业务指示语识别成未知,从而挂不上ISUP解析器。另一种常见情况是消息不是标准MTP3封装,而是直接从ISUP层开始抓的裸包。解决:先解一个包看MTP3的Service indicator值,如果是5就手动强制按ISUP解,如果MTP3都没有,就检查是不是抓包位置在TDM链路的物理层,需要从MTP2开始启用解析器。
5.3 现象:OPC/DPC显示成0.0.0或者巨大的异常数字
原因:Wireshark默认的点编码格式和样本实际格式不匹配。ITU-T格式3-8-3显示为三段数字,ANSI 24位也是三段数字,但位宽和掩码完全不同,用错格式后解码出来的地址完全没有意义。解决:在Wireshark里进入Telephony偏好设置,把点编码格式调成和样本一致;命令行批处理时,用-o参数指定mtp3.pc_format,这个参数的具体取值在不同版本里叫法不同,先tshark -G default查一下可用值。
5.4 现象:TCAP事务对应不起来,同一对话的Invoke和ReturnError被拆开显示
原因:样本跨了多条信令链路抓取,同一事务的消息走了不同SLS,分析工具没做链路聚合,导致TCAP层关联失败。IMEI鉴权、位置更新这类业务在正常负荷分担下就可能走不同链路,抓包点如果不在一处,根本拿不到完整对话。解决:尽量在单条链路上抓包,或者把多链路抓包的样本合并前先按时间校准,再人工确认同一次对话的消息是否出现在同一OPC/DPC对。Wireshark里看TCAP时打开"Preferences -> Protocols -> TCAP -> Reassemble",这个选项能缓解但不解决根本的跨链路问题。
5.5 现象:tcpreplay回放后对端一直报事务超时
原因:样本文件时间跨度大,tcpreplay默认按文件里的相对时间戳加速回放,几小时的包几秒就发完了,上层协议的对话定时器全部被触发超时,看起来就像全网故障。解决:回放时限制速率,--pps设成样本实际速率的1到2倍,或者用--multiplier把回放倍速设成0.5这种慢速。更严谨的做法是用editcap先把样本做时间过滤,只截取其中一段完整呼叫流程,再把这段流程循环回放,这样既不会超时,也方便反复验证。
6. 验证一份SS7分析结果靠不靠谱:三个必做的手工校验
分析工具给出的消息列表不一定等于真实信令互动。踩过几次坑之后,我现在每份样本做完分析,都会做三个手工校验。第一个是CIC一致性校验。一次普通呼叫的IAM、ACM、ANM、REL、RLC,CIC必须完全相同,SLS也必须相同,如果工具里同一呼叫CIC对不上,基本是抓包跨链路或者解码变体选错了。用一条tshark命令把CIC字段按时间打印出来,肉眼扫一遍就能发现异常。
第二个是MTP2层的序号连续性校验。一条正常链路上,MTP2的FSN是连续递增的,中间出现跳变说明抓包有丢包,可能是抓包软件缓冲区溢出,也可能是链路本身在重发。顺序校验用tshark导出mtp2.fsn字段,把它和包序号做差,差值不稳就说明样本本身不可靠,后面任何分析结论都要打折扣。第三个是信令方向校验。IAM从主叫侧信令点发出、指向被叫侧,REL应该反向。如果一份样本里IAM和REL都是从同一个OPC发往同一个DPC,那说明要么抓到了两个方向的包混在一起没分类,要么分析的议题本身就不是单次呼叫。
这三个校验看起来基础,但能过滤掉大量工具误判。我第一次搭SS7抓包环境时,看着满屏原始比特流,第一反应是怀疑抓包工具有问题,后来才发现是点编码格式和解码规则没设置。现在每拿到一份新样本,我会先把样本链路类型、协议变体和点编码格式写进工作笔记开头,再逐层展开。希望帮到你。
本文还有配套的精品资源,点击获取