2010-05-26 29 views
9

J'utilise SharpPCap qui est construit sur WinPCap pour capturer le trafic UDP. Mon objectif final est de capturer les données audio de H.323 et de sauvegarder ces conversations téléphoniques en tant que fichiers WAV. Mais la première chose à faire est d'abord - j'ai besoin de savoir quels sont mes paquets UDP traversant le NIC.Comment déterminer si un paquet est RTP/RTCP?

SharpPCap fournit une classe UdpPacket qui me donne accès à la propriété PayloadData du message. Mais je ne sais pas quoi faire avec ces données. C'est un tableau Byte [] et je ne sais pas comment déterminer s'il s'agit d'un paquet RTP ou RTCP. J'ai cherché sur Google ce sujet, mais il n'y a pas beaucoup de choses là-bas. Toute aide est appréciée.

Répondre

4

Regardez les définitions pour les paquets RTP et RTCP dans 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    | 
|        ....        | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

Je ne reproduirai pas la légende de ce qui précède - il est assez long - mais jetez un oeil à Section 5.1. Avec cela en main, vous verrez qu'il n'y a pas beaucoup que vous pouvez faire pour déterminer si un paquet contient RTP/RTCP. Le meilleur de tous serait de renifler, comme d'autres affiches l'ont suggéré, la négociation des flux de médias. Le deuxième meilleur serait un motif de tri correspondant sur une séquence de paquets: les deux premiers bits seront 10, suivis par les deux bits suivants étant constants, suivis par les bits 9 à 15 étant constants, puis 16 -> 31 incrémentant, et bientôt.

+0

Merci Frank. Comme il s'avère, vérifier les octets dans l'en-tête RTP et vérifier essentiellement la version et le type de charge utile sont assez pour déterminer s'il s'agit d'un paquet RTP. Au moins jusqu'à présent, je n'ai trouvé aucun autre paquet sur le réseau qui a les mêmes premiers bits. À la recherche de cela, puis le SSRC était suffisant pour déterminer quels paquets étaient RTP. Mais, j'ai changé d'emploi et je n'ai pas à m'inquiéter du reste de ce problème, alors vous obtenez la coche! –

2

Je regarderais les détecteurs de paquets dans Wireshark, qui peuvent décoder les protocoles les plus communs disponibles.

+0

J'apprécie l'effort, mais cela ne répond pas vraiment à ma question. Je suis vraiment plus intéressé par les connaissances théoriques de la structure des paquets, donc je peux comprendre comment résoudre le problème. Comment déterminer qu'un paquet UDP est réellement un paquet RTP ou RTCP? Je ne trouve rien dans l'en-tête UDP qui aide à cela. –

+0

Rien dans l'en-tête UDP ne vous indiquera en dehors du numéro de port. Vous devez effectuer une correspondance de modèle sur les données de paquet. –

+0

Je pense que je commence à comprendre qu'il y a beaucoup plus à ce casse-tête. Nous essayons de détecter le trafic provenant du protocole H.323, et ce que je lis, c'est qu'il utilise aussi un certain nombre de ports TCP pour configurer la communication avant même que le trafic RTP ne commence. Jusqu'à présent, j'ai peu de chance de trouver de bonnes informations sur la façon de capturer ce trafic. –

0

Je crois que vous devez regarder les paquets SIP qui viennent avant les paquets RTP.

Il existe a discussion on this issue on Pcap.Net site.

+0

Merci maçon. Nous examinons le trafic H.323 au lieu de SIP, ce qui change un peu les choses. Il semble plutôt compliqué à ce stade. –

0

Si les communications sont effectuées via RTSP, jetez un coup d'œil au port udp négocié lors de la configuration. Le port udp vous dira s'il s'agit de RTP ou de RTCP (il convient également de noter que RTP est généralement effectué sur des numéros de port pairs et RTCP sur impair). Enfin, si vous communiquez via RTSP, vous pouvez prendre la liste des numéros de charge utile du fichier SDP depuis DESCRIBE, puis vérifier le type de charge utile dans l'en-tête RTP pour indiquer au codec que vous devez décoder la charge utile.