Il materiale dell'articolo è tratto dal mio .

Struttura del pacchetto RTP
Nell'articolo precedente abbiamo utilizzato TShark per eseguire la cattura dei pacchetti RTP che il nostro ricevitore e trasmettitore si scambiavano. In questa analisi coloreremo gli elementi del pacchetto in diversi colori e parleremo della loro funzionalità.
Guardiamo lo stesso pacchetto, ma ora con i campi colorati e le annotazioni esplicative:

Nella parte inferiore dell'elenco sono evidenziati i byte che compongono il pacchetto RTP, il quale è a sua volta il payload del pacchetto UDP (il suo header è evidenziato da una linea nera). I fondi colorati indicano i byte dell'header RTP, mentre con il colore verde è evidenziato il blocco di dati che contiene il payload del pacchetto RTP. I dati sono rappresentati in formato esadecimale. In questo caso, si tratta di un segnale audio compresso secondo il formato u-law (legge mu), ovvero ogni campione ha una dimensione di 1 byte. Poiché abbiamo utilizzato un'frequenza di campionamento predefinita (8000 Hz), a una frequenza di pacchetti di 50 Hz, ogni pacchetto RTP deve contenere 160 byte di payload. È ciò che vedremo contando i byte nell'area verde, che dovrebbero essere 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 4 byte. Se per caso il tuo payload non rispetta questa regola, è necessario aggiungere byte con valori nulli alla fine del payload e impostare il bit di Padding. Questo bit si trova nel primo byte dell'header RTP, è evidenziato di colore turchese. Nota che tutti i byte del payload hanno un valore di 0xFF: questa è l'aspetto del silenzio in formato u-law.
L'header del pacchetto RTP è composto da 12 byte obbligatori, ma in due casi può essere più lungo:
Quando il pacchetto trasmette un segnale audio ottenuto dalla mescolanza di segnali provenienti da più fonti (flussi RTP), dopo i primi 12 byte dell'header si trova una tabella con l'elenco degli identificatori delle fonti i cui payload sono stati utilizzati per generare il payload di questo pacchetto. A questo punto, nei quattro bit inferiori del primo byte dell'header (campo Conteggio degli identificatori delle fonti contributrici) viene indicato il numero delle fonti. La dimensione del campo è di 4 bit, quindi la tabella può contenere fino a 15 identificatori di fonti. Ognuno dei quali occupa 4 byte. Questa tabella è utilizzata per l'organizzazione della conferenza a distanza.
Quando l'intestazione ha un'estensione. In questo caso, nel primo byte dell'intestazione viene impostato il bit X. Nell'intestazione estesa, dopo la tabella dei partecipanti (se presenti), si trova l'intestazione dell'estensione grande un parola, seguita dalle parole dell'estensione. L'estensione è un insieme di byte che puoi usare per trasmettere dati aggiuntivi. Lo standard non specifica il formato di questi dati: può essere qualsiasi cosa. Ad esempio, potrebbero essere delle impostazioni aggiuntive per il dispositivo che riceve i pacchetti RTP. Tuttavia, per alcune applicazioni, sono stati sviluppati standard per l'intestazione estesa. Questo è stato fatto, ad esempio, per i mezzi di comunicazione nello standard ED-137 (Standard di interoperabilità per componenti VoIP ATM).
Ora esaminiamo i campi dell'intestazione in modo più dettagliato. Qui sotto è mostrata un'immagine canonica con la struttura dell'intestazione RTP, che ho anche colorato con gli stessi colori.

VER — numero della versione del protocollo (la versione corrente è 2);
P — flag che viene impostato nei casi in cui il pacchetto RTP è arricchito con byte vuoti alla fine;
X — flag che indica che l'intestazione è estesa;
CC — contiene il numero di identificatori CSRC che seguono l'intestazione fissa (dopo le parole 1..3), la tabella non è mostrata nell'immagine;
M — marcatore dell'inizio del fotogramma o della presenza di voce nel canale (se è presente un rilevatore di pause nel parlato). Se il ricevitore non ha un rilevatore di pause nel parlato, questo bit deve essere sempre impostato;
PTYPE — indica il formato del payload;
Numero di sequenza — numero del pacchetto, utilizzato per ripristinare l'ordine di riproduzione dei pacchetti, poiché nella realtà è possibile che i pacchetti arrivino al ricevitore non nell'ordine in cui sono stati inviati. Il valore iniziale deve essere casuale, ciò viene fatto per rendere più difficile la violazione in caso venga utilizzata la crittografia del flusso RTP. Questo campo consente anche di rilevare eventuali pacchetti persi;
Timestamp — timestamp. Il tempo è misurato in campioni di segnale, ovvero se un pacchetto contiene 160 campioni, il timestamp del pacchetto successivo sarà maggiore di 160. Il valore iniziale del timestamp deve essere casuale;
SSRC — identificatore della sorgente del pacchetto, deve essere unico. È meglio generarlo casualmente prima di avviare il flusso RTP.
Se stai sviluppando il tuo trasmettitore o ricevitore di pacchetti RTP, dovrai analizzare i tuoi pacchetti più di una volta per migliorare le prestazioni. Ti consiglio di imparare a utilizzare il filtraggio dei pacchetti in TShark, che permette di catturare solo i pacchetti di tuo interesse. In un ambiente in cui decine di dispositivi RTP operano in rete, questo è estremamente prezioso. Nella riga di comando di TShark, i parametri di filtraggio sono impostati con l'opzione "-f". Abbiamo usato questa opzione quando volevamo catturare pacchetti dalla porta 8010:
-f "udp port 8010"
I parametri di filtraggio sono essenzialmente un insieme di criteri ai quali deve conformarsi il pacchetto "catturato". La condizione può verificare l'indirizzo, la porta, il valore di un byte specifico nel pacchetto. Le condizioni possono essere combinate con operazioni logiche come "E", "O" e simili. È uno strumento molto potente.
Se desideri visualizzare la dinamica della variazione dei campi nei pacchetti, ti sarà necessario duplica l'output TShark in un file, come mostrato nell'articolo precedente, utilizzando la trasmissione dell'output TShark all'input tee. Successivamente, aprendo il file di log con less, vim o un altro strumento in grado di lavorare rapidamente con enormi file di testo e eseguire ricerche di stringhe, potrai scoprire tutte le sfumature del comportamento dei campi nei pacchetti nel flusso RTP.
Se hai bisogno di ascoltare il segnale trasmesso dal flusso RTP, dovResti utilizzare la versione TShark con interfaccia grafica Wireshark. Con semplici operazioni con il mouse, puoi ascoltare e visualizzare l'oscillogramma del segnale. Ma a condizione che esso sia codificato nel formato u-law o a-law.
Nel prossimo realizzeremo insieme un dispositivo di comunicazione duplex. Assicurati di avere un paio di cuffie e un interlocutore.
Fonte: habr.com
