„Mediastreamer2 VoIP“ variklio tyrinėjimas. 8 dalis

Straipsnio medžiaga paimta iš mano zen kanalas.

„Mediastreamer2 VoIP“ variklio tyrinėjimas. 8 dalis

RTP paketo struktūra

Paskutiniame straipsnis mes naudojame TShark užfiksavo RTP paketus, kuriais buvo apsikeista tarp mūsų imtuvo ir siųstuvo. Na, o šioje nudažysime pakuotės elementus skirtingomis spalvomis ir kalbėsime apie jų paskirtį.

Pažvelkime į tą pačią pakuotę, tik su spalvotomis paraštėmis ir aiškinamosiomis etiketėmis:
„Mediastreamer2 VoIP“ variklio tyrinėjimas. 8 dalis

Sąrašo apačioje baitai, sudarantys RTP paketą, yra atspalvinti, o tai savo ruožtu yra UDP paketo naudingoji apkrova (jo antraštė apjuosta juodai). Spalvoti fonai nurodo RTP antraštės baitus, o duomenų blokas, kuriame yra RTP paketo naudingoji apkrova, yra paryškintas žaliai. Duomenys pateikiami šešioliktainiu formatu. Mūsų atveju tai garso signalas, suspaustas pagal u-dėsnį (mu-dėsnį), t.y. vieno pavyzdžio dydis yra 1 baitas. Kadangi naudojome numatytąjį diskretizavimo dažnį (8000 Hz), kai paketų dažnis yra 50 Hz, kiekviename RTP pakete turėtų būti 160 baitų naudingosios apkrovos. Tai pamatysime suskaičiavę žaliojoje zonoje esančius baitus, jų turėtų būti 10 eilučių.

Pagal standartą naudingojo krovinio duomenų kiekis turi būti kartotinis iš keturių, kitaip tariant, jame turi būti sveikasis keturių baitų žodžių skaičius. Jei taip atsitiks, kad jūsų naudingoji apkrova neatitinka šios taisyklės, tuomet reikia pridėti nulinės vertės baitų naudingosios apkrovos pabaigoje ir nustatyti užpildymo bitą. Šis bitas yra pirmame RTP antraštės baite ir yra turkio spalvos. Atkreipkite dėmesį, kad visi naudingi apkrovos baitai yra 0xFF, taip atrodo u-law tyla.

RTP paketo antraštę sudaro 12 privalomų baitų, tačiau dviem atvejais ji gali būti ilgesnė:

  • Kai paketas neša garso signalą, gautą sumaišius signalus iš kelių šaltinių (RTP srautų), tada po pirmųjų 12 antraštės baitų yra lentelė su šaltinio identifikatorių sąrašu, kurių naudingos apkrovos buvo panaudotos kuriant šio paketo naudingąją apkrovą. Šiuo atveju apatiniuose keturiuose antraštės pirmojo baito bituose (laukas Skaičiuojama prisidedančių šaltinių identifikatorių) nurodo šaltinių skaičių. Lauko dydis yra 4 bitai, todėl lentelėje gali būti iki 15 šaltinio identifikatorių. Kiekvienas iš jų užima 4 baitus. Ši lentelė naudojama nustatant konferencinį pokalbį.

  • Kai pavadinime yra plėtinys . Šiuo atveju bitas nustatomas pirmame antraštės baite X. Išplėstinėje antraštėje po dalyvių lentelės (jei yra) yra vieno žodžio plėtinio antraštė, o po jos – plėtiniai. Plėtinys yra baitų rinkinys, kurį galite naudoti papildomiems duomenims perkelti. Standartas nenurodo šių duomenų formato – tai gali būti bet kas. Pavyzdžiui, tai gali būti kai kurie papildomi įrenginio, kuris gauna RTP paketus, nustatymai. Tačiau kai kurioms programoms buvo sukurti išplėstiniai antraštės standartai. Tai daroma, pavyzdžiui, standarte esantiems ryšiams ED-137 (VoIP bankomatų komponentų sąveikos standartai).

Dabar pažvelkime į antraštės laukus išsamiau. Žemiau yra kanoninis paveikslėlis su RTP antraštės struktūra, kuriam taip pat neatsispiriau ir nudažiau tomis pačiomis spalvomis.

„Mediastreamer2 VoIP“ variklio tyrinėjimas. 8 dalis
VER — protokolo versijos numeris (dabartinė versija 2);

P - vėliavėlė, kuri nustatoma tais atvejais, kai RTP paketas pabaigoje papildomas tuščiais baitais;

X - pažymėkite, kad antraštė išplėsta;

CC — yra CSRC identifikatorių skaičius po pastovios antraštės (po žodžių 1..3), lentelė paveiksle nerodoma;

M — kadro pradžios arba kalbos buvimo kanale žymeklis (jei naudojamas kalbos pauzės detektorius). Jei imtuve nėra kalbos pauzės detektoriaus, šis bitas turi būti nustatytas visam laikui;

PTYPE - nurodomas naudingojo krovinio formatas;

Eilės numeris - paketo numeris, naudojamas norint atkurti paketų atkūrimo tvarką, nes reali situacija yra tada, kai paketai gali pasiekti gavėją neteisinga tvarka, kuria jie buvo išsiųsti. Pradinė reikšmė turi būti atsitiktinė, tai daroma taip, kad jei RTP srautas yra užšifruotas, jį bus sunku nulaužti. Be to, šis laukas leidžia aptikti praleistus paketus;

Timestamp - laiko žyma. Laikas matuojamas signalų pavyzdžiais, t.y. jei serijoje yra 160 pavyzdžių, tai kito serijos laiko žyma bus dar 160. Pradinė laiko žymos reikšmė turi būti atsitiktinė;

SSRC — paketo šaltinio identifikatorius, jis turi būti unikalus. Prieš pradedant RTP srautą, geriau jį sugeneruoti atsitiktinai.

Jei kuriate savo RTP siųstuvą ar imtuvą, norėdami padidinti produktyvumą turėsite peržiūrėti savo paketus daugiau nei vieną kartą, rekomenduoju išmokti naudoti paketų filtravimą TShark, jis leidžia užfiksuoti tik tuos paketus, kurie yra jus domina. Aplinkoje, kurioje tinkle veikia dešimtys RTP įrenginių, tai labai vertinga. TShark komandų eilutėje filtravimo parinktys nurodomos su "-f" parinktimi. Naudojome šią parinktį, kai norėjome užfiksuoti paketus iš 8010 prievado:
-f "udp port 8010"
Filtravimo parametrai iš esmės yra kriterijų rinkinys, kurį turi atitikti „pagautas“ paketas. Sąlyga gali patikrinti tam tikro paketo baito adresą, prievadą, reikšmę. Sąlygas galima derinti su loginėmis operacijomis „IR“, „ARBA“ ir kt. Labai galingas įrankis.

Jei norite peržiūrėti lauko pokyčių dinamiką partijomis, turėsite kopijuoti išvestį TShark į failą, kaip parodyta paskutiniame straipsnyje, perduodant išvestį TShark prie įėjimo tee. Tada atidarykite žurnalo failą su mažiau, vim arba kitas įrankis, galintis greitai dirbti su didžiuliais tekstiniais failais ir ieškoti eilučių, galite sužinoti visus paketų laukų veikimo niuansus RTP sraute.

Jei jums reikia klausytis RTP srauto perduodamo signalo, turite naudoti versiją TShark su vaizdine sąsaja wireshark. Paprastomis pelės manipuliacijomis galite klausytis ir matyti signalo bangos formą. Bet su viena sąlyga – jei jis užkoduotas u-law arba a-low formatu.

Kitas straipsnis su jumis sukursime dvipusį domofoną. Įsigykite porą ausinių ir vieną pašnekovą.

Šaltinis: www.habr.com

Добавить комментарий