Laten we de VoIP-engine Mediastreamer2 bestuderen. Deel 7

Het materiaal van dit artikel is afkomstig van mijn zen-kanaal.

Laten we de VoIP-engine Mediastreamer2 bestuderen. Deel 7

We gebruiken TShark voor de analyse van RTP-pakketten

Laten we de VoIP-engine Mediastreamer2 bestuderen. Deel 7

In het verleden artikel we hebben een schema voor afstandsbediening samengesteld uit een generator en een detector van tonale signalen, waarvan de verbinding plaatsvindt via een RTP-stroom.

In dit artikel gaan we verder met het bestuderen van de overdracht van geluidssignalen met het RTP-protocol. Eerst splitsen we onze testapplicatie in een zender en een ontvanger en leren we hoe we de RTP-stroom kunnen onderzoeken met een netwerkverkeersanalysator.

Dus, om duidelijker te zien welke elementen van het programma verantwoordelijk zijn voor de overdracht van RTP, en welke voor de ontvangst, splitsen we ons bestand mstest6.c in twee onafhankelijke programma's, de zender en de ontvanger, en de gemeenschappelijke functies die door beiden worden gebruikt, brengen we onder in een derde bestand, dat we mstest_common.c, dat door de zender en ontvanger wordt opgenomen met behulp van de include-directive:

/* Π€Π°ΠΉΠ» mstest_common.c ΠžΠ±Ρ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/msrtp.h>
#include <ortp/rtpsession.h>
#include <ortp/payloadtype.h>

define PCMU 0

/*---------------------------------------------------------*/
/* Ѐункция рСгистрации Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ. */
void register_payloads(void)
{  
 /* РСгистрируСм Ρ‚ΠΈΠΏΡ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ. ПозднСС, ΠΏΠΎ индСксу    взятому 
     ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° RTP-ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ· этой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ    ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ 
     Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для дСкодирования Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π°. */
  rtp_profile_set_payload (&av_profile, PCMU, &payload_type_pcm8000);
}

/*---------------------------------------------------------*/
/* Π­Ρ‚Π° функция создана ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ create_duplex_rtpsession() Π² audiostream.c   мСдиастримСра2. */
 static RtpSession *create_rtpsession (int loc_rtp_port, int loc_rtcp_port,  bool_t ipv6, RtpSessionMode mode)
{  
  RtpSession *rtpr;  rtpr = rtp_session_new ((int) mode);  
  rtp_session_set_scheduling_mode (rtpr, 0);  
  rtp_session_set_blocking_mode (rtpr, 0);
  rtp_session_enable_adaptive_jitter_compensation (rtpr, TRUE);
  rtp_session_set_symmetric_rtp (rtpr, TRUE); 
  rtp_session_set_local_addr (rtpr, ipv6 ? "::" : "0.0.0.0", loc_rtp_port,  loc_rtcp_port); 
  rtp_session_signal_connect (rtpr, "timestamp_jump",  (RtpCallback) rtp_session_resync, 0);
  rtp_session_signal_connect (rtpr, "ssrc_changed",  (RtpCallback) rtp_session_resync, 0);
  rtp_session_set_ssrc_changed_threshold (rtpr, 0);
  rtp_session_set_send_payload_type(rtpr, PCMU);

  /* По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ RTCP-сСссию, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ наш ΠΏΡƒΠ»ΡŒΡ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 
  Π΅Ρ‘. */  
 rtp_session_enable_rtcp (rtpr, FALSE);
 return rtpr;
}

Nu het bestand van de afzonderlijke zender:

/* Π€Π°ΠΉΠ» mstest6.c Π˜ΠΌΠΈΡ‚Π°Ρ‚ΠΎΡ€ ΠΏΡƒΠ»ΡŒΡ‚Π° управлСния (ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°). */
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>
#include "mstest_common.c"

/*----------------------------------------------------------*/
int main()
{ 
  ms_init();

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ экзСмпляры Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ². */
  MSFilter *voidsource = ms_filter_new(MS_VOID_SOURCE_ID); 
  MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ΠΊΠΎΠ΄Π΅Ρ€Π°. */
  MSFilter *encoder = ms_filter_create_encoder("PCMU");

/* РСгистрируСм Ρ‚ΠΈΠΏΡ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. */
  register_payloads();

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ RTP-сСссию ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°. */
  RtpSession *tx_rtp_session = create_rtpsession (8010, 8011, FALSE, RTP_SESSION_SENDONLY);  
 rtp_session_set_remote_addr_and_port(tx_rtp_session,"127.0.0.1", 7010, 7011); 
 rtp_session_set_send_payload_type(tx_rtp_session, PCMU);  
 MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID); 
 ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, tx_rtp_session);

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ источник Ρ‚Π°ΠΊΡ‚ΠΎΠ² - Ρ‚ΠΈΠΊΠ΅Ρ€. */ 
 MSTicker *ticker_tx = ms_ticker_new();

/* БоСдиняСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°. */ 
 ms_filter_link(voidsource, 0, dtmfgen, 0);  
 ms_filter_link(dtmfgen, 0, encoder, 0);
 ms_filter_link(encoder, 0, rtpsend, 0);

/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ источник Ρ‚Π°ΠΊΡ‚ΠΎΠ². */
  ms_ticker_attach(ticker_tx, voidsource);

/* НастраиваСм структуру, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ сигналом Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. */ 
 MSDtmfGenCustomTone dtmf_cfg; 
 dtmf_cfg.tone_name[0] = 0; 
 dtmf_cfg.duration = 1000; 
 dtmf_cfg.frequencies[0] = 440;

/* Π‘ΡƒΠ΄Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΎΠ½, частоту Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΎΠ½Π° установим Π² 0. */  
 dtmf_cfg.frequencies[1] = 0; 
 dtmf_cfg.amplitude = 1.0; 
 dtmf_cfg.interval = 0.;  
 dtmf_cfg.repeat_count = 0.;

/* ΠžΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ Ρ†ΠΈΠΊΠ» сканирования Π½Π°ΠΆΠ°Ρ‚Ρ‹Ρ… клавиш. Π’Π²ΠΎΠ΄ нуля Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚
* Ρ†ΠΈΠΊΠ» ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. */  
 char key='9'; 
 printf("НаТмитС ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π·Π°Ρ‚Π΅ΠΌ Π²Π²ΠΎΠ΄.n"  
"Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ 0.n");  
while(key != '0')  
{
 key = getchar();   
 if ((key >= 49) && (key <= 54)) 
   {
      printf("ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: %cn", key);
      /* УстанавливаСм частоту Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π² соотвСтствии с
       * ΠΊΠΎΠ΄ΠΎΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши. */
      dtmf_cfg.frequencies[0] = 440 + 100*(key-49);

      /* Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ c ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ частотой. */
      ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,      (void*)&dtmf_cfg); 
   }
   /* Π£ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ Ρ‚Ρ€Π΅Π΄ Π² спячку Π½Π° 20мс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Ρ€Π΅Π΄Ρ‹ 
   * прилоТСния ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ врСмя Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ. */ 
  ms_usleep(20000);
  }
}

En tot slot, het bestand van de ontvanger:

/* Π€Π°ΠΉΠ» mstest7.c Π˜ΠΌΠΈΡ‚Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. */
include <mediastreamer2/mssndcard.h>
include <mediastreamer2/mstonedetector.h>
include <mediastreamer2/msrtp.h>

/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с функциями управлСния событиями  мСдиастримСра.*/
include <mediastreamer2/mseventqueue.h>
/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» ΠΎΠ±Ρ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. */
include "mstest_common.c"

/* Ѐункция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½   ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ совпадСниС характСристик Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ сигнала с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. */
static void tone_detected_cb(void *data, MSFilter *f, unsigned int event_id,MSToneDetectorEvent *ev)
{ 
 printf("ΠŸΡ€ΠΈΠ½ΡΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: %sn", ev->tone_name);
}

/*----------------------------------------------------------*/
int main()
{ 
 ms_init();

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ экзСмпляры Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ². */  
 MSSndCard *card_playback =  ms_snd_card_manager_get_default_card(ms_snd_card_manager_get()); 
 MSFilter *snd_card_write = ms_snd_card_create_writer(card_playback); 
 MSFilter *detector = ms_filter_new(MS_TONE_DETECTOR_ID);

/* ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ массив находящийся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° Ρ‚ΠΎΠ½ΠΎΠ², ΠΎΠ½ описываСт
* особыС ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Ρ‹ разыскиваСмых сигналов.*/
  ms_filter_call_method(detector, MS_TONE_DETECTOR_CLEAR_SCANS, 0);

/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΊ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. */  
ms_filter_set_notify_callback(detector,  (MSFilterNotifyFunc)tone_detected_cb, NULL);

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ массив, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ описываСт характСристику
* ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΎΠ½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ:
ВСкстовоС имя
* Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта, частота Π² Π³Π΅Ρ€Ρ†Π°Ρ…, Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² миллисСкундах,
* ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 0,775Π’. */
  MSToneDetectorDef scan[6]= 
 {   
    {"V+",440, 100, 0.1}, /* Команда "Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ". */
    {"V-",540, 100, 0.1}, /* Команда "Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ". */
    {"C+",640, 100, 0.1}, /* Команда "Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°". */
    {"C-",740, 100, 0.1}, /* Команда "Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°". */
    {"ON",840, 100, 0.1}, /* Команда "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€". */
    {"OFF", 940, 100, 0.1}/* Команда "Π’Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€". */
  };

/* ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ "ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Ρ‹" сигналов Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Ρ‚ΠΎΠ½ΠΎΠ². */
  int i; 
 for (i = 0; i < 6; i++) 
 { 
   ms_filter_call_method(detector, MS_TONE_DETECTOR_ADD_SCAN,    &scan[i]); 
 }

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π° */
  MSFilter *decoder=ms_filter_create_decoder("PCMU");

/* РСгистрируСм Ρ‚ΠΈΠΏΡ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. */
  register_payloads();

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ RTP-сСссию ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. */
  MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
  RtpSession *rx_rtp_session = create_rtpsession (7010, 7011, FALSE, RTP_SESSION_RECVONLY);
  ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rx_rtp_session);

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ источник Ρ‚Π°ΠΊΡ‚ΠΎΠ² - Ρ‚ΠΈΠΊΠ΅Ρ€. */ 
 MSTicker *ticker_rx = ms_ticker_new();

/* БоСдиняСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊΠ°. */
  ms_filter_link(rtprecv, 0, decoder, 0);
  ms_filter_link(decoder, 0, detector, 0);
  ms_filter_link(detector, 0, snd_card_write, 0);

/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ источник Ρ‚Π°ΠΊΡ‚ΠΎΠ². */
  ms_ticker_attach(ticker_rx, rtprecv);
  char key='9';
  printf( "Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ 0.n");
  while(key != '0') 
 {
    key = getchar();
   /* Π£ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ Ρ‚Ρ€Π΅Π΄ Π² спячку Π½Π° 20мс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Ρ€Π΅Π΄Ρ‹    * прилоТСния ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ врСмя Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ. */
   ms_usleep(20000); 
 }
}

We compileren de zender en ontvanger en starten elk in hun eigen console. Vervolgens zou alles als voorheen moeten werken β€” alleen moeten we getallen van 1 tot 6 invoeren in de console van de zender, en de reacties daarop zouden in de console van de ontvanger moeten verschijnen. De tonen moeten dynamisch te horen zijn. Als alles goed is, is er een verbinding tussen de ontvanger en de zender β€” er vindt een continue overdracht van RTP-pakketten van de zender naar de ontvanger plaats.

Het is nu tijd om de verkeersanalysator in te stellen, daarvoor installeren we de consoleversie van het uitstekende programma Wireshark β€” het heet TShark. Ik heb TShark gekozen voor de verdere uitleg om het beschrijven van de programmabeheersing te vergemakkelijken. Met Wireshark zou ik een hoop schermafbeeldingen nodig hebben die snel verouderd raken met de release van een nieuwe versie van Wireshark.

Als je weet hoe je Wireshark moet gebruiken, kun je het gebruiken om onze voorbeelden te bestuderen. Maar ik raad je ook aan om TShark onder de knie te krijgen, omdat dit je helpt om het testen van je VoIP-applicaties te automatiseren en om op afstand vast te leggen.

Installeer TShark met het commando:

$ sudo apt-get install tshark

Traditioneel controleren we het resultaat van de installatie door de versie van het programma op te vragen:

$ tshark --version

Als we een adequate reactie krijgen, gaan we verder.

Aangezien onze pakketten momenteel alleen binnen de computer circuleren, kunnen we zeggen dat tshark alleen deze pakketten weergeeft. Hiervoor moeten we de pakketten vastleggen vanaf de interface loopback (teruglopende lus), waarbij we TShark de optie meegeven -i lo:

$ sudo tshark -i lo

In de console zullen er direct meldingen verschijnen over de door onze zender verzonden pakketten (continu, ongeacht of we de knop op de afstandsbediening hebben ingedrukt of niet). Mogelijk zijn er op uw computer programma's die ook pakketten via de lokale lus verzenden, in dat geval krijgen we een mengelmoes van onze en andere pakketten. Om er zeker van te zijn dat we in de lijst alleen de pakketten zien die door onze afstandsbediening zijn verzonden, voegen we een filter toe op het poortnummer. Door op Ctrl-C te drukken stoppen we de analyzer en geven we het filter in voor het poortnummer dat de afstandsbediening gebruikt als doellpoort voor zijn verzending (8010): -f "udp port 8010"Nu ziet onze opdrachtregel er als volgt uit:

$ sudo tshark -i lo -f "udp port 8010"

In de console verschijnt de uitvoer in de volgende vorm (de eerste 10 regels):

 1 0.000000000    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172 
 2 0.020059705    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172
 3 0.040044409    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172 
 4 0.060057104    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172
 5 0.080082311    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172  
 6 0.100597153    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172 
 7 0.120122668    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172
 8 0.140204789    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172
 9 0.160719008    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172
10 0.180673685    127.0.0.1 β†’ 127.0.0.1    UDP 214 8010 β†’ 7010 Len=172

Dit zijn nog geen pakketten, maar een genummerde lijst van gebeurtenissen, waarbij elke regel een melding is over het volgende pakket dat op de interface is waargenomen. Aangezien we al voor de filter van pakketten hebben gezorgd, zien we in de lijst alleen meldingen over de pakketten van onze zender. Laten we deze tabel nu ontcijferen aan de hand van de kolomnummers:

Nummer van de gebeurtenis.
Tijdstip van optreden.
IP-adres van de bron van het pakket en IP-adres van de ontvanger van het pakket.
Protocol van het pakket, weergegeven als UDP, aangezien RTP-pakketten als payload binnen UDP-pakketten worden verzonden.
Grootte van het pakket in bytes.
Poortnummer van de bron van het pakket en poortnummer van de ontvanger van het pakket.
Grootte van de payload van het pakket, hieruit kunnen we concluderen dat onze zender RTP-pakketten vormt van 172 bytes, die als een eend in een kist binnen UDP-pakketten van 214 bytes zitten.
Het is nu tijd om naar de binnenkant van UDP-pakketten te kijken. We zullen TShark starten met een uitgebreide set parameters:

sudo tshark -i lo -f "udp port 8010"  -P -V -O rtp -o rtp.heuristic_rtp:TRUE -x

Als resultaat zal de uitvoer van het programma worden verrijkt: aan elk evenement wordt de decodering van de interne inhoud van het pakket dat het heeft veroorzaakt, toegevoegd. Om de uitvoergegevens beter te bekijken kunt u TShark stoppen met Ctrl-C of de uitvoer dupliceren naar een bestand door een pijp aan het startcommando toe te voegen met het programma tee en de bestandnaam op te geven, tee :

$ sudo tshark -i lo -f "udp port 8010"  -P -V -O rtp -o rtp.heuristic_rtp:TRUE -x | tee log.txt

Laten we nu kijken naar wat we in het bestand hebben gekregen, hier is het eerste pakket daaruit:

1 0.000000000    127.0.0.1 β†’ 127.0.0.1    RTP 214 PT=ITU-T G.711 PCMU, SSRC=0x6B8B4567, Seq=58366, Tijd=355368720
Frame 1: 214 bytes op de draad (1712 bits), 214 bytes vastgelegd (1712 bits) op interface 0
Ethernet II, Src: 00:00:00_00:00:00 (00:00:00:00:00:00), Dst: 00:00:00_00:00:00 (00:00:00:00:00:00)
Internet Protocol Versie 4, Src: 127.0.0.1, Dst: 127.0.0.1
User Datagram Protocol, Src Poort: 8010, Dst Poort: 7010
Real-Time Transport Protocol    [Stroom ingesteld door HEUR RT (frame 1)]
        [Instelling frame: 1] 
       [Instelling Methode: HEUR RT]
    10.. .... = Versie: RFC 1889 Versie (2)
    ..0. .... = Padding: Vals
    ...0 .... = Extensie: Vals
    .... 0000 = Aantal bijdragende bronidentificators: 0   
   0... .... = Marker: Vals
    Payload type: ITU-T G.711 PCMU (0)
    Volgnummer: 58366    [Uitgebreed volgnummer: 58366]
    Tijdstempel: 355368720
    Synchronisatiebron identificator: 0x6b8b4567 (1804289383)
    Payload: ffffffffffffffffffffffffffffffffffffffffffffffff...

0000  00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00   ..............E.
0010  00 c8 3c 69 40 00 40 11 ff b9 7f 00 00 01 7f 00   ..<i@.@.........
0020  00 01 1f 4a 1b 62 00 b4 fe c7 80 00 e3 fe 15 2e   ...J.b..........
0030  7f 10 6b 8b 45 67 ff ff ff ff ff ff ff ff ff ff   ..k.Eg..........
0040  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0050  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0060  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0070  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0080  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0090  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00a0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00b0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00c0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00d0  ff ff ff ff ff ff                                  ......

In het volgende artikel zullen we de informatie die in deze listing staat analyseren en onvermijdelijk spreken over de interne structuur van het RTP-pakket.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers πŸ”₯ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster