2010-05-26 14 views
9

Sto usando SharpPCap che è costruito su WinPCap per catturare il traffico UDP. Il mio obiettivo finale è quello di acquisire i dati audio da H.323 e salvare quelle conversazioni telefoniche come file WAV. Ma la prima cosa è la prima: ho bisogno di capire quali sono i miei pacchetti UDP che stanno attraversando la NIC.Come determinare se un pacchetto è RTP/RTCP?

SharpPCap fornisce una classe UdpPacket che mi consente di accedere a PayloadData del messaggio. Ma non sono sicuro di cosa fare con questi dati. È un array Byte [] e non so come determinare se si tratta di un pacchetto RTP o RTCP.

Ho cercato su Google questo argomento ma non c'è molto là fuori. Qualsiasi aiuto è apprezzato.

risposta

4

Guarda le definizioni per pacchetti RTP e RTCP 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    | 
|        ....        | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

io non riprodurre la leggenda per tutto quanto sopra - è piuttosto lungo - ma dare un'occhiata a Section 5.1.

Con quello in mano vedrai che non c'è molto che puoi fare per determinare se il pacchetto a contiene RTP/RTCP. La cosa migliore sarebbe sniffare, come hanno suggerito altri poster, la negoziazione dei flussi multimediali. Il secondo migliore sarebbe un certo tipo di pattern matching su una sequenza di pacchetti: i primi due bit saranno 10, seguiti dai due bit successivi che sono costanti, seguiti dai bit da 9 a 15 che sono costanti, quindi 16 -> 31 incrementali, e presto.

+0

Grazie Frank. Come risulta, controllare i byte nell'intestazione RTP e verificare fondamentalmente la versione e il tipo di payload sono sufficienti per determinare se si tratta di un pacchetto RTP. Almeno finora non ho trovato nessun altro pacchetto sulla rete che abbia gli stessi primi bit. Cercando quello e quindi il SSRC era abbastanza per capire quali pacchetti erano RTP. Ma, ho cambiato lavoro e non devo preoccuparmi del resto di questo problema, quindi ottieni il segno di spunta! –

2

Guarderei i rilevatori di pacchetti in Wireshark, che possono decodificare i protocolli più comuni disponibili.

+0

Apprezzo lo sforzo teatrale, ma in realtà non risponde alla mia domanda. Sono molto più interessato alla conoscenza teorica della struttura dei pacchetti, così posso capire come risolvere il problema. Come si determina un pacchetto UDP è in realtà un pacchetto RTP o RTCP? Non riesco a trovare nulla nell'intestazione UDP che aiuti con questo. –

+0

Nulla nell'intestazione UDP ti dirà oltre al numero di porta. È necessario eseguire la corrispondenza del modello sui dati del pacchetto. –

+0

Penso che sto iniziando a capire che c'è molto di più in questo puzzle di quanto non sembri. Stiamo provando a rilevare il traffico dal protocollo H.323 e quello che sto leggendo è che utilizza anche una serie di porte TCP per impostare la comunicazione prima che il traffico RTP inizi anche. Finora ho avuto poca fortuna nel trovare buone informazioni su come fare per catturare questo traffico però. –

0

Credo che sia necessario esaminare i pacchetti SIP che precedono i pacchetti RTP.

C'è a discussion on this issue on Pcap.Net site.

+0

Grazie brickner. Stiamo esaminando il traffico H.323 anziché SIP, in modo che le cose cambino un po '. Sembra piuttosto complicato a questo punto. –

0

Se le comunicazioni vengono eseguite su RTSP, osservare la porta udp negoziata su SETUP.

la porta udp ti dirà se si tratta di RTP o RTCP (vale anche la pena notare che RTP viene solitamente eseguito su numeri di porta pari e RTCP su dispari).

infine se si sta comunicando tramite RTSP è possibile prendere l'elenco dei numeri di payload dal file SDP dal DESCRIBE e quindi controllare il tipo di payload nell'intestazione RTP per indicare al codec che è necessario decodificare il payload.

Problemi correlati