¿Qué significan los códigos de respuesta SIP y por qué recibí un 503?

Un código de respuesta SIP indica cómo terminó un intento de llamada, y un 503 de Bird suele ser un rechazo que no explica en la red en lugar de una sobrecarga.

Las clases provienen de HTTP, y los números conocidos significan aproximadamente lo que esperas. Un código de uso habitual significa algo bastante distinto de lo que dice el estándar.

¿Qué significan las clases?

SIP usa seis clases de respuesta, numeradas como las de HTTP y con la misma lectura. RFC 3261, que define SIP, las nombra en la sección 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.

La única clase sin equivalente en HTTP es 6xx. La diferencia entre un 4xx y un 6xx es el alcance. Un error de cliente dice que este servidor no pudo completar la solicitud, mientras que un fallo global dice que ningún servidor puede. No tiene sentido probar una ruta alternativa después de un 6xx. En la práctica rara vez verás uno.

¿Qué significan los códigos más comunes?

403 significa que el extremo remoto rechazó la llamada. 404 significa que el número no está asignado. 486 significa que se contactó al sistema final y está ocupado. 503 significa que el servidor no aceptará la solicitud ahora. RFC 3261 los define en la sección 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."

La redacción de 486 contiene el diagnóstico: el sistema final fue contactado con éxito y luego rechazó la llamada. Un 404 significa que el número no está asignado. Ambos apuntan al número que marcaste y no a tu propia configuración. Eso es lo contrario del instinto que suele provocar un 4xx. Un troncal que funciona correctamente no necesita auditoría.

¿Por qué mi llamada recibió un 503?

Dos cosas muy distintas responden con 503, y el registro de llamadas es lo que las diferencia.

Un 503 con un registro de llamada coincidente es un rechazo. Bird comprueba el caller ID, el destino, los límites de la cuenta y el saldo del monedero antes de marcar, y una llamada que no pasa una de esas comprobaciones se rechaza con 503. El registro incluye el motivo de rechazo indicando qué comprobación falló. Reintentar una llamada idéntica da la misma respuesta, así que la solución es el ajuste al que apunta el motivo y no otro intento.

El motivo no está en la red de forma deliberada. Tu sistema telefónico recibe el 503 sin más; el motivo específico vive en el registro autenticado de la llamada. Es una decisión de seguridad, no una omisión. Un SIP INVITE es el método que solicita una llamada, y cualquiera puede enviarte uno. Incluir la causa en la respuesta revelaría si un destino está habilitado, si un caller ID está verificado o si una cuenta no tiene saldo.

Un 503 sin ningún registro de llamada no es un rechazo. Ninguna comprobación rechazó la llamada, así que no hay motivo que leer y nada aparece en el registro. Este es el caso en el que la propia definición del RFC es la mejor guía, y donde reintentar es lo correcto.

El flujo es: ve el 503 en tu lado y luego busca la llamada en el registro. Si está ahí, el motivo de rechazo te dice qué cambiar, y cada motivo con su solución está en llamadas rechazadas. Si no está, trátalo como transitorio y reintenta en lugar de buscar un ajuste que corregir.

¿Rejected, Failed u otra cosa?

El código SIP es solo la mitad de la respuesta. El estado de la llamada es la otra mitad, y leerlos juntos es lo que hace útil a cada uno.

EstadoQué ocurrió
answeredEl destino contestó
no_answerSonó y no fue contestada antes de agotar el tiempo
rejectedFue rechazada en lugar de cursada
failedSe intentó y no funcionó, y la respuesta SIP es lo que se recibió de vuelta
unknownNunca llegó una respuesta final, así que no se pudo determinar el resultado

Rejected cubre dos rechazos distintos, y el motivo de rechazo es lo que los diferencia. Si hay un motivo, Bird rechazó la llamada y el motivo indica la comprobación que falló, con el 503 de arriba como código. Si no hay motivo, el extremo remoto la rechazó directamente y la respuesta SIP lleva el código propio del extremo remoto. Una llamada entrante que el número marcado rechazó también aparece como rejected sin motivo, porque no falló ninguna comprobación de Bird. Lo que el número estaba configurado para hacer queda registrado como su ruta de entrada.

Failed no es un rechazo en absoluto. La llamada se intentó y no funcionó. Aquí es donde aterriza un 486 o un 404.

Dos estados adicionales existen en el API y nunca llegan a un registro. busy y canceled están reservados para llamadas entrantes entregadas a tus propios números. busy cubre a una parte llamada que rechazó la llamada como ocupada. canceled cubre a un llamante que colgó antes de que se contestara. Ninguno se emite, y ambos resultados se reportan como failed. Leer failed junto con la respuesta SIP es lo que los diferencia. Una rama que dependa de cualquiera de esos estados nunca se ejecuta, y una búsqueda en tus registros por ellos no devuelve nada.

La tabla anterior muestra los resultados que puede tener una llamada finalizada. Una llamada aún en curso aparece como ringing o in_progress, así que al filtrar la lista de llamadas también encontrarás esos dos. La lista es abierta en el otro sentido: maneja los que reconozcas y trata un valor desconocido como un estado que no manejas en lugar de como un error.

¿Cómo veo esto en muchas llamadas a la vez?

Una llamada a la vez es la herramienta equivocada para detectar un patrón. El endpoint de estadísticas de voz agrega códigos de respuesta en todo tu tráfico, y así distingues un problema sistémico de un número incorrecto.

Un aumento en 503 tiene que ver con tu cuenta o tu configuración, ya que son rechazos propios de Bird. Un aumento en 486 o 404 tiene que ver con los números que se están marcando. Lo primero se corrige en un ajuste, y lo segundo suele significar que una lista necesita limpieza.

Solución de problemas de voz recorre los casos individuales. El registro de llamadas cubre lo que contiene cada registro, incluido el call ID que debes citar cuando solo Bird puede resolver un motivo.

En resumen

  1. Que un 503 sea un rechazo depende del registro de llamadas.

    Un 503 con registro es un rechazo, y el registro indica el motivo. Un 503 sin registro no lo es, y en ese caso vale la pena reintentar.

  2. Rejected y Failed son resultados distintos.

    Rejected significa que la llamada fue rechazada. Failed significa que se intentó y no funcionó, y el código SIP es lo que se recibió de vuelta.

  3. Un 486 o un 404 se refieren al número que marcaste.

    Busy y unallocated son respuestas del extremo remoto, así que apuntan al destino y no a tu configuración.

  4. Dos estados de llamada existen pero nunca se emiten.

    busy y canceled están reservados para llamadas entrantes. Ninguno se emite, y ambos resultados se reportan como failed.

Construye sobre la misma red.

Obtén una clave API de prueba de inmediato. El acceso a producción se desbloquea cuando añades un método de pago y verificas un remitente.

Tu próxima idea. Lista para conectar.