2010-05-26 21 views
9

我使用建立在WinPCap上的SharpPCap来捕获UDP流量。我的最终目标是捕捉来自H.323的音频数据并将这些电话会话保存为WAV文件。但首先是首先 - 我需要弄清楚我的UDP数据包是通过网卡的。如何确定数据包是否为RTP/RTCP?

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

我已经Google了这个主题,但没有那么多。任何帮助表示赞赏。

回答

4

看看在RTP和RTCP包的定义在RFC 3550

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递增,以及等等。

+0

谢谢弗兰克。事实证明,检查RTP头中的字节并基本检查版本和有效负载类型足以确定它是否是RTP数据包。至少到目前为止,我还没有在网络上找到其他具有相同前几位的数据包。 寻找那个,然后SSRC足以找出哪些数据包是RTP。但是,我换了工作,不必担心这个问题的其余部分,所以你会得到复选标记! – 2010-07-16 18:18:03

2

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

+0

我很欣赏这种努力,但它并没有真正回答我的问题。我对分组结构的理论知识更感兴趣,所以我可以理解如何解决这个问题。如何确定一个UDP数据包实际上是一个RTP或RTCP数据包?我无法在UDP头中找到任何帮助解决这个问题的东西。 – 2010-05-27 21:41:57

+0

UDP标头中的任何内容都不会告诉您与端口号分开。您需要对分组数据执行模式匹配。 – 2010-05-28 05:20:36

+0

我想我已经开始发现,这个难题还有很多不足之处。我们试图检测来自H.323协议的流量,并且我正在阅读的是它使用多个TCP端口来在RTP流量开始之前设置通信。到目前为止,我在寻找关于如何捕获这种流量的好信息方面运气不多。 – 2010-06-02 15:26:56

0

我相信你需要看看RTP包之前的SIP包。

a discussion on this issue on Pcap.Net site

+0

感谢砖头。我们正在研究H.323流量而不是SIP,所以这一点改变了一些。这一点看起来相当复杂。 – 2010-06-02 15:27:22

0

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

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

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