De Mediastreamer2 VoIP-engine verkennen. Deel 8

Het materiaal van het artikel is afkomstig uit mijn zen-kanaal.

De Mediastreamer2 VoIP-engine verkennen. Deel 8

RTP-pakketstructuur

In het verleden ΡΡ‚Π°Ρ‚ΡŒΠ΅ wij gebruiken TSaai voerde de opname uit van RTP-pakketten die werden uitgewisseld tussen onze ontvanger en zender. Welnu, in deze zullen we de elementen van het pakket in verschillende kleuren schilderen en praten over hun doel.

Laten we hetzelfde pakket bekijken, maar met gekleurde marges en verklarende labels:
De Mediastreamer2 VoIP-engine verkennen. Deel 8

Onderaan de lijst zijn de bytes waaruit het RTP-pakket bestaat getint, en dit is op zijn beurt de payload van het UDP-pakket (de kop ervan is zwart omcirkeld). De gekleurde achtergronden geven de bytes van de RTP-header aan en het datablok dat de payload van het RTP-pakket bevat, is groen gemarkeerd. De gegevens worden gepresenteerd in hexadecimaal formaat. In ons geval is dit een audiosignaal gecomprimeerd volgens de u-wet (mu-wet), d.w.z. één sample heeft een grootte van 1 byte. Aangezien we de standaard bemonsteringsfrequentie (8000 Hz) hebben gebruikt, met een pakketsnelheid van 50 Hz, zou elk RTP-pakket 160 bytes aan nuttige lading moeten bevatten. We zullen dit zien door de bytes in het groene gebied te tellen, er zouden 10 regels van moeten zijn.

Volgens de norm moet de hoeveelheid data in de payload een veelvoud van vier zijn, met andere woorden, het moet een geheel aantal woorden van vier bytes bevatten. Als het gebeurt dat uw payload niet overeenkomt met deze regel, dan moet u bytes met een waarde van nul toevoegen aan het einde van de payload en de Padding-bit instellen. Deze bit bevindt zich in de eerste byte van de RTP-header en is turkoois gekleurd. Merk op dat alle payload-bytes 0xFF zijn, en zo ziet u-law stilte eruit.

De RTP-pakketkop bestaat uit 12 verplichte bytes, maar kan in twee gevallen langer zijn:

  • Wanneer een pakket een audiosignaal bevat dat is verkregen door signalen van verschillende bronnen (RTP-streams) te mixen, dan is er na de eerste 12 bytes van de header een tabel met een lijst met bron-ID's waarvan de payloads zijn gebruikt om de payload van dit pakket te maken. In dit geval worden in de onderste vier bits van de eerste byte van de header (field Bijdragende bron-ID's tellen mee) geeft het aantal bronnen aan. De veldgrootte is 4 bits, dus de tabel kan maximaal 15 bron-ID's bevatten. Elk neemt 4 bytes in beslag. Deze tabel wordt gebruikt bij het opzetten van een conferentiegesprek.

  • Wanneer de titel de extensie . In dit geval wordt de bit ingesteld in de eerste byte van de header X. In de uitgebreide koptekst, na de deelnemerstabel (indien aanwezig), staat een extensiekoptekst van één woord, gevolgd door de extensiewoorden. Een extensie is een verzameling bytes die u kunt gebruiken om extra gegevens over te dragen. De standaard bepaalt niet het formaat van deze gegevens - het kan van alles zijn. Het kunnen bijvoorbeeld enkele aanvullende instellingen zijn voor het apparaat dat RTP-pakketten ontvangt. Voor sommige toepassingen zijn echter uitgebreide headerstandaarden ontwikkeld. Dit wordt bijvoorbeeld gedaan voor communicatie in de standaard ED-137 (interoperabiliteitsnormen voor VoIP ATM-componenten).

Laten we nu de kopvelden in meer detail bekijken. Hieronder staat een canonieke afbeelding met de structuur van de RTP-header, die ik ook niet kon weerstaan ​​en in dezelfde kleuren geverfd.

De Mediastreamer2 VoIP-engine verkennen. Deel 8
VER β€” versienummer protocol (huidige versie 2);

P - een vlag die wordt ingesteld in gevallen waarin het RTP-pakket aan het einde wordt aangevuld met lege bytes;

X - vlag dat de header is verlengd;

CC β€” bevat het aantal CSRC-identificatiecodes na de constante header (na woorden 1..3), de tabel wordt niet weergegeven in de afbeelding;

M β€” markering van het begin van een frame of de aanwezigheid van spraak in het kanaal (als een spraakpauzedetector wordt gebruikt). Als de ontvanger geen spraakpauzedetector bevat, moet deze bit permanent worden ingesteld;

PTYPE - specificeert het formaat van de lading;

Volgnummer - pakketnummer, gebruikt om de volgorde te herstellen waarin pakketten worden afgespeeld, aangezien de werkelijke situatie is dat pakketten de ontvanger kunnen bereiken in de verkeerde volgorde waarin ze zijn verzonden. De beginwaarde moet willekeurig zijn, dit wordt gedaan zodat als de RTP-stream gecodeerd is, het moeilijk zal zijn om deze te hacken. Met dit veld kunt u ook gemiste pakketten detecteren;

Tijdstempel - tijdstempel. De tijd wordt gemeten in signaalmonsters, d.w.z. als een burst 160 samples bevat, dan is de tijdstempel van de volgende burst 160 meer.De beginwaarde van de tijdstempel moet willekeurig zijn;

SSRC β€” identificator van de pakketbron, deze moet uniek zijn. Het is beter om het willekeurig te genereren voordat de RTP-stream wordt gestart.

Als u uw eigen RTP-zender of -ontvanger ontwikkelt, moet u uw pakketten meer dan eens bekijken om de productiviteit te verhogen. Ik raad u aan te leren hoe u pakketfiltering in TShark gebruikt, hiermee kunt u alleen die pakketten vastleggen die van interesse voor jou. In een omgeving waar tientallen RTP-apparaten op het netwerk draaien, is dat erg waardevol. In de opdrachtregel van TShark worden filteropties opgegeven met de optie "-f". We gebruikten deze optie toen we pakketten van poort 8010 wilden vastleggen:
-f "udp port 8010"
Filterparameters zijn in wezen een reeks criteria waaraan een "gevangen" pakket moet voldoen. De voorwaarde kan het adres, de poort en de waarde van een bepaalde byte in het pakket controleren. Voorwaarden kunnen worden gecombineerd met logische bewerkingen "EN", "OF", etc. Een zeer krachtig hulpmiddel.

Als u de dynamiek van veldwijzigingen in batches wilt bekijken, moet u de uitvoer dupliceren TSaai naar een bestand, zoals getoond in het laatste artikel, door de uitvoer door te geven TSaai bij de ingang tee. Open vervolgens het logbestand met minder, vim of een andere tool die snel met enorme tekstbestanden kan werken en naar strings kan zoeken, kun je alle nuances van het gedrag van pakketvelden in een RTP-stream ontdekken.

Als u naar het signaal wilt luisteren dat door de RTP-stream wordt verzonden, moet u de versie gebruiken TSaai met visuele interface Wireshark. Met eenvoudige muismanipulaties kunt u de golfvorm van het signaal beluisteren en zien. Maar op één voorwaarde - als het is gecodeerd in u-law of a-low formaat.

Volgende ΡΡ‚Π°Ρ‚ΡŒΠ΅ wij maken samen met u een duplex intercom. Verzamel een paar headsets en een gesprekspartner.

Bron: www.habr.com

Voeg een reactie