📹 第十一章 GB/T 28181国标平台案例应用
📄 一句话概括

抓包是国标排障的最后一招,也是最有效的一招。 但「抓到一堆报文」不等于「看懂了」。 看抓包只有三个动作:比 CSeq、比 Call-ID、看「有没有回」。

📝 本节和前面几节的关系

前面十节讲的是「应该怎么跑」,这一节讲「跑不起来时怎么看」。 它是整本书的收口,因为前面所有知识,最后都要落到「抓一个包看哪里」上。 这一节的 Demo 会真解析一份抓包摘要,不是讲道理。

一、十一条报文,两段

一次完整的「注册加看一路」是十一条报文:注册四条、点播到首包五条、挂断两条。 注册四条不到一百毫秒,点播到首包一百四十毫秒, 中间那五秒是「平台决定要看」的人工延迟,不算协议开销。 把这个时间线画出来,很多事情就清楚了: 为什么点播要等一下、为什么挂断要两条、为什么「能播十秒就断」是少了 ACK。 不看时间线只看报文,就只能知道「有哪些报文」,不知道「谁在等谁」。

二、三个关键动作

第一,先找 CSeq:同一次会话的请求,序号是连着的,断了就说明有一趟丢了。 第二,比对 Call-ID:注册和点播一定是两个不同的 Call-ID。 如果相同,说明复用会话,这时要特别注意会话超时。 第三,看「有没有回」而不是「回的什么」:大多数故障是「根本没回」,不是「回错了」。 因为回错了至少有错误码可查,没回什么都没有。 方向那一列也要看:-> 后面没有对应的 <-,问题就在那一条上。

三、抓不到包也是一种信息

抓包工具默认抓本机网卡,但平台跑在容器里、或者流量走了别的网卡,就抓不到。 这时要在「正确的网卡上抓」,或者「在交换机上做镜像」。 「抓不到包」这个现象本身,就在告诉你「流量不走这里」。 还有一种情况是「只抓到单向」:说明回程走了不同路径,或者被防火墙拦了。 单向抓包是最容易误判的——你会以为「设备没回」,其实是「回了但没经过你这块网卡」。 所以下结论之前,先确认「抓包点在哪里」。这句话能省掉很多误判。

四、动手 Demo:把一次点播的抓包逐条拆开

用正则解析一份抓包摘要,把序号、相对时刻、方向、报文排成时间线, 再把「注册」和「点播」两段的耗时算出来。

for line in cap.strip().split("\n"):
    m = re.match("MESSAGE (\\d+) (\\S+) (->|<-) (.+)$", line)
    idx, t, d, msg = m.groups()
    hh, mm, ss = t.split(":")
    sec = int(hh) * 3600 + int(mm) * 60 + float(ss)
    print(idx, "%.3f" % (sec - t0), d, msg)

实跑输出:

--------------------------------------------------------------------
把一次点播的抓包逐条拆开
--------------------------------------------------------------------
**抓包是国标排障的最后一招,也是最有效的一招。**
**但「抓到一堆报文」不等于「看懂了」。**
**这一节用代码解析一份抓包摘要**,**把方法、CSeq、Call-ID 抽出来排成时间线。**

  序号       相对时刻       方向       报文
  -------------------------------------------------------------
  **1**      **0.000**      **->**     **REGISTER**
  **2**      **0.021**      **<-**     **401 Unauthorized**
  **3**      **0.042**      **->**     **REGISTER**
  **4**      **0.064**      **<-**     **200 OK**
  **5**      **5.100**      **->**     **INVITE**
  **6**      **5.118**      **<-**     **100 Trying**
  **7**      **5.163**      **<-**     **200 OK**
  **8**      **5.181**      **->**     **ACK**
  **9**      **5.240**      **<-**     **RTP**
  **10**     **35.500**     **->**     **BYE**
  **11**     **35.520**     **<-**     **200 OK**

**十一条报文分成两段**:**注册四条的耗时不到一百毫秒,点播到首包一百四十毫秒。**
**中间那五秒是「平台决定要看」的人工延迟,不算协议开销。**

**看抓包有三个关键动作**:

**第一,先找 `CSeq` 序号**:**同一次会话的请求,`CSeq` 是连着的;断了就说明有一趟丢了。**
**第二,比对 `Call-ID`**:**注册和点播是两个不同的会话,`Call-ID` 一定不同。**
**如果相同,说明复用会话,这时候要特别注意会话超时。**
**第三,看「有没有回」而不是「回的什么」**:**大多数故障是「根本没回」,不是「回错了」。**

**方向那一列也有讲究**:**`->` 是平台发出去的,`<-` 是收到的。**
**如果某条 `->` 后面没有对应的 `<-`,问题就在那条上。**

**最后说一个「抓包抓不到」的常见原因**:
**抓包工具默认抓本机网卡,但如果平台跑在容器里、或者流量走了别的网卡,就抓不到。**
**这时要在「正确的网卡上抓」或者「在交换机上做镜像」。**
**「抓不到包」这个现象本身,也是一种信息。**

十一条报文里,注册占四条、点播占五条、挂断两条,这个分布几乎每次都是这样。 所以「少了哪一条」一眼就能看出来。 注册四条是「空 REGISTER、401、带摘要的 REGISTER、200 OK」, 点播五条是「INVITE、100、200、ACK、首包 RTP」。 时间线里那个五秒的跳跃要会读:它不是协议慢,是「人在界面上点了按钮」。 如果把五秒算进协议开销,就会得出「国标点播要五秒」的错误结论。 最后那句「抓不到包也是信息」是这一节的落点:很多人卡在「没抓到」,却不问「为什么没抓到」。 而「为什么没抓到」往往就是答案。

30 秒实验

  1. 算一下:注册四条占了多少毫秒?(64 毫秒)
  2. 想一下:为什么「有没有回」比「回的什么」更值得先看?
  3. 想一下:只抓到单向报文说明什么?(回程走了别的路径或被拦)

常见误区

  1. 以为「抓到报文就能看出问题」。 要排成时间线看谁在等谁。
  2. 以为「点播慢是协议慢」。 人工操作的那几秒不算协议开销。
  3. 以为「没抓到就是没发」。 可能只是抓错了网卡。
自测三问(点开对答案) 1. 一次完整的「注册加看一路」有几条报文? —— **十一条**:注册四条、点播五条、挂断两条。 2. 看抓包的三个关键动作是什么? —— **比 CSeq、比 Call-ID、看有没有回**。 3. 只抓到单向报文说明什么? —— **回程走了不同路径,或被防火墙拦了**。

全书到这里就完了。从协议到软件到抓包,这条线走了一遍;剩下的是把它们在自己项目里跑通。

相关笔记