I. Visão geral
Existem duas maneiras de calcular o RTT no WebRTC:
Com base no cálculo do remetente do fluxo de mídia. Calculado pelas informações transportadas no Relatório do Remetente (SR) e Relatório do Receptor (RR).
Com base no cálculo do receptor de fluxo de mídia. As informações do bloco de relatório de tempo de referência do receptor e do bloco de relatório DLRR são transmitidas por meio de relatórios estendidos RTCP RTCP (XR).
Os princípios de cálculo do RTT nos dois métodos são os mesmos. Apresente o método de cálculo XR, porque em alguns cenários, um dos dois endpoints envia apenas dados de mídia e o outro apenas recebe dados de mídia. Nesse cenário, a extremidade receptora não enviará SR, o que impossibilita o cálculo do RTT. Portanto, a maneira como o RTCP XR é calculado na extremidade receptora é estendida.
WebRTC obtém o parâmetro de atraso RTT em RTCPReceiver::OnPeriodicRttUpdate. Quando o cliente deste lado estiver enviando dados, obtenha o valor calculado com base no remetente do fluxo de mídia. Quando o cliente recebe apenas dados de mídia, ele obtém o valor calculado com base na extremidade receptora do fluxo de mídia.
2. Cálculo baseado no remetente do fluxo de mídia
O remetente precisa empacotar o Sender Report (SR) e analisar e processar o protocolo Receiver Report (RR).
1. Acordo do Relatório do Remetente (SR)
Carimbo de data/hora NTP: 64 bits. Registra o timestamp NTP quando o SR foi enviado.
O exemplo do wireshark é o seguinte:
O código RTCPSender::BuildSR é implementado da seguinte forma:
2. Protocolo de Relatório do Receptor (RR)
último SR(LSR): 32 bits. Os 32 bits no meio do timestamp NTP de 64 bits (o timestamp NTP refere-se ao tempo absoluto, relativo ao tempo experimentado às 00:00:00 de 1º de janeiro de 1900, em segundos. O timestamp NTP completo é representado por 64 bits , e a metade esquerda dos 32 bits representa um número inteiro. A metade direita dos 32 bits representa o decimal, geralmente por uma questão de compacidade, os 32 bits do meio podem ser usados para representação, neste momento o inteiro e o decimal são representados por 16 bits, respectivamente ). Registra o horário NTP do último SR enviado pelo SSRC_n de origem, obtido do timestamp NTP do registro SR recebido. O valor é 0 se nenhum SR foi recebido.
atraso desde o último SR (DLSR): 32 bits. Em unidades de 1/65536 (2^16) segundos. Ele registra o intervalo de tempo desde o recebimento do SR enviado pela fonte SSRC_n pela última vez até o envio do RR atualmente. O valor é 0 se nenhum SR foi recebido.
O exemplo do wireshark é o seguinte:
- O receptor de mídia encapsula o pacote RR
PlatformThread::StartThread(void * param)
->PlatformThread::Run()
->ProcessThreadImpl2::Run(void * obj)
->ProcessThreadImpl2::Process()
->ModuleRtpRtcpImpl2::Process() //配置周期发送RTCP的RR报文TimeToSendRTCPReport&SendRTCP
->RTCPSender::SendRTCP
->RTCPSender::ComputeCompoundRTCPPacket
->RTCPSender::BuildRR
->RTCPSender::CreateReportBlocks
A extremidade receptora envia pacotes RTCP RR periodicamente. last SR é o timestamp NTP da última mensagem RTCP SR recebida pelo receptor.
- O remetente de mídia analisa e calcula o valor RTT
ModuleRtpRtcpImpl2::IncomingRtcpPacket
->RTCPReceiver::IncomingPacket
->RTCPReceiver::IncomingPacket
->RTCPReceiver::ParseCompoundPacket
->RTCPReceiver::HandleReceiverReport
->RTCPReceiver::HandleReportBlock
A função RTCPReceiver::HandleReportBlock obtém o tempo NTP atual do remetente e, em seguida, extrai last_sr e delay_since_last_sr da mensagem RR para calcular o tempo de atraso RTT.
3. Cálculo baseado no receptor de stream de mídia
1, Bloco de Relatório de Tempo de Referência do Receptor
Exemplo de Wireshark:
2, Bloco de Relatório DLRR
Exemplo de Wireshark:
O receptor calcula o atraso RTT na função RTCReceiver::HandleXrDlrrReportBlock.
referência:
Pesquisa WebRTC: atraso de ida e volta de parâmetros estatísticos - Sword Crazy