1、 SIP 进阶-wireshark 使用及实例分析一、SIP 会话概念:Call-ID:一个会话的唯一标识CSeq:对应一个序号+请求方法,例如 60 INVITE,对应的响应也需要和这个 CSeq 一致,每次不同的事务 CSeq 都需要+1,uac 和 uas 独立计算Branch:会话中一个事务的唯一标识,一个事务简单说就是请求+响应,按标准必须以z9hG4bK 开头,一般来说所有的请求的 Branch 都是不一样的,除了两个特殊的:CANCEL 和针对非 2xx 响应的 ACK 需要和其取消的请求有一致的 BranchFrom tag:会话中 uac 标识To tag:会话中 uas 标
2、识以 call_id.pcapng 中的例子讲解:1. Call-ID从最初的 INVITE 到最后 BYE 结束通话,整个算同一个会话,所以这中间的其他请求(I 帧请求和 Session Timer 更新也是包含在这个会话当中)和响应都是同一个Call-ID:2. Branch初始 INVITE、uas 响应的 100/422、uac 的 ACK 确认是一个事务,Branch 应该一样,这里 ACK 因为是对 422(非 2xx)响应的,所以 Branch 也一致接下来的 INVITE、uas 响应的 180/200 是一个事务,而 ACK 是针对 200ok(2xx)的,所以是一个单独的
3、Branch会话过程中的 INFO 和 UPDATE 和对应的响应都是不同的 Branch,最后的 BYE 和 200 又是一次事务,整个会话结束3. From tag”不用写,remote_portpeer_tag_param ,虽然实际数据是需要分号的。3. IP Call 失败:ICMP Port unreachable原因 1:账号未启用原因 2:被叫启用随机端口4. 被叫接听后无反应,直到超时结束(call_establish_failed.pcapng)原因:被叫 200OK 携带的 Contact 地址主叫的 ACK 无法到达被叫5. 网络切换 gs_phone 未使用新的地址(
4、network_switch.pcapng)6. 服务器转发 200 OK C 地址错误(SDP_connection_error.pcapng)sip.Call-ID = “1571901531-14451-31BJC.BGI.BCI.IJ“Frame 20641 和 Frame 20642 回复的两次 200OK 中 SDP 携带的 C 地址不一样,第二次的有错误,直接将被叫的 200OK 携带的地址和端口写入。7. Hold 时因为 BFCP Goodbye 无法透传导致延迟挂断( bfcp_hold_bye.pcapng)8. BFCP 连接未建立结束通话仍发 Goodbye(bfcp
5、_not_established_bye.pcapng )三、实例分析(媒体部分)1. Offer/Answer m 行不匹配( SDP_m_lines_not_match.pcapng)NO.2 INVITE SDPNo.16 200OK SDP2. RTP 包长度错误( rtp_audio_length_error.pcapng)20ms*8kHz*8bit=160byte 160byte*50=64kbps3. RTP Jitter 过大(rtp_audio_jitter.pcapng)4. RTP 内容错误( rtp_audio_from_qdeng.pcapng)5. 被叫回 180
6、 就开始发 RTP 导致 I 帧不全无法解出视频(vidyo-oneway.pcapng)6. 视频卡顿问题分析(video_loss.pcapng)参考指标:1. 丢包率:大的丢包率有参考意义,但小的丢包率不能作为参考依据,因为有连续丢包的可能,需要看具体数据2. 抖动和乱序:需要看具体帧率是否平滑稳定,按 mark 包(mark 标记一帧结束)来统计帧率,抖动需要看视频解码的缓冲大小,比如预设了 512kbit,如果码率为 512kbps,也就是可以缓冲约 1s 钟的数据3. 关键帧(I 帧)是否完整这段数据的回放实际是有花屏卡顿的,先来看下丢包率数据中因为同一 SSRC 有两个 payload,而这两个 payload 数据的 Sequence Number 又是独立计算,wireshark 解析丢包率会出错,需要重新 Export 单独的 Payload 数据虽然丢包率很小,只有 14 个(0.21%),再仔细看下数据从 seq.1030 开始丢包,而且是连续性的丢包过滤 rtp.ssrc = 0x74a9b431,查看丢包的数据丢包的数据恰好是 I 帧(IDR)的数据,从前后的 264 FU Header 中可以看到 I 帧,I 帧以Mark 包结束这段数据也是 I 帧内的