Uma chamada SIP básica é um handshake de três vias INVITE/200/ACK seguido de média e de um BYE. O chamador envia INVITE (com uma oferta SDP); o chamado responde 100 Trying, 180 Ringing e depois 200 OK (com a resposta SDP); o chamador envia ACK; a média RTP flui; e qualquer das partes termina a chamada com BYE, respondido por 200 OK.
Estabelecer a chamada
A chamada começa com o UAC do chamador a enviar um INVITE em direção ao chamado, transportando uma oferta SDP que descreve a média que quer. À medida que o pedido atravessa proxies, cada um pode devolver 100 Trying para parar as retransmissões. Quando o telefone do chamado começa a tocar, um 180 Ringing regressa — é isto que produz o ringback. Se for necessária early media (anúncios de rede, ringback da rede remota), um 183 Session Progress com SDP pode abrir o caminho de média antes do atendimento.
Atendimento e o handshake de três vias
Quando o chamado atende, o seu UAS devolve um 200 OK transportando a resposta SDP que finaliza a negociação de média. O chamador confirma com um ACK — a terceira etapa do handshake do INVITE — e o diálogo fica agora totalmente estabelecido, identificado pelo Call-ID mais ambos os tags. A troca de três vias INVITE/200/ACK, em vez de um simples pedido/resposta, é o que torna o estabelecimento de chamadas SIP fiável mesmo sobre UDP com perdas.
Alice (UAC) Bob (UAS)
│ INVITE (SDP offer) ─────────▶ │
│ ◀───────── 100 Trying │
│ ◀───────── 180 Ringing │ (Bob's phone rings)
│ ◀───────── 200 OK (SDP answer) │ (Bob answers)
│ ACK ─────────▶ │
│ ◀═══════ RTP media (both ways) ═▶ │ (the conversation)
│ BYE ─────────▶ │ (Alice hangs up)
│ ◀───────── 200 OK │Média e mudanças a meio da chamada
Assim que o ACK completa o estabelecimento, a média RTP flui diretamente entre os pontos terminais (ou via um relé de média) nas portas que o SDP negociou, independentemente do caminho de sinalização. As mudanças a meio da chamada fazem-se com um re-INVITE ou UPDATE transportando um novo SDP — é assim que se fazem a espera (a=sendonly), a retoma (a=sendrecv), a renegociação de codec e a adição de vídeo, tudo dentro do diálogo existente sem largar a chamada.
Terminar a chamada — BYE
Qualquer das partes termina uma chamada estabelecida enviando BYE, que a outra confirma com 200 OK; o diálogo é então fechado e a média para. O BYE é um pedido dentro do diálogo, pelo que transporta o Call-ID estabelecido, o tag do From, o tag do To e o próximo CSeq. Por ser uma transação normal, um BYE perdido é retransmitido até ser confirmado, para que ambos os lados convirjam no fim da chamada.
Abortar uma chamada em curso — CANCEL
Se o chamador desiste antes de o chamado atender — a chamada ainda está a tocar — o UAC envia CANCEL, não BYE, porque ainda não chegou uma resposta final. O chamado para de tocar e devolve 487 Request Terminated para o INVITE original, que o chamador confirma com ACK. O CANCEL só é válido nesta janela pré-atendimento; assim que um 200 OK foi recebido, a chamada está estabelecida e o BYE é a forma de a terminar.
| Situação | Método | Resultado |
|---|---|---|
| Chamada atendida, agora desligue | BYE | 200 OK; diálogo fechado |
| O telefone continua a tocar, mas a pessoa que ligou desiste | CANCEL | 487 Request Terminated no INVITE |
| O destinatário rejeita enquanto toca | (resposta) 486/603 | Busy Here / Decline; o chamador envia ACK |
Perguntas frequentes
Qual é o fluxo de chamada SIP básico?
INVITE (com oferta SDP) → 100 Trying → 180 Ringing → 200 OK (com resposta SDP) → ACK, depois a média RTP flui, e a chamada termina com BYE → 200 OK. O handshake de três vias INVITE/200/ACK estabelece o diálogo; o BYE desfá-lo.
Porque é que o SIP usa um handshake de três vias para o INVITE?
O ACK confirma que o chamador recebeu o 200 OK final, tornando o estabelecimento de chamadas fiável mesmo sobre UDP com perdas. Como um 200 OK a um INVITE é retransmitido até ser confirmado com ACK, a troca de três vias garante que ambos os lados concordam que a chamada está de pé antes de a média ser confiada.
Como coloco uma chamada SIP em espera?
Envie um re-INVITE (ou UPDATE) dentro do diálogo estabelecido transportando um novo SDP que define a direção de média para a=sendonly (e a=sendrecv para retomar). O diálogo e a chamada mantêm-se de pé; só a direção da média muda, o que é também como se entrega a música em espera.
Quando envio CANCEL em vez de BYE?
Envie CANCEL quando a chamada ainda está a tocar e ainda não chegou uma resposta final — aborta o INVITE pendente e produz um 487. Envie BYE só depois de a chamada estar estabelecida (foi recebido um 200 OK). Usar o errado deixa os dois lados fora de sincronia.
A média segue o mesmo caminho que as mensagens SIP?
Normalmente não. A sinalização SIP pode atravessar vários proxies, mas a média RTP flui em portas negociadas separadamente, tipicamente diretamente entre os pontos terminais ou através de um relé de média ou SBC dedicado — e é por isso que a sinalização pode ter sucesso enquanto a média (áudio) falha independentemente.
Especificações de origem
Os padrões publicados nos quais esta página se baseia. Abre num novo separador.