2010-05-26 13 views
9

Ich verwende SharpPCap, das auf WinPCap gebaut wird, um UDP-Verkehr zu erfassen. Mein Endziel ist, die Audiodaten von H.323 zu erfassen und diese Telefongespräche als WAV-Dateien zu speichern. Aber zuerst ist das erste - ich muss herausfinden, was meine UDP-Pakete die NIC kreuzen.Wie kann ich feststellen, ob ein Paket RTP/RTCP ist?

SharpPCap bietet eine UdpPacket-Klasse, die mir Zugriff auf die PayloadData der Nachricht ermöglicht. Aber ich bin mir nicht sicher, was ich mit diesen Daten mache. Es ist ein Array von Byte [] und ich weiß nicht, wie ich herausfinden soll, ob es ein RTP- oder RTCP-Paket ist.

Ich habe dieses Thema gegooglet, aber es gibt nicht viel da draußen. Jede Hilfe wird geschätzt.

Antwort

4

Schauen Sie sich die Definitionen für RTP und RTCP-Pakete in 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    | 
|        ....        | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

Ich werde nicht die Legende für alle der oben genannten reproduzieren - es ist ziemlich lang - aber einen Blick auf Section 5.1 nehmen.

Mit diesem in der Hand werden Sie sehen, es gibt nicht viel, was Sie tun können, um festzustellen, ob ein Paket enthält RTP/RTCP. Am besten wäre es, die Medien-Stream-Verhandlung zu schnüffeln, wie andere Poster angedeutet haben. Zweitbeste wäre eine Musterübereinstimmung über eine Sequenz von Paketen: die ersten zwei Bits werden 10 sein, gefolgt von den nächsten zwei Bits, die konstant sind, gefolgt von den Bits 9 bis 15, die konstant sind, dann 16 -> 31 Inkrementieren und bald.

+0

Danke Frank. Wie sich herausstellt, reicht es aus, die Bytes im RTP-Header zu prüfen und im Grunde nach der Version und dem Payload-Typ zu suchen, um festzustellen, ob es sich um ein RTP-Paket handelt. Zumindest habe ich bisher keine anderen Pakete im Netzwerk gefunden, die dieselben ersten Bits haben. Auf der Suche nach und dann der SSRC war genug, um herauszufinden, welche Pakete RTP waren. Aber ich habe meinen Arbeitsplatz gewechselt und muss mich nicht um den Rest des Problems kümmern, also bekommst du das Häkchen! –

2

Ich würde die Paketdetektoren in Wireshark betrachten, die die meisten gängigen Protokolle entschlüsseln können.

+0

Ich schätze den Aufwand Theatrus, aber es beantwortet nicht wirklich meine Frage. Ich bin wirklich mehr am theoretischen Wissen der Paketstruktur interessiert, damit ich verstehen kann, wie ich das Problem lösen kann. Wie stellt man fest, dass ein UDP-Paket tatsächlich ein RTP- oder RTCP-Paket ist? Ich kann nichts im UDP-Header finden, der dabei hilft. –

+0

Nichts im UDP-Header unterscheidet Sie von der Portnummer. Sie müssen einen Mustervergleich für die Paketdaten durchführen. –

+0

Ich denke, ich fange an herauszufinden, dass es viel mehr zu diesem Rätsel gibt, als man sieht. Wir versuchen, Datenverkehr vom H.323-Protokoll zu erkennen, und was ich lese, ist, dass es auch eine Vielzahl von TCP-Ports verwendet, um die Kommunikation einzurichten, bevor der RTP-Verkehr überhaupt beginnt. Bis jetzt habe ich wenig Glück dabei, gute Informationen darüber zu finden, wie man diesen Verkehr erfassen kann. –

0

Ich glaube, Sie müssen sich die SIP-Pakete ansehen, die vor den RTP-Paketen kommen.

Es gibt a discussion on this issue on Pcap.Net site.

+0

Dank Brickner. Wir betrachten H.323-Verkehr statt SIP, so dass sich die Dinge ein wenig ändern. Es sieht an diesem Punkt ziemlich kompliziert aus. –

0

Wenn Kommunikationen über RTSP ausgeführt werden, sehen Sie sich den UDP-Port an, der beim SETUP ausgehandelt wird.

der UDP-Port wird Ihnen sagen, ob es RTP oder RTCP ist (auch erwähnenswert, dass RTP normalerweise über gerade Port-Nummern und RTCP über ungerade erfolgt). Wenn Sie über RTSP kommunizieren, können Sie die Liste der Payload-Nummern aus der SDP-Datei von DESCRIBE nehmen und dann den Payload-Typ im RTP-Header überprüfen, um den Codec zu bestimmen, den Sie zum Entschlüsseln der Payload benötigen.

Verwandte Themen