Изучаваме VoIP двигател Mediastreamer2. Част 8

Материалът на статията е взет от моя дзен-канал.

Изучаваме VoIP двигател Mediastreamer2. Част 8

Структура на RTP пакета

В миналото статии с помощта на TShark извършихме захващане на RTP пакети, с които обменяха нашият приемник и предавател. А в тази част ще оцветим елементите на пакета в различни цветове и ще говорим за тяхната функция.

Нека погледнем на същия пакет, но вече с оцветени полета и обяснителни надписи:
Изучаваме VoIP двигател Mediastreamer2. Част 8

В долната част на листинга са оцветени байтовете, които съставят RTP пакета, а той от своя страна е полезен товар на UDP пакета (неговият заглавие е обведено с черна линия). С цветни фонове са обозначени байтовете на RTP заглавието, а зелен фон е отделен блок данни, който съдържа полезния товар на RTP пакета. Данните там са представени в шестнадесетичен формат. В нашия случай това е звуков сигнал, компресиран по u-закон (мю-закон), т.е. един отсчет има размер 1 байт. Тъй като използвахме стандартната честота на дискретизация (8000 Hz), при честота на пакетите 50 Hz всеки RTP пакет трябва да съдържа 160 байта полезен товар. Това ще видим, като преброим байтовете в зелената област, които трябва да бъдат 10 реда.

Според стандарта количеството данни в полезния товар трябва да бъде кратно на четири, тоест да съдържа цяло количество четирибайтни думи. Ако се случи така, че вашият полезен товар не отговаря на това правило, то в края на полезния товар трябва да добавите байтове с нулеви стойности и да зададете бита за допълнение (Padding). Този бит се намира в първия байт на RTP заглавието, той е оцветен в тюркоазено. Обърнете внимание, че всички байтове на полезния товар имат стойност 0xFF — така изглежда тишината в u-law формат.

Заглавието на RTP пакета се състои от 12 задължителни байта, но в два случая може да бъде по-дълго:

  • Когато пакетът носи звуков сигнал, получен от смесване на сигнали от няколко източника (RTP потоци), то след първите 12 байта на заглавието се намира таблица с списък на идентификаторите на източниците, полезните товари на които са били използвани за създаване на полезния товар на този пакет. При това в по-ниските четири бита на първия байт на заглавието (полето Брой идентификатори на допринасящи източници) се посочва броят на източниците. Размерът на полето е 4 бита, съответно таблицата може да съдържа до 15 идентификатора на източници. Всеки от които заема 4 байта. Тази таблица се използва при организиране на конференционна връзка.

  • Когато заглавието има разширение. В този случай в първия байт на заглавието се задава бит X. В разширеното заглавие, след таблицата на участниците (ако има такива), се разполага заглавието за разширение с размер на една дума, а след него думите на разширението. Разширението е набор от байтове, които можете да използвате, за да предавате допълнителни данни. Стандартът не определя формата на тези данни — той може да бъде произволен. Например, това могат да бъдат допълнителни настройки за устройството, което получава RTP-пакетите. За някои приложения, обаче, са разработени стандарти за разширено заглавие. Така е направено, например, за средствата за комуникация в стандарта ED-137 (Стандарти за взаимодействие на компоненти VoIP ATM).

Сега нека разгледаме полетата на заглавието по-подробно. По-долу е каноничната картинка със структурата на RTP-заглавието, която също не се сдържах и я оцветих в същите цветове.

Изучаваме VoIP двигател Mediastreamer2. Част 8
VER — номер на версията на протокола (текущата версия е 2);

P — флаг, който се задава в случаите, когато RTP-пакетът се допълва с празни байтове в края;

X — флаг, че заглавието е разширено;

CC — съдържа броя на CSRC-идентификаторите, следващи след постоянното заглавие (след думите 1..3), на изображението таблицата не е показана;

M — маркер за начало на кадъра или наличие на реч в канала (ако се използва детектор на паузи в речта). Ако приемникът не съдържа детектор на паузи в речта, то този бит трябва да бъде зададен постоянно;

PTYPE — указва формата на полезния товар;

Последователност номер — номер на пакета, използва се за възстановяване на реда на възпроизвеждане на пакетите, тъй като реалната ситуация е, че пакетите могат да достигнат до приемника не в реда, в който са изпратени. Началната стойност трябва да е произволна, това се прави, за да се затрудни хакването, ако се прилага шифрованият RTP-поток. Също така това поле позволява откриването на пропуснати пакети;

Таймстамп — времеви маркер. Времето се измерва в проби на сигнала, т.е. ако пакетът съдържа 160 проби, времевият маркер на следващия пакет ще бъде с 160 по-висок. Началната стойност на времевия маркер трябва да бъде случайна;

SSRC — идентификатор на източника на пакета, който трябва да бъде уникален. Най-добре е да се генерира случайно преди стартиране на RTP потока.

Ако ще разработвате свой предавател или приемник на RTP пакети, ще трябва неведнъж да разглеждате пакетите, за да повишите продуктивността. Препоръчвам ви да овладеете използването на филтриране на пакети в TShark, то ви позволява да улавяте само тези пакети, които представляват интерес за вас. В условия, при които в мрежата работят десетки RTP устройства, това е много ценно. В командния ред на TShark параметрите за филтриране се задават с опцията "-f". Използвахме тази опция, когато искахме да уловим пакетите от порт 8010:
-f "udp port 8010"
Параметрите на филтрирането по същността си са набор от критерии, на които "уловеният" пакет трябва да отговаря. Условието може да проверява адрес, порт, стойност на определен байт в пакета. Условията могат да се комбинират с логически операции "И", "ИЛИ" и т.н. Много мощен инструмент.

Ако искате да видите динамиката на промените в полетата на пакетите, ще се нуждаете от дублиране на изхода TShark в файл, както беше показано в предишната статия, с помощта на предаването на изхода TShark към входа tee. След това, отваряйки лог файла с помощта на less, vim или друг инструмент, способен бързо да работи с огромни текстови файлове и да извършва търсене на редове, можете да разберете всички нюанси на поведението на полета в RTP потока.

Ако се нуждаете да прослушате сигнала, предаван от RTP потока, трябва да използвате версия TShark с визуален интерфейс Wireshark. С несложни манипулации с мишката можете да прослушате и видите осцилограмата на сигнала. Но при едно условие — ако той бъде кодиран в формат u-law или a-law.

В следващата статии ще направим дуплексно разговорно устройство. Запасете се с два комплекта слушалки и един събеседник.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster