用 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上有相关介绍。

分类: IT 标签: , , ,
  1. Fluyd
    2009年7月28日00:58 | #1

    你咋关心起RTP啦

  2. 2009年7月28日08:52 | #2

    @Fluyd
    呵呵,工作需要,给一些应用做评估。

  3. rushui999
    2009年8月1日09:32 | #3

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

  4. 2009年8月1日11:11 | #4

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

  5. rushui999
    2009年8月1日16:53 | #5

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

  6. 2009年8月1日17:17 | #6

    @rushui999
    恩,好,仍然谢谢 :)

  7. james
    2010年2月18日14:10 | #7

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

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

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

    非常感谢!

  8. 2010年2月23日12:11 | #8

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

  9. james
    2010年2月23日13:07 | #9

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

  10. wintersday
    2010年6月8日17:36 | #10

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

  11. 2010年6月8日20:07 | #11

    @wintersday
    我不知道是您选择的wireshark版本不对还是操作问题,但是在我的Wireshark中选择"Save as"是可以有二十多种文件格式可供选择的。

  12. wintersday
    2010年6月9日09:53 | #12

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

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

  13. wintersday
    2010年6月9日09:56 | #13

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

  14. wintersday
    2010年6月9日09:58 | #14

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

    @Solrex Yang

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
说明:点击回复/引用, 会发邮件给该用户, 请慎用; 填写非真实电邮地址, 评论可能会被自动过滤, 无法及时显示, 不要责怪我. 卡内基梅隆大学的 reCAPTCHA 计划使用验证码帮助辨认古老典籍扫描时无法识别的文字,输入验证码的同时,您也为保存人类知识做了一分贡献,谢谢!