Esplorare il motore VoIP di Mediastreamer2. Parte 8

Il materiale dell'articolo è tratto dal mio canale zen.

Esplorare il motore VoIP di Mediastreamer2. Parte 8

Struttura del pacchetto RTP

Nel passato Articolo stiamo usando Tsqualo ha eseguito la cattura dei pacchetti RTP che sono stati scambiati tra il nostro ricevitore e trasmettitore. Bene, in questo dipingeremo gli elementi della confezione in diversi colori e parleremo del loro scopo.

Diamo un'occhiata alla stessa confezione, ma con margini colorati ed etichette esplicative:
Esplorare il motore VoIP di Mediastreamer2. Parte 8

Nella parte inferiore dell'elenco, i byte che compongono il pacchetto RTP sono colorati e questo a sua volta è il payload del pacchetto UDP (la sua intestazione è cerchiata in nero). Gli sfondi colorati indicano i byte dell'intestazione RTP e il blocco di dati che contiene il payload del pacchetto RTP è evidenziato in verde. I dati sono presentati in formato esadecimale. Nel nostro caso si tratta di un segnale audio compresso secondo la u-law (mu-law), ad es. un campione ha una dimensione di 1 byte. Poiché abbiamo utilizzato la frequenza di campionamento predefinita (8000 Hz), a una frequenza di pacchetto di 50 Hz, ogni pacchetto RTP dovrebbe contenere 160 byte di payload. Lo vedremo contando i byte nell'area verde, dovrebbero esserci 10 righe.

Secondo lo standard, la quantità di dati nel payload deve essere un multiplo di quattro o, in altre parole, deve contenere un numero intero di parole di quattro byte. Se succede che il tuo payload non corrisponde a questa regola, devi aggiungere byte con valore zero alla fine del payload e impostare il bit Padding. Questo bit si trova nel primo byte dell'intestazione RTP ed è di colore turchese. Nota che tutti i byte del payload sono 0xFF, che è l'aspetto del silenzio di u-law.

L'intestazione del pacchetto RTP è composta da 12 byte obbligatori, ma in due casi può essere più lunga:

  • Quando un pacchetto trasporta un segnale audio ottenuto mescolando segnali provenienti da diverse fonti (stream RTP), dopo i primi 12 byte dell'intestazione c'è una tabella con un elenco di identificatori di origine i cui payload sono stati utilizzati per creare il payload di questo pacchetto. In questo caso, nei quattro bit inferiori del primo byte dell'intestazione (campo Gli identificatori della fonte contribuente contano) indica il numero di sorgenti. La dimensione del campo è di 4 bit, quindi la tabella può contenere fino a 15 identificatori di origine. Ognuno dei quali occupa 4 byte. Questa tabella viene utilizzata durante l'impostazione di una chiamata in conferenza.

  • Quando il titolo ha l'estensione . In questo caso, il bit è impostato nel primo byte dell'intestazione X. Nell'intestazione estesa, dopo la tabella dei partecipanti (se presenti), è presente un'intestazione di estensione di una parola, seguita dalle parole di estensione. Un'estensione è una raccolta di byte che è possibile utilizzare per trasferire dati aggiuntivi. Lo standard non stabilisce il formato di questi dati: può essere qualsiasi cosa. Ad esempio, potrebbero essere alcune impostazioni aggiuntive per il dispositivo che riceve i pacchetti RTP. Per alcune applicazioni, tuttavia, sono stati sviluppati standard di intestazione estesa. Questo viene fatto, ad esempio, per le comunicazioni nello standard ED-137 (Standard di interoperabilità per componenti ATM VoIP).

Ora diamo un'occhiata ai campi di intestazione in modo più dettagliato. Di seguito è riportata un'immagine canonica con la struttura dell'intestazione RTP, alla quale anch'io non ho resistito e dipinta con gli stessi colori.

Esplorare il motore VoIP di Mediastreamer2. Parte 8
VER — numero di versione del protocollo (attuale versione 2);

P - un flag che viene impostato nei casi in cui il pacchetto RTP è completato con byte vuoti alla fine;

X - flag che l'intestazione è estesa;

CC — contiene il numero di identificatori CSRC che seguono l'intestazione della costante (dopo le parole 1..3), la tabella non è mostrata nella figura;

M — marcatore dell'inizio di un frame o della presenza di parlato nel canale (se si usa un rilevatore di pausa vocale). Se il ricevitore non contiene un rilevatore di pausa vocale, questo bit deve essere impostato in modo permanente;

TIPO P - specifica il formato del payload;

Sequenza di numeri - numero di pacchetto, utilizzato per ripristinare l'ordine in cui i pacchetti vengono riprodotti, poiché la situazione reale è quando i pacchetti possono raggiungere il destinatario nell'ordine sbagliato in cui sono stati inviati. Il valore iniziale deve essere casuale, questo viene fatto in modo che se il flusso RTP è crittografato, sarà difficile hackerarlo. Inoltre, questo campo consente di rilevare i pacchetti persi;

Timestamp - marca temporale. Il tempo viene misurato in campioni di segnale, ad es. se un burst contiene 160 campioni, il timestamp del burst successivo sarà di altri 160. Il valore iniziale del timestamp deve essere casuale;

SSRC — identificatore della fonte del pacchetto, deve essere univoco. È meglio generarlo in modo casuale prima di avviare il flusso RTP.

Se sviluppi il tuo trasmettitore o ricevitore di pacchetti RTP, dovrai esaminare i tuoi pacchetti più di una volta per aumentare la produttività, ti consiglio di imparare come utilizzare il filtraggio dei pacchetti in TShark, ti ​​consente di catturare solo quei pacchetti che ti interessano. In un ambiente in cui sulla rete operano dozzine di dispositivi RTP, questo è molto prezioso. Nella riga di comando di TShark, le opzioni di filtraggio sono specificate con l'opzione "-f". Abbiamo utilizzato questa opzione quando volevamo catturare i pacchetti dalla porta 8010:
-f "udp port 8010"
I parametri di filtraggio sono essenzialmente un insieme di criteri che un pacchetto "catturato" deve soddisfare. La condizione può controllare l'indirizzo, la porta, il valore di un certo byte nel pacchetto. Le condizioni possono essere combinate con operazioni logiche "AND", "OR", ecc. Uno strumento molto potente.

Se desideri visualizzare le dinamiche delle modifiche del campo in batch, dovrai duplicare l'output Tsqualo a un file, come mostrato nell'ultimo articolo, passando l'output Tsqualo all'entrata tee. Quindi, apri il file di registro con meno, vim o un altro strumento in grado di lavorare rapidamente con enormi file di testo e cercare stringhe, puoi scoprire tutte le sfumature del comportamento dei campi del pacchetto in un flusso RTP.

Se devi ascoltare il segnale trasmesso dal flusso RTP, devi utilizzare la versione Tsqualo con interfaccia visiva Wireshark. Con semplici manipolazioni del mouse, puoi ascoltare e vedere la forma d'onda del segnale. Ma a una condizione: se è codificato in formato u-law o a-low.

Prossimo Articolo faremo un citofono duplex con te. Fai scorta di un paio di cuffie e di un interlocutore.

Fonte: habr.com

Aggiungi un commento