用 Wireshark 分析 RTP 流

Wireshark 是一个强大的抓包及网络分析软件,可以用来嗅探和分析多种网络协议的数据包和流,RTP 和 RTCP 也是其中的两种。

对 RTP 流的分析过程,在 Wireshark 的 Wiki 上讲得很清楚,下面我只是记录一下我在使用过程中的一些经验:

1. 要想分析 RTP 流,首先要把抓到的 UDP 包用 RTP 协议而不是默认的 UDP 协议 decode; Wireshark 默认只对选中的流(由端口区分)进行 decode,所以对 audio 和 video 流要分别 decode。

2. 直接从菜单中选择 RTP 的 Stream Analysis... 才是对双向的流进行分析,从 Show All Streams 中再分析只是单向的 RTP 流。

3. 不要过度相信 Wireshark 的能力,尤其是在无线网络或者网卡驱动不是很合适的情况下,Wireshark 也会有丢包,所以说 Wireshark 对 RTP 流的分析也是“仅供参考”——除非经过严格测试 Wireshark 不会错过任何包。

4. 这个页面上提到的 Sun 的 JMF JMstudio 的 Linux 版本状况很糟糕。首先其安装文件中使用的 tail 参数和 bash 中的 tail 参数不一样,导致执行安装文件不仅不会安装,反而会清除安装文件的内容。由于其将安装脚本和二进制文件写入到同一个文件中,所以最好是在外部手工用 tail 提取二进制文件的内容;其次无论如何配置,该程序运行时会去监听 IPv6 地址的端口而不是 v4 的端口——我一直想不通是什么原因,所以该程序可以说是基本不可用。

5. rtptools 是个好东西。我们可以先用 Wireshark 录制一段 RTP 流,保存成 rtpdump 格式,就可以用 rtpplay 不断地重放它,用来测试网络状况很方便。原本应该用 JMStudio 收听的,既然它不可用,只有用 rtpdump 在另一端收听了。

回复选登:

james:

博主请问有没有办法能够使wireshark能够在ubuntu下捕捉到所有的rtp包?

由于要做老板的项目,所以需要测量一系列delay,jitter等等数据。所以我用vlc做server向外multicast一个rtp stream (拓扑上用的全部是有线)。若传输的stream质量不高(比如dvdrip,大概速度也就1.5mbps),wireshark能够完全捕获所有的包。但是若是使用较高质量的stream(比如1080p,1080i的,大概在20mbps)就会出现wireshark丢包的情况。

所以我想知道wireshark丢包的原因是不是来自于cpu利用率太高?有没有办法在仍然使用wireshark的情况下捕捉到所有的包?如果有其他抓包、分析软件,博主可否给我推荐一下?

非常感谢!

Solrex Yang:

@james
非常抱歉,我所了解的知识无法解决您遇到的问题。如果您找到了解决方法,非常欢迎您回来再次留下您的评论。

james:

博主你好,这个问题已经解决了。

由于wireshark实时捕捉packet会非常消耗cpu资源,所以我使用tcpdump来抓包,并且加大了libpcap的缓冲区,问题就解决了。

当然,若是要在Gbps的网络环境中抓包,linux下的tcpdump的精度完全不够(尤其在包长度小的时候很明显),这个就是跟libpcap函数相关的。有个意大利大牛写了一个PF_RING的类似“zero copy”的应用,可以在很大程度上解决这个问题,如果大家有兴趣可以尝试。google上有相关介绍。

《用 Wireshark 分析 RTP 流》上有16条评论

  1. 你的博客在firefox下面显示有很大的问题,请解决一下。
    我的系统是xp sp2和firefox 3.0.12

  2. @rushui999
    哦?什么问题?我平常都是用 Firefox 浏览我的网站的,包括 Linux 和 Windows 平台上,都没有发现过问题呀。您能否详细描述一下遇到的问题?

  3. 你好,上午看的时候确实有问题,可惜当时没有截图,但是现在访问又没有问题了。现在我怀疑上午应该是当时我的显示屏除了问题了,应该不是你的网站的显示问题,抱歉啊!

  4. 博主请问有没有办法能够使wireshark能够在ubuntu下捕捉到所有的rtp包?

    由于要做老板的项目,所以需要测量一系列delay,jitter等等数据。所以我用vlc做server向外multicast一个rtp stream (拓扑上用的全部是有线)。若传输的stream质量不高(比如dvdrip,大概速度也就1.5mbps),wireshark能够完全捕获所有的包。但是若是使用较高质量的stream(比如1080p,1080i的,大概在20mbps)就会出现wireshark丢包的情况。

    所以我想知道wireshark丢包的原因是不是来自于cpu利用率太高?有没有办法在仍然使用wireshark的情况下捕捉到所有的包?如果有其他抓包、分析软件,博主可否给我推荐一下?

    非常感谢!

  5. @james
    非常抱歉,我所了解的知识无法解决您遇到的问题。如果您找到了解决方法,非常欢迎您回来再次留下您的评论。

  6. 博主你好,这个问题已经解决了。
    由于wireshark实时捕捉packet会非常消耗cpu资源,所以我使用tcpdump来抓包,并且加大了libpcap的缓冲区,问题就解决了。
    当然,若是要在Gbps的网络环境中抓包,linux下的tcpdump的精度完全不够(尤其在包长度小的时候很明显),这个就是跟libpcap函数相关的。有个意大利大牛写了一个PF_RING的类似“zero copy”的应用,可以在很大程度上解决这个问题,如果大家有兴趣可以尝试。google上有相关介绍。

  7. 请问博主,我使用的wireshark没有保存rtpdump文件格式选项,只有raw和au两种格式
    我把存下来的文件用rtpplay播放的时候提示invalid header。
    怎么回事呢?

  8. 哦,谢谢,我的版本是最新的,save as的时候没有选项,但是在弹出的窗口的标题栏上标明了:
    "Wireshark: Save selected stream in rtpdump(-F dump) format"

    是我看的不仔细,不好意思。本来想上个图,好像这里不支持贴图?

  9. 谢谢回复!
    我使用的wireshark版本是最新的,在save as的时候没有选项,但是save as的窗口标题栏上有文字:
    “Wireshark: Save select stream in rtpdump(-F dump) format”
    看来wireshark已经把rtpdump格式作为缺省的rtp流的保存形式了。
    本来想上个图,但是这里似乎不支持图片?
    而且验证码输入错误的话,回复内容就会丢。我又重新打了一遍。

  10. 谢谢回复!
    我使用的wireshark版本是最新的,在save as的时候没有选项,但是save as的窗口标题栏上有文字:
    “Wireshark: Save select stream in rtpdump(-F dump) format”
    看来wireshark已经把rtpdump格式作为缺省的rtp流的保存形式了。
    本来想上个图,但是这里似乎不支持图片?
    而且验证码输入错误的话,回复内容就会丢。我又重新打了一遍。

    @Solrex Yang

  11. 请问作者,我现在有多个pcap,需要从全部pcap中解码出RTP包,有没有什么非手动的方法呢?wireshark有提供可以Decode as RTP的命令行模式吗?另外,为什么我的wireshark里打开只有Decode as RTPproxy和Decode as RTSP,没有RTP啊,这种情况怎么办呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注