Wir erforschen die VoIP-Engine Mediastreamer2. Teil 8

Der Artikelinhalt stammt von meinem Zen-Kanal.

Wir erforschen die VoIP-Engine Mediastreamer2. Teil 8

Die Struktur des RTP-Pakets

Letzte Woche Artikel Wir haben mithilfe von TShark die Erfassung von RTP-Paketen durchgefĂŒhrt, die zwischen unserem EmpfĂ€nger und Sender ausgetauscht wurden. In diesem Abschnitt werden wir die Elemente des Pakets in verschiedenen Farben darstellen und ĂŒber ihre Funktion sprechen.

Schauen wir uns dasselbe Paket an, jedoch mit hervorgehobenen Feldern und erlÀuternden Beschriftungen:
Wir erforschen die VoIP-Engine Mediastreamer2. Teil 8

Im unteren Teil des Listings sind die Bytes farblich hervorgehoben, die das RTP-Paket bilden, welches wiederum die Nutzlast des UDP-Pakets ist (seine Kopfzeile ist durch eine schwarze Linie umrahmt). Die RTP-Header-Bytes sind durch farbige HintergrĂŒnde gekennzeichnet, wĂ€hrend der Datenblock, der die Nutzlast des RTP-Pakets enthĂ€lt, grĂŒn hervorgehoben ist. Die Daten sind dort im hexadezimalen Format dargestellt. In unserem Fall handelt es sich um ein Audiosignal, das gemĂ€ĂŸ u-law (MĂŒ-law) komprimiert wurde, d.h. ein Sample hat eine GrĂ¶ĂŸe von 1 Byte. Da wir die standardmĂ€ĂŸig festgelegte Abtastrate von 8000 Hz verwendet haben, muss jedes RTP-Paket bei einer Paketfrequenz von 50 Hz 160 Byte Nutzlast enthalten. Das sehen wir, wenn wir die Bytes im grĂŒnen Bereich zĂ€hlen; es sollten 10 Zeilen erscheinen.

Laut Standard muss die Menge an Daten in der Nutzlast ein Vielfaches von vier sein oder anders gesagt, sie muss eine ganze Anzahl von vier Byte-Wörtern enthalten. Sollte es vorkommen, dass Ihre Nutzlast dieser Regel nicht entspricht, mĂŒssen am Ende der Nutzlast Bytes mit nullen Werten hinzugefĂŒgt werden, und das Padding-Bit (Zusatz) muss gesetzt werden. Dieses Bit befindet sich im ersten Byte des RTP-Headers und ist tĂŒrkisfarben hervorgehoben. Beachten Sie, dass alle Bytes der Nutzlast den Wert 0xFF haben - so sieht Stille im u-law-Format aus.

Der RTP-Paketkopf besteht aus 12 obligatorischen Bytes, kann jedoch in zwei FÀllen lÀnger sein:

  • Wenn das Paket ein Audiosignal enthĂ€lt, das durch Mischen von Signalen aus mehreren Quellen (RTP-Streams) erhalten wurde, wird nach den ersten 12 Bytes des Headers eine Tabelle mit einer Liste von Identifikationsnummern der Quellen angeordnet, deren Nutzlasten zur Erstellung der Nutzlast dieses Pakets verwendet wurden. Dabei sind die vier niedrigsten Bits des ersten Bytes des Headers (Feld Anzahl der beitragenden Quellenidentifikatoren) wird die Anzahl der Quellen angegeben. Die FeldgrĂ¶ĂŸe betrĂ€gt 4 Bit, entsprechend kann die Tabelle bis zu 15 Quellen-IDs enthalten. Jede davon belegt 4 Byte. Diese Tabelle wird bei der Organisation von KonferenzgesprĂ€chen verwendet.

  • Wenn der Header eine Erweiterung hat. In diesem Fall wird im ersten Byte des Headers ein Bit gesetzt X. Im erweiterten Header befindet sich nach der Teilnehmerliste (falls vorhanden) der Erweiterungsheader mit der GrĂ¶ĂŸe eines Wortes, gefolgt von den Erweiterungswörtern. Die Erweiterung ist eine Menge von Bytes, die Sie verwenden können, um zusĂ€tzliche Daten zu ĂŒbertragen. Der Standard spezifiziert das Format dieser Daten nicht – es kann beliebig sein. Zum Beispiel können dies zusĂ€tzliche Einstellungen fĂŒr das GerĂ€t sein, das RTP-Pakete empfĂ€ngt. FĂŒr einige Anwendungen wurden jedoch Standards fĂŒr den erweiterten Header entwickelt. So wurde es beispielsweise fĂŒr Kommunikationsmittel im Standard ED-137 (InteroperabilitĂ€tsstandards fĂŒr VoIP-ATM-Komponenten).

Lassen Sie uns die Headerfelder nun detaillierter betrachten. Unten sehen Sie eine kanonische Darstellung der RTP-Headerstruktur, die ich ebenfalls farbig gestaltet habe.

Wir erforschen die VoIP-Engine Mediastreamer2. Teil 8
VER — Versionsnummer des Protokolls (aktuelle Version 2);

P — ein Flag, das gesetzt wird, wenn das RTP-Paket mit leeren Bytes am Ende ergĂ€nzt wird;

X — ein Flag, das angibt, dass der Header erweitert ist;

CC — enthĂ€lt die Anzahl der CSRC-IDs, die nach dem konstanten Header folgen (nach den Wörtern 1..3), die Tabelle ist in der Abbildung nicht dargestellt;

M — Marker fĂŒr den Beginn eines Frames oder das Vorhandensein von Sprache im Kanal (falls ein Spracherkennungssystem verwendet wird). Wenn der EmpfĂ€nger keinen Spracherkennungssystem hat, sollte dieses Bit stĂ€ndig gesetzt sein;

PTYPE — gibt das Format der Nutzlast an;

Sequenznummer — Paketnummer, die zur Wiederherstellung der Wiedergabe-Reihenfolge der Pakete verwendet wird, da in der RealitĂ€t Pakete den EmpfĂ€nger nicht in der Reihenfolge erreichen, in der sie gesendet wurden. Der Anfangswert sollte zufĂ€llig sein, um das Knacken des verschlĂŒsselten RTP-Streams zu erschweren. Dieses Feld ermöglicht auch die Erkennung von Paketverlusten;

Zeitstempel — Zeitstempel. Die Zeit wird in Signalproben gemessen, d.h. wenn ein Paket 160 Proben enthĂ€lt, wird der Zeitstempel des nĂ€chsten Pakets um 160 erhöht. Der Anfangswert des Zeitstempels sollte zufĂ€llig sein;

SSRC — der Identifikator des Paketquellen, der einzigartig sein muss. Es ist besser, ihn zufĂ€llig zu generieren, bevor der RTP-Stream gestartet wird.

Wenn Sie Ihren eigenen Sender oder EmpfĂ€nger von RTP-Paketen entwickeln, werden Sie oft Ihre Pakete ĂŒberprĂŒfen mĂŒssen. Um die Effizienz zu steigern, empfehle ich Ihnen, die Verwendung von Paketfiltern in TShark zu erlernen, da dies ermöglicht, nur die Pakete zu erfassen, die fĂŒr Sie von Interesse sind. In Umgebungen, in denen Dutzende RTP-GerĂ€te im Netzwerk arbeiten, ist das von großem Wert. In der TShark-Befehlszeile werden die Filterparameter mit der Option "-f" festgelegt. Wir haben diese Option genutzt, als wir Pakete vom Port 8010 erfassen wollten:
-f "udp port 8010"
Die Filterparameter sind im Grunde genommen eine Sammlung von Kriterien, die das "erfasste" Paket erfĂŒllen muss. Die Bedingung kann die Adresse, den Port, den Wert eines bestimmten Bytes im Paket ĂŒberprĂŒfen. Bedingungen können mit logischen Operationen wie "UND", "ODER" usw. kombiniert werden. Ein sehr leistungsfĂ€higes Werkzeug.

Wenn Sie die Dynamik der VerĂ€nderung von Feldern in Paketen beobachten möchten, mĂŒssen Sie die Ausgabe TShark in eine Datei duplizieren, wie es im letzten Artikel gezeigt wurde, indem Sie die Ausgabe TShark an den Eingang tee. Danach, wenn Sie die Logdatei mit less, vim oder einem anderen Tool, das schnell mit großen Textdateien arbeiten und Zeilen durchsuchen kann, öffnen, können Sie alle Nuancen des Verhaltens der Paketfelder im RTP-Stream herausfinden.

Wenn Sie das Signal, das durch den RTP-Stream ĂŒbertragen wird, abhören mĂŒssen, sollten Sie die Version TShark mit einer grafischen BenutzeroberflĂ€che Wireshark. Durch einige einfache Mausklicks können Sie den Signalton anhören und das Oszilloskop-Signal sehen. Aber nur unter der Bedingung, dass es im Format u-law oder a-law kodiert ist.

Im nÀchsten Artikel werden wir zusammen ein duplexes KommunikationsgerÀt erstellen. Besorgen Sie sich ein Paar Headsets und einen GesprÀchspartner.

Quelle: habr.com

60GB SSD 8Gb DDR4