SDP: Session Description Protocol

Quando você realiza uma chamada SIP, o protocolo SIP é responsável apenas pela sinalização — aquelas mensagens como INVITE, 180 Ringing, 200 OK... em resumo, é ele quem "faz acontecer" a chamada.

Mas o áudio mesmo? A história é outra. Quem organiza essa parte é o SDP, que vem embutido nas mensagens SIP, geralmente no INVITE e no 200 OK.

Se uma chamada está sem áudio, o problema quase sempre está no SDP ou no fluxo RTP (que é por onde o áudio realmente passa).


O SDP (Session Description Protocol) é um protocolo usado para descrever sessões de mídia. Ele informa:

  • Quais codecs serão utilizados

  • Qual IP e porta devem ser usados para o envio de áudio

  • Qual protocolo de transporte será adotado

  • E outras características da mídia da chamada

Essas informações vêm no bloco SDP, que acompanha o SIP, e geralmente têm a seguinte estrutura:

v=0
o=- 12345 12345 IN IP4 192.168.0.10
s=-
c=IN IP4 192.168.0.10
t=0 0
m=audio 4000 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ptime:20

Explicando:

  • v=0: Versão do protocolo SDP (sempre zero).

  • o=- 12345 12345 IN IP4 192.168.0.10: Identificador da sessão, origem e IP.

  • s=-: Nome da sessão .

  • c=IN IP4 192.168.0.10: Endereço IP para o envio/recebimento da mídia.

  • t=0 0: Início e fim da sessão (0 0 significa que não expira).

  • m=audio 4000 RTP/AVP 0 8 101: Tipo de mídia (áudio), porta (4000), protocolo (RTP/AVP), e os payload types:

    • 0 = PCMU

    • 8 = PCMA

    • 101 = DTMF (teclas)

  • a=rtpmap: Mapeia cada payload type para codec e taxa de amostragem.

  • a=fmtp:101 0-15: Formato dos eventos DTMF (teclas 0 a 15).

  • a=ptime:20: Duração de cada pacote de áudio (20ms).

Estrutura do SDP

Um pacote SDP tem três blocos principais:

  1. Descrição da Sessão

  2. Descrição de Tempo

  3. Descrição de Mídia

Sessão

v=  (versão do protocolo SDP, sempre 0)
o=  (originador e ID da sessão, inclui IP)
s=  (nome da sessão)
i=* (informações opcionais da sessão)
u=* (URL com mais info)
e=* (e-mail de contato)
p=* (telefone de contato)
c=* (informações de conexão)
b=* (limites de largura de banda, se houver)
z=* (ajustes de fuso horário, se aplicável)
k=* (chave de criptografia, raramente usada)
a=* (atributos da sessão — ex: `recvonly`, `sendrecv`, `tool`, etc.)

Tempo

t=  (período em que a sessão está ativa, ex: 0 0)
r=* (repetições, como reuniões semanais – geralmente omitido)

Mídia

m=  (tipo de mídia, porta e protocolo – ex: áudio via RTP)
i=* (título da mídia)
c=* (conexão específica da mídia, se diferente do geral)
b=* (largura de banda por mídia)
k=* (chave de criptografia)
a=* (atributos da mídia – codecs, payloads, etc.)

Como analisar os pacotes com sdp ?

  1. Abre o sngrep

  2. Filtra pelo INVITE

  3. Olha o IP e a porta no c= e no m=audio

  4. Confere se bate com o IP real do cliente

  5. Vê se o codec tá compatível com o que o Asterisk/FreeSWITCH aceita


Dicas rápidas

  • Sempre confira se o cliente tá mandando o IP correto no SDP (senão o RTP vai pro limbo).

  • Prefira usar externip/localnet no Asterisk, ou rtp_symmetric + rewrite_contact no PJSIP. (Isso ajuda muito!)

  • Use o sngrep se quiser ver o áudio passando (ou não).

  • NAT mal feito = 80% dos problemas de áudio.


Aqui estou criando um guia rapido de consulta para oque seria cada letrinha do sdp, na hora de analisar a chamada, voce saber oque é cada letra faz uma diferença imensa, no entanto caso queiram se aprofundar mais no tema podem acessar a RFC do SDP

https://datatracker.ietf.org/doc/html/rfc4566

Valeu pessoal até a proxima !!!

0
Subscribe to my newsletter

Read articles from Hudson Alves Amaral directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Hudson Alves Amaral
Hudson Alves Amaral