Co oznaczają kody odpowiedzi SIP i dlaczego dostałem 503?

Kod odpowiedzi SIP informuje, jak zakończyła się próba połączenia, a 503 od Bird to zwykle odmowa, której przyczyny nie ma w odpowiedzi sieciowej, a nie przeciążenie.

Klasy przenoszą się z HTTP, a znane numery oznaczają mniej więcej to, czego się spodziewasz. Jeden kod w codziennym użyciu oznacza coś zupełnie innego, niż mówi standard.

Co oznaczają klasy?

SIP używa sześciu klas odpowiedzi, numerowanych jak w HTTP i czytanych tak samo. RFC 3261, który definiuje SIP, wymienia je w sekcji 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.

Jedyną klasą bez odpowiednika w HTTP jest 6xx. Różnica między 4xx a 6xx to zasięg. Błąd klienta mówi, że ten serwer nie mógł zrealizować żądania, a błąd globalny mówi, że żaden serwer tego nie zrobi. Nie ma sensu próbować alternatywnej trasy po 6xx. W praktyce rzadko go zobaczysz.

Co oznaczają najczęstsze kody?

403 oznacza, że druga strona odrzuciła połączenie. 404 oznacza, że numer nie jest przydzielony. 486 oznacza, że system docelowy został osiągnięty i jest zajęty. 503 oznacza, że serwer w tej chwili nie przyjmie żądania. RFC 3261 definiuje je w sekcji 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."

Sformułowanie przy 486 niesie diagnozę: system docelowy został skontaktowany pomyślnie, a potem odmówił. 404 oznacza, że numer nie jest przydzielony. Oba wskazują na numer, na który dzwonisz, a nie na Twoją konfigurację. To odwrotność odruchu, jaki zwykle wywołuje 4xx. Łącze, które działa poprawnie, nie wymaga audytu.

Dlaczego moje połączenie dostało 503?

Na 503 odpowiadają dwie zupełnie różne rzeczy, a to, co je rozdziela, to log połączeń.

503 z pasującym rekordem połączenia to odmowa. Bird sprawdza caller ID, numer docelowy, limity konta i stan portfela przed nawiązaniem połączenia, a połączenie, które nie przejdzie jednego z tych sprawdzeń, jest odrzucane kodem 503. Rekord zawiera przyczynę odrzucenia wskazującą sprawdzenie, które się nie powiodło. Ponowienie identycznego połączenia daje tę samą odpowiedź, więc poprawką jest ustawienie, na które wskazuje przyczyna, a nie kolejna próba.

Przyczyna celowo nie jest przesyłana w odpowiedzi sieciowej. Twój system telefoniczny dostaje sam 503; konkretna przyczyna jest zapisana w uwierzytelnionym rekordzie połączenia. To decyzja dotycząca bezpieczeństwa, nie przeoczenie. SIP INVITE to metoda, która żąda połączenia, i każdy może Ci ją wysłać. Umieszczenie przyczyny w odpowiedzi zdradziłoby, czy numer docelowy jest włączony, czy caller ID jest zweryfikowany lub czy na koncie brakuje środków.

503 bez żadnego rekordu połączenia to nie odmowa. Żadne sprawdzenie nie odrzuciło połączenia, więc nie ma przyczyny do odczytania i nic nie pojawia się w logu. To przypadek, w którym lepszym przewodnikiem jest definicja z RFC, i w którym ponowienie jest właściwym krokiem.

Schemat działania jest taki: zobaczysz 503 po swojej stronie, potem szukasz połączenia w logu. Jeśli jest, przyczyna odrzucenia mówi, co zmienić, a każda przyczyna i jej rozwiązanie są opisane w odrzuconych połączeniach. Jeśli go nie ma, potraktuj to jako chwilowy problem i spróbuj ponownie, zamiast szukać ustawienia do poprawienia.

Rejected, Failed czy coś innego?

Kod SIP to tylko połowa odpowiedzi. Status połączenia to druga połowa, a dopiero ich wspólne odczytanie sprawia, że którykolwiek z nich jest przydatny.

StatusCo się stało
answeredNumer docelowy odebrał
no_answerDzwoniło i nie odebrano przed upływem limitu czasu
rejectedZostało odrzucone, a nie zrealizowane
failedZostało podjęte i nie powiodło się, a odpowiedź SIP to kod, który wrócił
unknownŻadna ostateczna odpowiedź nie dotarła, więc nie można było ustalić wyniku

Rejected obejmuje dwa różne rodzaje odmów, a rozróżnia je przyczyna odrzucenia. Jeśli przyczyna istnieje, Bird odrzucił połączenie, a przyczyna wskazuje sprawdzenie, które się nie powiodło, z kodem 503 opisanym wyżej. Jeśli przyczyny nie ma, druga strona odrzuciła połączenie wprost, a odpowiedź SIP zawiera kod drugiej strony. Połączenie przychodzące, które wybrany numer odrzucił, również otrzymuje status rejected bez przyczyny, ponieważ nie oblało żadnego sprawdzenia po stronie Bird. To, co numer miał zrobić, jest zapisane jako jego trasa przychodząca.

Failed to nie odmowa. Połączenie zostało podjęte i nie powiodło się. Tu trafia 486 lub 404.

Dwa dodatkowe statusy istnieją w API i nigdy nie trafiają do rekordu. busy i canceled są zarezerwowane dla połączeń przychodzących dostarczanych na Twoje numery. busy obejmuje wywoływaną stronę, która odrzuciła połączenie jako zajęte. canceled obejmuje dzwoniącego, który się rozłączył, zanim odebrano. Żaden z nich nie jest emitowany, a oba wyniki są raportowane jako failed. Wspólne odczytanie failed i odpowiedzi SIP pozwala je rozróżnić. Gałąź oparta na którymkolwiek z tych statusów nigdy się nie wykona, a wyszukiwanie ich w rekordach nie zwróci wyników.

Powyższa tabela to wyniki, jakie może mieć zakończone połączenie. Trwające połączenie ma status ringing lub in_progress, więc filtrując listę połączeń, napotkasz też te dwa. Lista jest otwarta również w drugą stronę: obsługuj te, które rozpoznajesz, a nierozpoznaną wartość traktuj jako status, którego nie obsługujesz, a nie jako błąd.

Jak to zobaczyć w skali wielu połączeń?

Analiza pojedynczych połączeń to złe narzędzie do wykrywania wzorców. Endpoint statystyk głosowych agreguje kody odpowiedzi w całym ruchu, dzięki czemu odróżnisz problem systemowy od złego numeru.

Wzrost 503 dotyczy Twojego konta lub konfiguracji, ponieważ to odmowy po stronie Bird. Wzrost 486 lub 404 dotyczy wybieranych numerów. Pierwszą rzecz naprawisz w ustawieniu, a druga zwykle oznacza, że lista numerów wymaga oczyszczenia.

Rozwiązywanie problemów z głosem omawia poszczególne przypadki. Log połączeń opisuje, co zawiera każdy rekord, w tym identyfikator połączenia do podania, gdy przyczynę może wyjaśnić tylko Bird.

W skrócie

  1. To, czy 503 oznacza odmowę, zależy od logu połączeń.

    503 z rekordem połączenia to odmowa, a rekord wskazuje przyczynę. 503 bez rekordu to nie odmowa i warto je ponowić.

  2. Rejected i Failed to różne wyniki.

    Rejected oznacza, że połączenie zostało odrzucone. Failed oznacza, że zostało podjęte i się nie powiodło, a kod SIP to odpowiedź, która wróciła.

  3. 486 lub 404 dotyczy numeru, na który dzwonisz.

    Busy i unallocated to odpowiedzi z drugiego końca, więc wskazują na numer docelowy, a nie na Twoją konfigurację.

  4. Dwa statusy połączeń istnieją, ale nigdy nie są emitowane.

    busy i canceled są zarezerwowane dla połączeń przychodzących. Żaden z nich nie jest emitowany, a oba wyniki są raportowane jako failed.

Zastosuj w praktyce.

Przejdź do dokumentacji, przewodników i przykładów dotyczących tego tematu.

Uzyskaj brief wdrożeniowy

Buduj na tej samej sieci.

Testowy klucz API otrzymasz od razu. Dostęp produkcyjny odblokujesz po dodaniu metody płatności i zweryfikowaniu nadawcy.

Twój kolejny pomysł. Gotowy do połączenia.