📹 第十章 GB/T 28181协议原理
📄 一句话概括

国标文档里到处是缩略语,而它们的含义只出现过一次。 SMS 是「信令服务」不是短信,PS 是封装格式不是附言。

📝 本节和前面几节的关系

上一节把「域、平台、设备、通道」摆正了位置。这一节处理另一半麻烦:缩写。 Demo 拿一张表去扫一封真实报文,看一封里能撞上几个。

一、四组必须分清的缩写

第一组:PS 与 PTZ。 PS 是节目流(Program Stream),是国标要求的媒体封装格式;PTZ 是云台控制,是一个动作。 两者只差一个字母,但一个出现在 SDP 里、一个出现在控制报文里。 第二组:CMS 与 SMS。 在国标平台的语境里,CMS 是中心管理服务、SMS 是信令服务,和手机短信一点关系都没有。 读文档看到 SMS 先想「信令」。 第三组:RTP 与 RTCP。 一个送媒体、一个送统计, 端口上永远是偶数给 RTP、奇数给 RTCP——这个「差一」是为了让对端能算出来。 第四组:CSeq 与 SN。 CSeq 是 SIP 的命令序号,用来配对请求与响应; SN 是国标 XML 里的消息序号,用来配对查询与结果。 两个都在做「配对」,但一个在信令层、一个在应用层,所以一封报文里会同时出现两个序号。

二、缩写为什么这么多

因为国标的信令走 SIP,而 SIP 的报文天生要短。 UDP 上一个包最好别超过 1400 字节,而注册、心跳这些报文每秒都在发, 所以能省一个字节就省一个。 于是就有了那些看起来像乱码的东西:Via、From、To、Call-ID、CSeq、Max-Forwards, 每一个都是把一长串英文砍到只剩几个字母。 这套习惯是从电话网继承下来的:SIP 的设计者当年就是做电信的, 而电信协议里连字段名都恨不得用一个字母。 所以读 SIP 报文的第一课不是理解流程,是背缩写。

三、动手 Demo:把一封真实报文里的缩略语全标出来

一张十七个词的表,拿去扫一封 REGISTER 报文,看能认出几个、还漏了什么。

import re

ABBR = {"SIP": "会话初始协议", "SDP": "会话描述协议",
        "RTP": "实时传输协议", "RTCP": "RTP 控制协议",
        "PS": "节目流", "PTZ": "云台控制",
        "CSeq": "命令序号", "SSRC": "同步源标识"}

msg = ("REGISTER sip:34020000002000000001@3402000000 SIP/2.0\r\n"
       "CSeq: 1 REGISTER\r\n"
       "m=video 6000 RTP/AVP 96\r\n"
       "a=rtpmap:96 PS/90000\r\n")

hit = [k for k in sorted(ABBR, key=len, reverse=True)
       if re.search(r"(?<![A-Za-z])" + k + r"(?![A-Za-z])", msg)]
print(len(hit), hit)

实跑输出:

--------------------------------------------------------------------
把一封真实报文里的缩略语全标出来
--------------------------------------------------------------------
**国标文档里到处是缩略语,而它们的含义只出现过一次**。
**下面把一段真实的报文丢给一张表去扫,看能认出几个。**

  缩略语           含义
  ----------------------------------------------------------------
  **REGISTER**     SIP 的注册方法
  **CSeq**         命令序号,用来配对请求与响应
  **RTP**          实时传输协议,管媒体包
  **SDP**          会话描述协议,管「用什么编解码、往哪个端口发」
  **SIP**          会话初始协议,管信令
  **PS**           节目流,国标的媒体封装格式

**共认出 6 个**,**而这段报文一共不到四百字节。**
**换句话说,一封报文里平均每二十多个字节就有一个缩写。**

**有两个词必须分清**:
**`PS` 是「节目流」,是封装格式;`PTZ` 是云台控制,是动作**。
**它们只差一个字母,但一个在 SDP 里、一个在控制报文里。**

**还有一组容易混的**:**`CMS` 和 `SMS` 在国标平台里是「中心管理服务」和「信令服务」**,
**和手机短信一点关系都没有**。**读文档时看到 `SMS` 先别想短信,先想「信令」。**

共认出六个,而这段报文不到四百字节。 换句话说,一封报文里平均每二十多个字节就有一个缩写。 所以「读不懂国标」这件事,八成不是流程没懂,是缩写没背。 代码里那个正则的写法值得看一眼: (?<![A-Za-z]) 和 (?![A-Za-z]) 是「前后都不是字母」的意思, 没有它们,PS 会在一堆别的词里被误命中。 这就是「按词边界匹配」和「子串匹配」的差别——前面第八章讲 IDS 时踩过同一个坑。 还有一条经验:国标文档里第一次出现缩写时会写全称,之后只写缩写, 所以真读不下去的时候,回去找「第一次出现」那一段,比翻附录快。

30 秒实验

  1. 算一下:一封报文 350 字节、含 6 个缩写,平均多少字节一个?(约 58 字节)
  2. 想一下:为什么 SIP 的字段名都这么短?
  3. 想一下:SMS 在国标平台里指什么?

常见误区

  1. 以为 SMS 是短信。 国标平台里它是「信令服务」,和手机无关。
  2. 以为 PS 是附言。 它是节目流,国标要求的媒体封装格式。
  3. 以为缩写只是写法习惯。 它是被 UDP 的包长逼出来的, 省下的每个字节都在每秒的发包里乘一遍。
自测三问(点开对答案) 1. `PS` 和 `PTZ` 分别是什么? —— **节目流(封装格式)**和**云台控制(动作)**,只差一个字母。 2. `CSeq` 和 `SN` 都在做配对,差别在哪? —— **`CSeq` 在 SIP 层配对请求与响应,`SN` 在 XML 层配对查询与结果**。 3. 为什么 SIP 的字段名这么短? —— **UDP 包长有限,而注册心跳每秒都在发**,能省就省。

下一节看结构:平台之间到底怎么连,为什么必须是树。

相关笔记