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
sngrepFiltra pelo INVITE
Olha o IP e a porta no
c=e nom=audioConfere 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/localnetno Asterisk, ourtp_symmetric+rewrite_contactno 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 !!!
Comments
Join the discussionNo comments yet. Be the first to comment.




