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
= PCMU8
= PCMA101
= 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:
Descrição da Sessão
Descrição de Tempo
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 ?
Abre o
sngrep
Filtra pelo INVITE
Olha o IP e a porta no
c=
e nom=audio
Confere se bate com o IP real do cliente
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, ourtp_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 !!!
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
