c# - protocolo - ¿Cómo determino si un paquete es RTP/RTCP?
rtp over udp (4)
Me gustaría ver los detectores de paquetes en Wireshark, que puede decodificar la mayoría de los protocolos comunes disponibles.
Estoy usando SharpPCap, que se basa 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.
SharpPCap proporciona una clase UdpPacket que me da acceso a 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.
Creo que debes mirar los paquetes SIP que vienen antes de los paquetes RTP.
Mira las definiciones de 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 |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
No reproduciré la leyenda de todo lo anterior, es bastante larga, pero consulte la Sección 5.1 .
Con eso en 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.
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 desde DESCRIBE y luego verificar el tipo de carga útil en el encabezado RTP para indicarle al códec que necesita decodificar la carga útil.