Studying the VoIP engine Mediastreamer2. Part 8

Materialul articolului provine de pe canalul meu zen.

Studying the VoIP engine Mediastreamer2. Part 8

Structura pachetului RTP

În trecut, pe care l-ați citit am realizat capturarea TShark a pachetelor RTP care au fost schimbate între receptorul și transmitătorul nostru. În acest articol, vom coloriza elementele pachetului în culori diferite și vom discuta despre funcția lor.

Să ne uităm la același pachet, dar deja cu câmpurile colorizate și cu etichete explicative:
Studying the VoIP engine Mediastreamer2. Part 8

În partea de jos a listei sunt colorizate byte-urile care compun pachetul RTP, care reprezintă la rândul său încărcătura utilă a pachetului UDP (capul său este evidențiat cu o linie neagră). Fondurile colorate indică byte-urile capului RTP, iar blocul de date este evidențiat în verde, conținând încărcătura utilă a pachetului RTP. Datele sunt prezentate în format hexadecimal. În cazul nostru, este un semnal audio comprimat prin legea u (legea mu), adică un eșantion are dimensiunea de 1 byte. Deoarece am folosit rata de eșantionare setată implicit (8000 Hz), la o frecvență de pachete de 50 Hz, fiecare pachet RTP ar trebui să conțină 160 byte de încărcătură utilă. Asta vom observa, numărând byte-urile din zona verde, care ar trebui să fie 10 rânduri.

Conform standardului, cantitatea de date din încărcătura utilă trebuie să fie un multiplu de patru sau, cu alte cuvinte, să conțină un număr întreg de cuvinte de patru byte. Dacă încărcătura utilă nu respectă această regulă, trebuie să adăugați byte-uri cu valori zero la sfârșitul încărcăturii utile și să activați bitul Padding (Completare). Acest bit se află în primul byte al capului RTP, colorizat în turcoaz. Observați că toate byte-urile din încărcătura utilă au valoarea 0xFF — așa arată tăcerea în formatul u-law.

Capul pachetului RTP constă din 12 byte obligatorii, dar în două cazuri poate fi mai lung:

  • Când pachetul transportă un semnal audio obținut prin mixarea semnalelor de la mai multe surse (fluxuri RTP), după primele 12 byte ale capului se află o tabelă cu lista identificatorilor surselor, ale căror încărcături utile au fost utilizate pentru a crea încărcătura utilă a acestui pachet. În acest caz, în cei patru biți inferiori ai primului byte al capului (câmpul Numărul surselor contributoare) se specifică numărul de surse. Dimensiunea câmpului este de 4 biți, prin urmare tabela poate conține până la 15 identificatori de surse. Fiecare dintre aceștia ocupă 4 octeți. Această tabelă este utilizată pentru organizarea conferințelor audio.

  • Când antetul are o extensie. În acest caz, în primul octet al antetului se setează bitul X. În antetul extins, după tabela participanților (dacă există), se află antetul de extensie cu dimensiunea unei cuvinte, urmat de cuvintele extensiei. Extensia este un set de octeți pe care îi puteți folosi pentru a transmite date suplimentare. Standardul nu specifică formatul acestor date — acesta poate fi orice. De exemplu, acestea pot fi setări suplimentare pentru dispozitivul care primește pachetele RTP. Pentru unele aplicații, totuși, au fost dezvoltate standarde pentru antetul extins. Acest lucru a fost realizat, de exemplu, pentru sistemele de comunicație conform standardului ED-137 (Standardele de interoperabilitate pentru componente VoIP ATM).

Acum să analizăm câmpurile antetului mai în detaliu. Mai jos este o imagine canonică cu structura antetului RTP, pe care am colorat-o și eu în aceleași culori.

Studying the VoIP engine Mediastreamer2. Part 8
VER — numărul versiunii protocolului (versiunea curentă 2);

P — un semn care este setat în cazurile când pachetul RTP este completat cu biți goi la sfârșit;

X — un semn că antetul este extins;

CC — conține numărul de identificatori CSRC care urmează după antetul constant (după cuvintele 1..3), în figură tabela nu este arătată;

M — marcajul pentru începutul cadrelor sau al prezenței vocii în canal (dacă se folosește un detector de pauze în vorbire). Dacă receptorul nu conține detector de pauze în vorbire, atunci acest bit trebuie să fie setat constant;

PTYPE — indică formatul încărcăturii utile;

Numărul de secvență — numărul pachetului, utilizat pentru a restabili ordinea de redare a pachetelor, deoarece situația reală este că pachetele pot ajunge la receptor nu în ordinea în care au fost trimise. Valoarea inițială ar trebui să fie aleatorie, acest lucru se face pentru ca, în cazul în care se aplică criptarea fluxului RTP, să se îngreuneze decriptarea acestuia. De asemenea, acest câmp permite detectarea pachetelor lipsă;

Timestamp — marcajă de timp. Timpul este măsurat în eșantioane de semnal, adică, dacă un pachet conține 160 de eșantioane, atunci marcajul de timp al următorului pachet va fi cu 160 mai mare. Valoarea inițială a marcajului de timp trebuie să fie aleatorie;

SSRC — identificatorul sursei pachetului, care trebuie să fie unic. Este mai bine să-l generați aleatoriu înainte de a lansa fluxul RTP.

Dacă doriți să dezvoltați propriul transmisor sau receptor de pachete RTP, va trebui să examinați pachetele frecvent pentru a îmbunătăți performanța. Vă recomand să învățați să utilizați filtrarea pachetelor în TShark, care permite captarea doar a pachetelor care vă interesează. În condițiile în care pe rețea funcționează zeci de dispozitive RTP, acest lucru este foarte valoros. În linia de comandă TShark, parametrii de filtrare sunt specificați cu opțiunea "-f". Am folosit această opțiune când am vrut să captăm pachete de pe portul 8010:
-f "udp port 8010"
Parametrii de filtrare sunt, prin definiție, un set de criterii pe care trebuie să le îndeplinească pachetul "captat". Condiția poate verifica adresa, portul, valoarea unui anumit byte în pachet. Condițiile pot fi combinate cu operații logice "ȘI", "SAU" etc. Este un instrument foarte puternic.

Dacă doriți să vizualizați dinamica modificării câmpurilor din pachete, va trebui să dublați ieșirea TShark într-un fișier, așa cum a fost demonstrat în articolul precedent, prin transmiterea ieșirii TShark la intrare tee. Apoi, deschizând fișierul de log cu ajutorul less, vim sau alt instrument capabil să lucreze rapid cu fișiere text uriașe și să efectueze căutări, veți putea să determinați toate nuanțele comportamentului câmpurilor pachetelor în fluxul RTP.

Dacă aveți nevoie să ascultați semnalul transmis de fluxul RTP, trebuie să folosiți versiunea TShark cu interfață vizuală Wireshark. Prin manipulări simple cu mouse-ul, acolo puteți asculta și vizualiza oscilograma semnalului. Dar cu o condiție — dacă este codificat în format u-law sau a-low.

În următoarea pe care l-ați citit vom construi un dispozitiv de comunicare duplex. Pregătiți câteva căști și un partener de conversație.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster