2010-05-26 20 views
9

Estoy utilizando SharpPCap que está construido en WinPCap para capturar el tráfico UDP. Mi objetivo final es capturar los datos de audio de H.323 y guardar esas conversaciones telefónicas como archivos WAV. Pero lo primero es lo primero: necesito descubrir cuáles son mis paquetes UDP cruzando la NIC.¿Cómo puedo determinar si un paquete es RTP/RTCP?

SharpPCap proporciona una clase UdpPacket que me da acceso al PayloadData del mensaje. Pero no estoy seguro de qué hacer con esta información. Es una matriz Byte [] y no sé cómo determinar si se trata de un paquete RTP o RTCP.

He buscado en Google este tema, pero no hay mucho por ahí. Cualquier ayuda es apreciada.

Respuesta

4

mirada a las definiciones de los paquetes RTP y RTCP en 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    | 
|        ....        | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

que no reproducir la leyenda de todo lo anterior - es bastante larga - pero echar un vistazo a Section 5.1.

Con eso en la mano verá que no hay mucho que pueda hacer para determinar si un paquete contiene RTP/RTCP. Lo mejor de todo sería olfatear, como han sugerido otros carteles, la negociación de la corriente de medios. El segundo mejor sería algún tipo de coincidencia de patrón sobre una secuencia de paquetes: los primeros dos bits serán 10, seguidos de los siguientes dos bits siendo constantes, seguidos por los bits 9 a 15 que son constantes, luego 16 -> 31 incrementando, y pronto.

+0

Gracias Frank. Como resultado, comprobar los bytes en el encabezado RTP y verificar básicamente la versión y el tipo de carga útil son suficientes para determinar si se trata de un paquete RTP. Al menos hasta ahora, no he encontrado ningún otro paquete en la red que tenga los mismos primeros bits. Buscando eso y luego el SSRC fue suficiente para averiguar qué paquetes eran RTP. Pero cambié de trabajo y no tengo que preocuparme por el resto de este problema, ¡así que obtienes la marca de verificación! –

2

Me gustaría ver los detectores de paquetes en Wireshark, que pueden decodificar la mayoría de los protocolos comunes disponibles.

+0

Aprecio el esfuerzo, pero en realidad no responde mi pregunta. Estoy realmente más interesado en el conocimiento teórico de la estructura de paquetes para poder entender cómo resolver el problema. ¿Cómo se determina que un paquete UDP es en realidad un paquete RTP o RTCP? No puedo encontrar nada en el encabezado UDP que ayude con esto. –

+0

Nada en el encabezado UDP le indicará aparte del número de puerto. Debe realizar la coincidencia de patrones en los datos del paquete. –

+0

Creo que estoy empezando a darme cuenta de que hay mucho más en este rompecabezas de lo que parece. Estamos tratando de detectar el tráfico del protocolo H.323, y lo que estoy leyendo es que también usa una gran cantidad de puertos TCP para configurar la comunicación antes de que comience el tráfico RTP. Hasta ahora, tengo poca suerte en encontrar buena información acerca de cómo capturar este tráfico. –

0

Creo que necesita ver los paquetes SIP que vienen antes de los paquetes RTP.

Hay a discussion on this issue on Pcap.Net site.

+0

Gracias brickner. Estamos viendo el tráfico H.323 en lugar de SIP, por lo que cambia un poco las cosas. Se ve bastante complicado en este punto. –

0

Si las comunicaciones se realizan a través de RTSP, eche un vistazo al puerto udp que se negocia con SETUP.

el puerto udp le dirá si es RTP o RTCP (también vale la pena señalar que RTP generalmente se realiza en números pares de puerto y RTCP en impar).

Finalmente, si se está comunicando a través de RTSP puede tomar la lista de números de carga del archivo SDP DESCRIBE y luego verificar el tipo de carga en el encabezado RTP para indicarle al códec que necesita decodificar la carga útil.

Cuestiones relacionadas