抓包是国标排障的最后一招,也是最有效的一招。 但「抓到一堆报文」不等于「看懂了」。 看抓包只有三个动作:比 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 秒实验
- 算一下:注册四条占了多少毫秒?(64 毫秒)
- 想一下:为什么「有没有回」比「回的什么」更值得先看?
- 想一下:只抓到单向报文说明什么?(回程走了别的路径或被拦)
常见误区
- 以为「抓到报文就能看出问题」。 要排成时间线看谁在等谁。
- 以为「点播慢是协议慢」。 人工操作的那几秒不算协议开销。
- 以为「没抓到就是没发」。 可能只是抓错了网卡。
自测三问(点开对答案)
1. 一次完整的「注册加看一路」有几条报文? —— **十一条**:注册四条、点播五条、挂断两条。 2. 看抓包的三个关键动作是什么? —— **比 CSeq、比 Call-ID、看有没有回**。 3. 只抓到单向报文说明什么? —— **回程走了不同路径,或被防火墙拦了**。全书到这里就完了。从协议到软件到抓包,这条线走了一遍;剩下的是把它们在自己项目里跑通。
- ☐ (全书完)