De klassen komen van HTTP, en de bekende nummers betekenen ongeveer wat je verwacht. Eén code in dagelijks gebruik betekent iets heel anders dan wat de standaard zegt.
Wat betekenen de klassen?
SIP gebruikt zes responsklassen, genummerd als die van HTTP en op dezelfde manier te lezen. RFC 3261, die SIP definieert, benoemt ze in sectie 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.
De enige klasse zonder HTTP-equivalent is 6xx. Het verschil tussen een 4xx en een 6xx is reikwijdte. Een clientfout zegt dat deze server het verzoek niet kon verwerken, terwijl een global failure zegt dat geen enkele server dat kan. Het heeft geen zin een alternatieve route te proberen na een 6xx. In de praktijk zie je er zelden een.
Wat betekenen de gangbare codes?
403 betekent dat de andere kant de oproep weigerde. 404 betekent dat het nummer niet is toegewezen. 486 betekent dat het eindsysteem is bereikt en bezet is. 503 betekent dat de server het verzoek nu niet aanneemt. RFC 3261 definieert ze in sectie 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."
De bewoording bij 486 draagt de diagnose: het eindsysteem is succesvol bereikt en weigerde vervolgens. Een 404 betekent dat het nummer niet is toegewezen. Beide wijzen op het nummer dat je belde, niet op je eigen inrichting. Dat is het tegenovergestelde van de reflex die een 4xx meestal oproept. Een trunk die correct werkt hoeft niet onderzocht te worden.
Waarom kreeg mijn oproep een 503?
Twee heel verschillende dingen beantwoorden 503, en het oproeplogboek maakt het verschil.
Een 503 met een bijbehorend oproeprecord is een weigering. Bird controleert de beller-ID, de bestemming, de limieten van het account en het walletsaldo voordat er wordt uitgebeld, en een oproep die een van die controles niet doorstaat wordt geweigerd met 503. Het record bevat de weigeringsreden met de naam van de controle die faalde. Dezelfde oproep opnieuw proberen levert hetzelfde antwoord, dus de oplossing is de instelling waar de reden naar verwijst, niet nog een poging.
De reden staat bewust niet op de lijn. Je telefoonsysteem krijgt alleen de kale 503; de specifieke reden staat in het geauthenticeerde oproeprecord. Dat is een beveiligingskeuze, geen omissie. Een SIP INVITE is de methode die een oproep aanvraagt, en iedereen kan je er een sturen. De oorzaak in het antwoord zetten zou onthullen of een bestemming is ingeschakeld, of een beller-ID is geverifieerd, of dat een account geen saldo meer heeft.
Een 503 zonder enig oproeprecord is geen weigering. Geen controle heeft de oproep afgewezen, dus er is geen reden om te lezen en er verschijnt niets in het logboek. Dit is het geval waarin de definitie van de RFC zelf de betere leidraad is, en waarin opnieuw proberen de juiste stap is.
De werkwijze is dus: zie de 503 aan je kant en zoek de oproep in het logboek. Als hij er staat, vertelt de weigeringsreden je wat je moet aanpassen, en elke reden met bijbehorende oplossing staat onder geweigerde oproepen. Als hij er niet staat, beschouw het als tijdelijk en probeer opnieuw in plaats van een instelling te zoeken om aan te passen.
Rejected, Failed, of iets anders?
De SIP-code is maar de helft van het antwoord. De status van de oproep is de andere helft, en pas als je ze samen leest wordt een van beide nuttig.
| Status | Wat er gebeurde |
|---|---|
answered | De bestemming nam op |
no_answer | Het ging over en werd niet opgenomen voordat de time-out verstreek |
rejected | De oproep is geweigerd in plaats van doorgezet |
failed | De oproep is geprobeerd en lukte niet, en het SIP-antwoord is wat terugkwam |
unknown | Er kwam nooit een definitief antwoord, dus de uitkomst kon niet worden vastgesteld |
Rejected omvat twee verschillende weigeringen, en de weigeringsreden maakt het verschil. Als er een reden is, heeft Bird de oproep geweigerd en noemt de reden de controle die faalde, met 503 hierboven als code. Als er geen reden is, heeft de andere kant de oproep direct afgewezen en bevat het SIP-antwoord de code van de andere kant. Een inkomende oproep die door het gebelde nummer is afgewezen krijgt ook rejected zonder reden, omdat die geen controle van Bird heeft gefaald. Wat het nummer moest doen staat vastgelegd als inbound route.
Failed is helemaal geen weigering. De oproep is geprobeerd en lukte niet. Hier belandt een 486 of een 404.
Twee verdere statussen bestaan in de API en bereiken nooit een record. busy en canceled zijn gereserveerd voor inkomende oproepen die aan je eigen nummers worden afgeleverd. busy betreft een gebelde partij die de oproep als bezet afwees. canceled betreft een beller die ophing voordat er werd opgenomen. Geen van beide wordt uitgegeven, en beide uitkomsten worden gerapporteerd als failed. Door failed samen met het SIP-antwoord te lezen kun je ze onderscheiden. Een branch op een van beide statussen wordt nooit uitgevoerd, en een zoekopdracht in je records levert niets op.
De tabel hierboven bevat de uitkomsten die een beëindigde oproep kan dragen. Een oproep die nog loopt heeft ringing of in_progress, dus bij het filteren van de oproeplijst kom je die twee ook tegen. De lijst is ook open in de andere richting: verwerk de statussen die je kent en behandel een onbekende waarde als een status die je niet verwerkt, niet als een fout.
Hoe zie ik dit over veel oproepen heen?
Eén oproep tegelijk is het verkeerde middel voor een patroon. Het voice-statistiekenendpoint aggregeert responscodes over je verkeer, en zo onderscheid je een systeembreed probleem van een slecht nummer.
Een stijging in 503 gaat over je account of je configuratie, want dat zijn de eigen weigeringen van Bird. Een stijging in 486 of 404 gaat over de nummers die worden gebeld. Het eerste kun je oplossen met een instelling, en het tweede betekent meestal dat een lijst opgeschoond moet worden.
Voice-probleemoplossing behandelt de individuele gevallen. Het oproeplogboek beschrijft wat elk record bevat, inclusief de oproep-ID om te vermelden wanneer alleen Bird een reden kan achterhalen.
Kort gezegd
Of een 503 een weigering is, hangt af van het oproeplogboek.
Een 503 met een record is een weigering, en het record noemt de reden. Een 503 zonder record is dat niet, en die kun je opnieuw proberen.
Rejected en Failed zijn verschillende uitkomsten.
Rejected betekent dat de oproep is geweigerd. Failed betekent dat de oproep is geprobeerd en niet lukte, en de SIP-code is wat terugkwam.
Een 486 of een 404 gaat over het nummer dat je belde.
Busy en unallocated zijn antwoorden van de andere kant, dus ze wijzen op de bestemming en niet op je configuratie.
Twee oproepstatussen bestaan maar worden nooit uitgegeven.
busyencanceledzijn gereserveerd voor inkomende oproepen. Geen van beide wordt uitgegeven, en beide uitkomsten worden gerapporteerd alsfailed.