Entdecken Sie die VoIP-Engine von Mediastreamer2. Teil 8

Das Material des Artikels stammt von mir Zen-Kanal.

Entdecken Sie die VoIP-Engine von Mediastreamer2. Teil 8

RTP-Paketstruktur

In der Vergangenheit Artikel wir benutzen TShark führte die Erfassung von RTP-Paketen durch, die zwischen unserem Empfänger und Sender ausgetauscht wurden. Nun, in diesem Fall bemalen wir die Elemente der Verpackung in verschiedenen Farben und sprechen über ihren Zweck.

Werfen wir einen Blick auf dasselbe Paket, jedoch mit farbigen Rändern und erklärenden Etiketten:
Entdecken Sie die VoIP-Engine von Mediastreamer2. Teil 8

Unten in der Liste sind die Bytes, aus denen das RTP-Paket besteht, eingefärbt, und dies wiederum ist die Nutzlast des UDP-Pakets (sein Header ist schwarz eingekreist). Die farbigen Hintergründe zeigen die Bytes des RTP-Headers an und der Datenblock, der die Nutzlast des RTP-Pakets enthält, wird grün hervorgehoben. Die Daten werden im Hexadezimalformat dargestellt. In unserem Fall handelt es sich um ein nach dem u-law (mu-law) komprimiertes Audiosignal, also Ein Sample hat eine Größe von 1 Byte. Da wir die Standard-Abtastrate (8000 Hz) mit einer Paketrate von 50 Hz verwendet haben, sollte jedes RTP-Paket 160 Byte Nutzlast enthalten. Wir werden dies sehen, indem wir die Bytes im grünen Bereich zählen, es sollten 10 Zeilen davon sein.

Gemäß dem Standard muss die Datenmenge in der Nutzlast ein Vielfaches von vier sein, d. h. sie muss eine ganzzahlige Anzahl von Vier-Byte-Worten enthalten. Wenn Ihre Nutzlast nicht dieser Regel entspricht, müssen Sie am Ende der Nutzlast Bytes mit dem Wert Null hinzufügen und das Padding-Bit setzen. Dieses Bit befindet sich im ersten Byte des RTP-Headers und ist türkis gefärbt. Beachten Sie, dass alle Nutzlastbytes 0xFF sind, was der U-Law-Stille entspricht.

Der RTP-Paket-Header besteht aus 12 obligatorischen Bytes, kann aber in zwei Fällen länger sein:

  • Wenn ein Paket ein Audiosignal trägt, das durch Mischen von Signalen aus mehreren Quellen (RTP-Streams) gewonnen wird, gibt es nach den ersten 12 Bytes des Headers eine Tabelle mit einer Liste von Quellenkennungen, deren Nutzlasten zur Erstellung der Nutzlast dieses Pakets verwendet wurden. In diesem Fall werden in den unteren vier Bits des ersten Bytes des Headers (field Anzahl der beitragenden Quellkennungen) gibt die Anzahl der Quellen an. Die Feldgröße beträgt 4 Bit, sodass die Tabelle bis zu 15 Quellkennungen enthalten kann. Jeder davon belegt 4 Bytes. Diese Tabelle wird beim Einrichten einer Telefonkonferenz verwendet.

  • Wenn der Titel die Erweiterung hat. In diesem Fall wird das Bit im ersten Byte des Headers gesetzt X. Im erweiterten Header gibt es nach der Teilnehmertabelle (falls vorhanden) einen aus einem Wort bestehenden Erweiterungsheader, gefolgt von den Erweiterungswörtern. Eine Erweiterung ist eine Sammlung von Bytes, die Sie zum Übertragen zusätzlicher Daten verwenden können. Der Standard schreibt das Format dieser Daten nicht vor – es kann alles sein. Beispielsweise kann es sich um einige zusätzliche Einstellungen für das Gerät handeln, das RTP-Pakete empfängt. Für einige Anwendungen wurden jedoch erweiterte Header-Standards entwickelt. Dies geschieht beispielsweise für die Kommunikation im Standard ED-137 (Interoperabilitätsstandards für VoIP-ATM-Komponenten).

Schauen wir uns nun die Header-Felder genauer an. Unten ist ein kanonisches Bild mit der Struktur des RTP-Headers, dem ich ebenfalls nicht widerstehen konnte und das ich in den gleichen Farben gemalt habe.

Entdecken Sie die VoIP-Engine von Mediastreamer2. Teil 8
VER — Protokollversionsnummer (aktuelle Version 2);

P - ein Flag, das in Fällen gesetzt wird, in denen das RTP-Paket am Ende durch leere Bytes ergänzt wird;

X - Flag, dass der Header erweitert ist;

CC — enthält die Anzahl der CSRC-Identifikatoren nach dem Konstantenheader (nach den Wörtern 1..3), die Tabelle ist in der Abbildung nicht dargestellt;

M — Markierung des Anfangs eines Frames oder des Vorhandenseins von Sprache im Kanal (wenn ein Sprachpausendetektor verwendet wird). Wenn der Empfänger keinen Sprachpausendetektor enthält, muss dieses Bit dauerhaft gesetzt sein;

PTYP – gibt das Format der Nutzlast an;

Sequenznummer - Paketnummer, wird verwendet, um die Reihenfolge wiederherzustellen, in der Pakete abgespielt werden, da die reale Situation darin besteht, dass Pakete den Empfänger in der falschen Reihenfolge erreichen können, in der sie gesendet wurden. Der Anfangswert muss zufällig sein. Dies geschieht, damit es schwierig ist, den RTP-Stream zu hacken, wenn er verschlüsselt ist. Außerdem können Sie in diesem Feld verpasste Pakete erkennen.

Timestamp - Zeitstempel. Die Zeit wird in Signalabtastungen gemessen, d. h. Wenn ein Burst 160 Samples enthält, beträgt der Zeitstempel des nächsten Bursts 160 weitere. Der Anfangswert des Zeitstempels muss zufällig sein;

SSRC — Kennung der Paketquelle, sie muss eindeutig sein. Es ist besser, es zufällig zu generieren, bevor der RTP-Stream gestartet wird.

Wenn Sie Ihren eigenen RTP-Sender oder -Empfänger entwickeln, müssen Sie Ihre Pakete mehr als einmal überprüfen, um die Produktivität zu steigern. Ich empfehle Ihnen, die Verwendung der Paketfilterung in TShark zu erlernen, damit Sie nur die Pakete erfassen können, die von sind Interesse für Sie. In einer Umgebung, in der Dutzende von RTP-Geräten im Netzwerk betrieben werden, ist dies sehr wertvoll. In der TShark-Befehlszeile werden Filteroptionen mit der Option „-f“ angegeben. Wir haben diese Option verwendet, als wir Pakete von Port 8010 erfassen wollten:
-f "udp port 8010"
Filterparameter sind im Wesentlichen eine Reihe von Kriterien, die ein „abgefangenes“ Paket erfüllen muss. Die Bedingung kann die Adresse, den Port und den Wert eines bestimmten Bytes im Paket überprüfen. Bedingungen können mit logischen Operationen „AND“, „OR“ usw. kombiniert werden. Ein sehr mächtiges Werkzeug.

Wenn Sie die Dynamik von Feldänderungen in Stapeln anzeigen möchten, müssen Sie die Ausgabe duplizieren TShark in eine Datei konvertieren, wie im letzten Artikel gezeigt, indem die Ausgabe übergeben wird TShark am Eingang Abschlag. Als nächstes öffnen Sie die Protokolldatei mit weniger, vim oder einem anderen Tool, das schnell mit großen Textdateien arbeiten und nach Zeichenfolgen suchen kann, können Sie alle Nuancen des Verhaltens von Paketfeldern in einem RTP-Stream herausfinden.

Wenn Sie das vom RTP-Stream übertragene Signal abhören müssen, müssen Sie die Version verwenden TShark mit visueller Schnittstelle Wireshark. Mit einfachen Mausmanipulationen können Sie die Wellenform des Signals hören und sehen. Aber unter einer Bedingung – wenn es im U-Law- oder A-Low-Format kodiert ist.

Nächste Artikel Wir bauen mit Ihnen eine Duplex-Gegensprechanlage. Besorgen Sie sich ein Paar Headsets und einen Gesprächspartner.

Source: habr.com

Kommentar hinzufügen