2010-05-26 69 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標頭中的有效載荷類型以告知您需要解碼有效載荷的編解碼器。