O que significam os códigos de resposta SIP e por que recebi um 503?

Um código de resposta SIP indica como uma tentativa de chamada terminou, e um 503 de Bird geralmente é uma recusa que ele não explica na rede, e não uma sobrecarga.

As classes vêm de HTTP, e os números familiares significam aproximadamente o que você espera. Um código de uso comum significa algo bem diferente do que o padrão diz.

O que significam as classes?

SIP usa seis classes de resposta, numeradas como as de HTTP e lidas da mesma forma. A RFC 3261, que define SIP, as nomeia na seção 7.2:

1xx: Provisional -- request received, continuing to process the request;
2xx: Success -- the action was successfully received, understood, and accepted;
3xx: Redirection -- further action needs to be taken in order to complete the request;
4xx: Client Error -- the request contains bad syntax or cannot be fulfilled at this server;
5xx: Server Error -- the server failed to fulfill an apparently valid request;
6xx: Global Failure -- the request cannot be fulfilled at any server.

A única classe sem equivalente em HTTP é 6xx. A diferença entre um 4xx e um 6xx é o escopo. Um erro de cliente diz que este servidor não pôde atender à solicitação, enquanto uma falha global diz que nenhum servidor pode. Não faz sentido tentar uma rota alternativa após um 6xx. Na prática, você raramente verá um.

O que significam os códigos mais comuns?

403 significa que a outra ponta recusou a chamada. 404 significa que o número não está alocado. 486 significa que o sistema final foi alcançado e está ocupado. 503 significa que o servidor não aceitará a solicitação agora. A RFC 3261 os define na seção 21:

  • 403 Forbidden: "The server understood the request, but is refusing to fulfill it."
  • 404 Not Found: "The server has definitive information that the user does not exist at the domain specified in the Request-URI."
  • 486 Busy Here: "The callee's end system was contacted successfully, but the callee is currently not willing or able to take additional calls at this end system."
  • 503 Service Unavailable: "The server is temporarily unable to process the request due to a temporary overloading or maintenance of the server."

A descrição de 486 carrega o diagnóstico: o sistema final foi contatado com sucesso e então recusou. Um 404 significa que o número não está alocado. Ambos apontam para o número que você discou, não para a sua própria configuração. Isso é o oposto do instinto que um 4xx costuma provocar. Um tronco que está funcionando corretamente não precisa de auditoria.

Por que minha chamada recebeu um 503?

Duas coisas bem diferentes respondem 503, e o log de chamadas é o que as separa.

Um 503 com um registro de chamada correspondente é uma recusa. Bird verifica o caller ID, o destino, os limites da conta e o saldo da carteira antes de discar, e uma chamada que falha em uma dessas verificações é recusada com 503. O registro traz o motivo da rejeição indicando qual verificação falhou. Tentar novamente uma chamada idêntica produz a mesma resposta, então a correção está na configuração que o motivo aponta, não em outra tentativa.

O motivo deliberadamente não está na rede. Seu sistema telefônico recebe apenas o 503 sem detalhes; o motivo específico fica no registro de chamada autenticado. Isso é uma decisão de segurança, não uma omissão. Um SIP INVITE é o método que solicita uma chamada, e qualquer pessoa pode enviar um para você. Colocar a causa na resposta revelaria se um destino está habilitado, se um caller ID está verificado ou se uma conta está sem saldo.

Um 503 sem nenhum registro de chamada não é uma recusa. Nenhuma verificação rejeitou a chamada, então não há motivo para ler e nada aparece no log. Este é o caso em que a própria definição da RFC é o melhor guia, e tentar novamente é a atitude certa.

Então o fluxo é: veja o 503 do seu lado, depois procure a chamada no log. Se ela estiver lá, o motivo da rejeição indica o que alterar, e cada motivo com sua correção está listado em chamadas rejeitadas. Se não estiver, trate como transitório e tente novamente em vez de procurar uma configuração para corrigir.

Rejected, Failed ou outra coisa?

O código SIP é apenas metade da resposta. O status da chamada é a outra metade, e ler os dois juntos é o que torna cada um útil.

StatusO que aconteceu
answeredO destino atendeu
no_answerTocou e não foi atendida antes de expirar
rejectedFoi recusada em vez de encaminhada
failedFoi tentada e não funcionou, e a resposta SIP é o que veio de volta
unknownNenhuma resposta final chegou, então o resultado não pôde ser determinado

Rejected abrange duas recusas diferentes, e o motivo da rejeição é o que as separa. Se houver um motivo, Bird recusou a chamada e o motivo indica a verificação que falhou, com o 503 acima como código. Se não houver motivo, a outra ponta a recusou diretamente e a resposta SIP traz o código da própria outra ponta. Uma chamada recebida que o número discado rejeitou também é marcada como rejected sem motivo, porque não falhou em nenhuma verificação de Bird. O que o número estava configurado para fazer fica registrado como sua rota de entrada.

Failed não é uma recusa. A chamada foi tentada e não funcionou. É aqui que um 486 ou um 404 se encaixa.

Dois outros status existem no API e nunca chegam a um registro. busy e canceled são reservados para chamadas recebidas entregues aos seus próprios números. busy cobre uma parte chamada que rejeitou a chamada como ocupada. canceled cobre um chamador que desligou antes de ser atendido. Nenhum dos dois é emitido, e ambos os resultados são reportados como failed. Ler failed junto com a resposta SIP é o que os diferencia. Uma ramificação em qualquer um desses status nunca executa, e uma busca nos seus registros por eles não retorna nada.

A tabela acima mostra os resultados que uma chamada encerrada pode ter. Uma chamada ainda em andamento aparece como ringing ou in_progress, então filtrar a lista de chamadas encontra esses dois também. A lista é aberta na outra direção também: trate os que você reconhece e considere um valor desconhecido como um status que você não trata, e não como um erro.

Como vejo isso em muitas chamadas?

Uma chamada por vez é a ferramenta errada para identificar um padrão. O endpoint de estatísticas de voz agrega códigos de resposta em todo o seu tráfego, que é como você diferencia um problema sistêmico de um número ruim.

Um aumento em 503 é sobre a sua conta ou a sua configuração, já que são recusas do próprio Bird. Um aumento em 486 ou 404 é sobre os números sendo discados. O primeiro é algo que você pode corrigir em uma configuração, e o segundo geralmente significa que uma lista precisa de limpeza.

Solução de problemas de voz aborda os casos individuais. O log de chamadas descreve o que cada registro contém, incluindo o ID da chamada para informar quando somente Bird pode resolver um motivo.

Em resumo

  1. Se um 503 é uma recusa depende do log de chamadas.

    Um 503 com um registro é uma recusa, e o registro indica o motivo. Um 503 sem registro não é, e nesse caso vale a pena tentar novamente.

  2. Rejected e Failed são resultados diferentes.

    Rejected significa que a chamada foi recusada. Failed significa que ela foi tentada e não funcionou, e o código SIP é o que veio de volta.

  3. Um 486 ou um 404 diz respeito ao número que você discou.

    Ocupado e não alocado são respostas da outra ponta, então apontam para o destino e não para a sua configuração.

  4. Dois status de chamada existem mas nunca são emitidos.

    busy e canceled são reservados para chamadas recebidas. Nenhum dos dois é emitido, e ambos os resultados são reportados como failed.

Construa na mesma rede.

Uma chave de API de teste é sua imediatamente. A produção é desbloqueada quando adicionar um método de pagamento e verificar um remetente.

Sua próxima ideia. Pronta para conectar.