Wireshark
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
在流媒体相关工作中,涉及最多的流媒体交互协议分析、音视频流封装协议缝隙以及解封装处理,这些工作都离不了Wireshark工具。这里总结本人在工作中Wireshark常见操作,以备不时之需。
本文所有操作都是基于Win10 Wireshark 3.6.1
过滤表达式
属性与值之间使用 ==
,属性值对之间使用逻辑and
or
等关联
ip.src
源ipip.dst
目标ipip.addr
ipudp.srcport
udp源端口udp.dstport
udp目的端口udp.port
udp端口
这里简单介绍这些,对于抓包在linux环境,主流的还是tcpdump,通常使用tcpdump在linux服务器上抓取包,然后放到Windows下使用Wireshark进行分析,这里推荐
- 万字长文教你玩转 tcpdump,从此抓包不用愁
- UDP分片带来的抓包陷阱
实践分析总结
导出满足条件的包
- 背景 通常情况咱们抓取的包是大量,而分析用到包只是其中一部分,这时有必须将有效包进行另存为保存,一方面便于技术从现场抓取传到公司供研发人员分析,(通常是要消耗现场技术人员的移动流量的),另一方面便于分析。
- 操作步骤 在过滤器工具栏输入过滤条件,回车后进行过滤,分组列表只显示满足过滤条件的分组,依次点击【文件】菜单下的导出特定分组…,填写文件名,点击保存即可
- 【查看tcp流量图】Flow Graph
- 背景 在学习tcp协议时,提起最多的就是三握手、四挥手之类的,再怎么分析讲解的头头是道,不如抓包查看一波。
- 操作步骤 点击【统计】菜单下的流量图,会显示所有流量的流量图,如果只需显示过滤后的tcp流量图,那么操作之前在过滤器工具栏输入过滤条件,在流量图对话框出来后,勾选限制显示过滤器,流类型选择TCP Flows即可,如下图
- 注意事项 通常看到的Seq是从0开始,这里需要说明的Wireshark中显示的Seq是相对值,从0开始,而要显示原始值需要对Wireshark设置的。依次【编辑】-> 首选项… -> 展开 Protocols -> TCP,在TCP的配置页面,Relative sequence numbers 选项去掉即可
保存UDP/TCP/RTP负载数据
- 背景 在视频抓包分析过程中,有时候需要从TCP、UDP、RTP中直接提取payload数据,比如较老的摄像机,有一些直接通过TCP/UDP传输视频裸流,或者PS打包的视频流,通过提取TCP和UDP的负载数据就可以直接组成裸流或者PS流文件,通过视频分析工具(Elecard StreamEye Tools)分析视频流数据是否正常。GB28181视频传输时通过RTP携带PS流的方式传输,因此通过提取RTP负载数据,形成的文件即是PS流文件,可通过分析工具直接分析PS流。
- TCP和UDP提取其负载数据比较简单,他们提取方法很相似。以保存UDP负载数据为例。
- 在UDP包数据列表中右键->追踪流->UDP 流,打开Udp 流对话框,对话框中集合了所有UDP通讯数据,选择你需要的UDP四元组,数据默认显示为ASCII,右下角show data as 选择原始数据,点击另存为保存成二进制文件,文件中数据即为UDP负载数据
- 现在的视频采集终端基本不会直接通过TCP或者UDP传输裸流,比较常用的是通过RTP方式来传输裸流或者PS流。这里详细介绍直接提取RTP负载,不做任何组包操作。需要注意的,这里如果从RTP流中提取负载数据是PS流可以直接使用播放器播放,如果负载数据是输H264或者H265裸流,因为不做组包处理,是无法使用播放器进行播放的,这里涉及到H264与H265两种封装方式的转换问题。直接提取RTP负载数据操作步骤如下
- 将UDP流解析为RTP协议 新版Wireshark会根据包的上下文(可以理解为RTSP或者SIP会话)自动将对应的UDP/TCP负载包解析为RTP协议,如若为解析成RTP协议。选择相应的数据包分组,右击选择Decode as …,在current属性列表中选择rtp,解码成rtp包。
- 【电话】菜单下依次选择RTP -> RTP播放器,打开RTP播放器会话窗口
- 选择RTP的视频链路,选择export->payload,保存rtp负载
- 如果RTP负载的是PS流,那么保存的文件可以直接供播放器进行播放。
- 将UDP流解析为RTP协议 新版Wireshark会根据包的上下文(可以理解为RTSP或者SIP会话)自动将对应的UDP/TCP负载包解析为RTP协议,如若为解析成RTP协议。选择相应的数据包分组,右击选择Decode as …,在current属性列表中选择rtp,解码成rtp包。
- 在UDP包数据列表中右键->追踪流->UDP 流,打开Udp 流对话框,对话框中集合了所有UDP通讯数据,选择你需要的UDP四元组,数据默认显示为ASCII,右下角show data as 选择原始数据,点击另存为保存成二进制文件,文件中数据即为UDP负载数据
RTP分析
- 背景 RTP大多数场景下是在负载在UDP协议上的,在复杂的网络环境下,不靠谱的UDP着实给同行惹来不少麻烦。但凡遇到视频播放卡顿、画面模糊的情况,免不了一波操作。
- 操作说明 【电话】菜单依次选择RTP -> RTP流
可以根据视频流的ip、port、ssrc选择RTP会话,然后进行如下操作- Prepare Filter 对包进行过滤处理,使Wireshark主菜单只显示该会话的包,便于另存为单独分析
- Play Stream 便是上面提到的RTP播放器会话框,用来提取RTP负载数据等操作
- 分析 可以查看RTP的丢包乱序情况,收发包抖动情况
SIP会话分析
- 背景 基于GB28181进行业务开发时,免不了要对接其他厂商的流媒体服务器,一旦出现问题免不了一顿扯皮。那么抓包分析摆事实是撇清自身问题的最佳选择(当然这里也要打铁还要自身硬)。
- 操作方法 点击【电话】菜单下的SIP流,选择相应的话,进行如下操作
- Flow Sequence 通过SIP流序图可以分析学习整个会话流程
- Prepare Filter 过滤会话,分析相应的呼叫中SDP信息以及RTP分析,也可以导出特定分组… 保存用来分享学习
- Play Stream 播放会话的RTP流,也可以从RTP播放器对话框调转到RTP流分析对话框
- Flow Sequence 通过SIP流序图可以分析学习整个会话流程