如何确定数据包是否为RTP / RTCP?

时间:2010-05-26 19:38:07

标签: c# udp rtp sharppcap rtcp

我正在使用基于WinPCap构建的SharpPCap来捕获UDP流量。我的最终目标是从H.323捕获音频数据并将这些电话对话保存为WAV文件。但首先要做的是 - 我需要弄清楚我的UDP数据包是通过网卡的。

SharpPCap提供了一个UdpPacket类,可以让我访问消息的PayloadData。但我不确定这些数据是做什么的。它是一个Byte []数组,我不知道如何确定它是否是RTP或RTCP数据包。

我用Google搜索了这个话题,但那里并没​​有多少。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:5)

查看RFC 3550中的RTP和RTCP数据包的定义:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X|  CC   |M|     PT      |       sequence number         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           timestamp                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           synchronization source (SSRC) identifier            |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|            contributing source (CSRC) identifiers             |
|                             ....                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

我不会重现以上所有内容的传说 - 它很长 - 但请看Section 5.1

有了这些,您将看到您无法确定 数据包是否包含RTP / RTCP。最重要的是,正如其他海报所建议的那样,嗅闻媒体流谈判。第二好的将是在一系列分组上的某种模式匹配:前两个比特将是10,接着是接下来的两个比特是恒定的,接着是比特9到15是恒定的,然后是16 - > 31递增,依此类推。

答案 1 :(得分:2)

我会看看Wireshark中的数据包检测器,它可以解码大多数常用协议。

答案 2 :(得分:0)

我认为您需要查看RTP数据包之前的SIP数据包。

a discussion on this issue on Pcap.Net site

答案 3 :(得分:0)

如果通过RTSP完成通信,请查看在SETUP上协商的udp端口。

udp端口会告诉你它是RTP还是RTCP(还值得注意的是RTP通常是通过偶数端口号完成的,RTCP是奇数)。

最后,如果您通过RTSP进行通信,则可以从DESCRIBE中获取SDP文件中的有效负载编号列表,然后检查RTP头中的有效负载类型,以告知编解码器需要解码有效负载。