Il materiale dell'articolo è tratto dal mio .

Struttura del pacchetto RTP
Nel passato abbiamo utilizzato TShark per catturare i pacchetti RTP, che sono stati scambiati tra il nostro ricevitore e trasmettitore. In questo caso, coloreremo gli elementi del pacchetto in diversi colori e parleremo della loro funzione.
Diamo un'occhiata allo stesso pacchetto, ma già con i campi colorati e con annotazioni esplicative:

Nella parte inferiore della lista sono colorati i byte che compongono il pacchetto RTP, che è a sua volta il payload del pacchetto UDP (il suo intestazione è evidenziata da una linea nera). I byte dell'intestazione RTP sono contrassegnati con sfondi colorati, mentre 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 legge u (legge mu), cioè ogni campione ha una dimensione di 1 byte. Poiché abbiamo utilizzato il tasso di campionamento predefinito (8000 Hz), ad una frequenza di pacchetti di 50 Hz, ogni pacchetto RTP dovrebbe contenere 160 byte di payload. Questo è ciò che vedremo, contando i byte nell'area verde; 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 quattro byte. Se 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'intestazione RTP, evidenziato in turchese. Si noti che tutti i byte del payload hanno il valore 0xFF: questo rappresenta il silenzio nel formato u-law.
L'intestazione del pacchetto RTP è composta da 12 byte obbligatori, ma in due casi può essere più lunga:
Quando il pacchetto trasporta un segnale audio ottenuto dalla mescolanza di segnali provenienti da più fonti (flussi RTP), dopo i primi 12 byte dell'intestazione si trova una tabella con l'elenco degli identificatori delle fonti il cui payload è stato utilizzato per creare il payload di questo pacchetto. In questo caso, nei quattro bit meno significativi del primo byte dell'intestazione (campo Conteggio degli identificatori di sorgente contribuenti) indica il numero di sorgenti. La dimensione del campo è di 4 bit, pertanto la tabella può contenere fino a 15 identificatori di sorgenti, ognuno dei quali occupa 4 byte. Questa tabella è utilizzata per organizzare la videoconferenza.
Quando l'intestazione ha un'estensione. In questo caso, nel primo byte dell'intestazione viene impostato un bit X. Nell'intestazione estesa, dopo la tabella dei partecipanti (se presente), si trova l'intestazione dell'estensione, di dimensione pari a una parola, seguita dalle parole di estensione. L'estensione è un insieme di byte che puoi utilizzare per trasmettere dati aggiuntivi. Lo standard non specifica 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 per l'intestazione estesa. Questo è il caso, ad esempio, per i mezzi di comunicazione nello standard ED-137 (Standard di interoperabilità per i componenti VoIP ATM).
Esaminiamo ora i campi dell'intestazione in modo più dettagliato. Di seguito è riportata un'immagine canonica con la struttura dell'intestazione RTP, che ho anche colorato con gli stessi colori.

VER — numero di versione del protocollo (versione attuale 2);
P — flag che viene impostato nei casi in cui il pacchetto RTP venga completato 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), che nella figura non è mostrata;
M — marcatore dell'inizio di un'istantanea o della presenza di voce nel canale (se viene utilizzato un rilevatore di pause nella voce). Se il ricevitore non contiene un rilevatore di pause nella voce, questo bit deve essere sempre impostato;
PTYPE — indica il formato del payload;
Sequence number — numero del pacchetto, utilizzato per ripristinare l'ordine di riproduzione dei pacchetti, poiché è comune che i pacchetti possano raggiungere il ricevitore in ordine diverso rispetto a come sono stati inviati. Il valore iniziale deve essere casuale, per complicare l'hacking se viene applicata la crittografia al flusso RTP. Inoltre, questo campo consente di rilevare le perdite di pacchetti;
Timestamp — marca temporale. Il tempo è misurato in campioni di segnale, ovvero se un pacchetto contiene 160 campioni, la marca temporale del pacchetto successivo sarà maggiore di 160. Il valore iniziale della marca temporale dovrebbe 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 esaminare frequentemente i tuoi pacchetti. Per migliorare l'efficienza, ti consiglio di imparare a utilizzare il filtraggio dei pacchetti in TShark, in quanto consente di catturare solo i pacchetti di tuo interesse. In scenari in cui operano decine di dispositivi RTP, questo è molto prezioso. Nella riga di comando TShark, i parametri di filtraggio sono impostati con l'opzione "-f". Abbiamo utilizzato 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 corrispondere il pacchetto "catturato". Una condizione può verificare l'indirizzo, la porta o il valore di un determinato byte nel pacchetto. Le condizioni possono essere combinate con operazioni logiche come "E", "OPPURE" e così via. È uno strumento molto potente.
Se desideri visualizzare la dinamica delle modifiche nei campi dei pacchetti, è necessario duplicare l'output TShark in un file, come mostrato nell'articolo precedente, utilizzando il passaggio dell'output TShark all'input tee. Quindi, aprendo il file di log con less, vim o un altro strumento in grado di gestire rapidamente enormi file di testo e di eseguire ricerche di stringhe, potrai determinare tutti i dettagli sul comportamento dei campi nei pacchetti nel flusso RTP.
Se hai bisogno di ascoltare il segnale trasmesso dal flusso RTP, dovrai utilizzare la versione TShark con interfaccia visiva Wireshark. Con alcune semplici operazioni del mouse, potrai ascoltare e vedere l'oscillogramma del segnale. Ma a una condizione: deve essere codificato nel formato u-law o a-low.
Nella prossima creeremo insieme un dispositivo di comunicazione duplex. Procurati un paio di cuffie e un interlocutore.
Fonte: habr.com
