Les classes sont héritées de HTTP, et les numéros familiers signifient à peu près ce que vous attendez. Un code d'usage courant signifie quelque chose de très différent de ce que dit la norme.
Que signifient les classes ?
SIP utilise six classes de réponse, numérotées comme celles de HTTP et lues de la même façon. La RFC 3261, qui définit SIP, les nomme dans la section 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 seule classe sans équivalent HTTP est 6xx. La différence entre une 4xx et une 6xx est la portée. Une erreur client indique que ce serveur n'a pas pu traiter la requête, tandis qu'une erreur globale indique qu'aucun serveur ne le peut. Tenter une route alternative après une 6xx est inutile. En pratique, vous en verrez rarement.
Que signifient les codes courants ?
403 signifie que le côté distant a refusé l'appel. 404 signifie que le numéro n'est pas attribué. 486 signifie que le système distant a été joint et qu'il est occupé. 503 signifie que le serveur n'accepte pas la requête maintenant. La RFC 3261 les définit dans la section 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 formulation de 486 porte le diagnostic : le système distant a été contacté avec succès, puis a décliné. Un 404 signifie que le numéro n'est pas attribué. Les deux désignent le numéro que vous avez composé plutôt que votre propre configuration. C'est l'inverse du réflexe qu'un 4xx déclenche habituellement. Un trunk qui fonctionne correctement n'a pas besoin d'être audité.
Pourquoi mon appel a-t-il reçu un 503 ?
Deux choses très différentes répondent 503, et c'est le journal d'appels qui les distingue.
Un 503 avec un enregistrement d'appel correspondant est un refus. Bird vérifie l'identifiant de l'appelant, la destination, les limites du compte et le solde du portefeuille avant de lancer l'appel, et un appel échouant à l'une de ces vérifications est refusé avec 503. L'enregistrement contient la raison du rejet, indiquant la vérification échouée. Réessayer un appel identique donne la même réponse, donc la solution est le paramètre vers lequel la raison pointe plutôt qu'une nouvelle tentative.
La raison est délibérément absente du réseau. Votre système téléphonique reçoit le 503 brut ; la raison précise se trouve dans l'enregistrement d'appel authentifié. C'est un choix de sécurité, pas un oubli. Un SIP INVITE est la méthode qui demande un appel, et n'importe qui peut vous en envoyer un. Mettre la cause dans la réponse révélerait si une destination est activée, si un identifiant d'appelant est vérifié, ou si un compte est à court de solde.
Un 503 sans aucun enregistrement d'appel n'est pas un refus. Aucune vérification n'a rejeté l'appel, il n'y a donc pas de raison à lire et rien n'apparaît dans le journal. C'est le cas où la définition propre de la RFC est le meilleur guide, et où réessayer est la bonne approche.
Le processus est donc : constatez le 503 de votre côté, puis cherchez l'appel dans le journal. S'il y est, la raison du rejet vous indique ce qu'il faut corriger, et chaque raison avec sa solution est listée sous appels rejetés. S'il n'y est pas, traitez-le comme transitoire et réessayez plutôt que de chercher un paramètre à corriger.
Rejected, Failed, ou autre chose ?
Le code SIP n'est que la moitié de la réponse. Le statut de l'appel est l'autre moitié, et c'est leur lecture conjointe qui rend l'un ou l'autre utile.
| Statut | Ce qui s'est passé |
|---|---|
answered | La destination a décroché |
no_answer | L'appel a sonné et n'a pas été décroché avant l'expiration du délai |
rejected | L'appel a été refusé plutôt qu'acheminé |
failed | L'appel a été tenté sans aboutir, et la réponse SIP est ce qui a été renvoyé |
unknown | Aucune réponse finale n'est arrivée, le résultat n'a pas pu être déterminé |
Rejected couvre deux refus différents, et la raison du rejet est ce qui les distingue. S'il y a une raison, Bird a refusé l'appel et la raison nomme la vérification échouée, avec le 503 ci-dessus comme code. S'il n'y a pas de raison, le côté distant l'a décliné directement et la réponse SIP porte le propre code du côté distant. Un appel entrant que le numéro composé a rejeté est également marqué rejected sans raison, car il n'a échoué à aucune vérification de Bird. Ce que le numéro était configuré pour faire est enregistré comme sa route entrante.
Failed n'est pas du tout un refus. L'appel a été tenté sans aboutir. C'est là qu'un 486 ou un 404 se retrouve.
Deux statuts supplémentaires existent dans le API et n'atteignent jamais un enregistrement. busy et canceled sont réservés aux appels entrants délivrés à vos propres numéros. busy couvre un correspondant appelé qui a rejeté l'appel comme occupé. canceled couvre un appelant qui a raccroché avant que l'appel soit décroché. Aucun des deux n'est émis, et les deux résultats sont signalés comme failed. Lire failed conjointement avec la réponse SIP est ce qui permet de les distinguer. Une branche sur l'un ou l'autre statut ne s'exécute jamais, et une recherche dans vos enregistrements ne renvoie rien.
Le tableau ci-dessus présente les résultats qu'un appel terminé peut porter. Un appel encore en cours affiche ringing ou in_progress, vous les rencontrerez donc aussi en filtrant la liste d'appels. La liste est également ouverte dans l'autre sens : traitez les statuts que vous gérez et considérez une valeur inconnue comme un statut que vous ne gérez pas plutôt que comme une erreur.
Comment voir cela sur un grand nombre d'appels ?
Un appel à la fois n'est pas le bon outil pour détecter un schéma. Le point de terminaison de statistiques vocales agrège les codes de réponse sur l'ensemble de votre trafic, ce qui permet de distinguer un problème systémique d'un mauvais numéro.
Une hausse de 503 concerne votre compte ou votre configuration, car ce sont les propres refus de Bird. Une hausse de 486 ou de 404 concerne les numéros composés. La première est corrigeable dans un paramètre, et la seconde signifie généralement qu'une liste doit être nettoyée.
Dépannage vocal traite les cas individuels. Le journal d'appels décrit le contenu de chaque enregistrement, y compris l'identifiant d'appel à citer lorsque seul Bird peut résoudre une raison.
En bref
Qu'un 503 soit un refus dépend du journal d'appels.
Un 503 avec un enregistrement est un refus, et l'enregistrement indique la raison. Un 503 sans enregistrement ne l'est pas, et celui-là mérite un nouvel essai.
Rejected et Failed sont des résultats différents.
Rejected signifie que l'appel a été refusé. Failed signifie qu'il a été tenté sans aboutir, et le code SIP est ce qui a été renvoyé.
Un 486 ou un 404 concerne le numéro que vous avez composé.
Busy et unallocated sont des réponses du côté distant, elles désignent donc la destination plutôt que votre configuration.
Deux statuts d'appel existent mais ne sont jamais émis.
busyetcanceledsont réservés aux appels entrants. Aucun des deux n'est émis, et les deux résultats sont signalés commefailed.