BroadNet
SIP / VoIPСхема вызова

Схема вызова SIP: от INVITE до BYE

Обновлено 3 мин чтенияна основе стандартов
Прямой ответ

Базовый вызов SIP — это трёхстороннее рукопожатие INVITE/200/ACK, за которым следуют медиа и BYE. Вызывающий отправляет INVITE (с предложением SDP); вызываемый отвечает 100 Trying, 180 Ringing, затем 200 OK (с ответом SDP); вызывающий отправляет ACK; текут медиа RTP; и любая сторона завершает вызов BYE, на который отвечают 200 OK.

§01

Установление вызова

Вызов начинается с того, что UAC вызывающего отправляет INVITE к вызываемому, неся предложение SDP, описывающее нужные ему медиа. По мере прохождения запроса через прокси каждый может вернуть 100 Trying, чтобы остановить повторные передачи. Когда телефон вызываемого начинает звонить, обратно течёт 180 Ringing — это и порождает гудки. Если нужны ранние медиа (сетевые объявления, гудки от дальней сети), 183 Session Progress с SDP может открыть медиатракт до ответа.

§02

Ответ и трёхстороннее рукопожатие

Когда вызываемый отвечает, его UAS возвращает 200 OK, несущий ответ SDP, завершающий согласование медиа. Вызывающий подтверждает ACK — третьей ветвью рукопожатия INVITE — и диалог теперь полностью установлен, идентифицированный Call-ID плюс обоими тегами. Трёхсторонний обмен INVITE/200/ACK, а не простой запрос/ответ, делает установление вызова SIP надёжным даже поверх ненадёжного UDP.

Полный вызов SIPtext
Alice (UAC)                         Bob (UAS)
   │  INVITE (SDP offer)   ─────────▶ │
   │ ◀───────── 100 Trying           │
   │ ◀───────── 180 Ringing          │   (Bob's phone rings)
   │ ◀───────── 200 OK (SDP answer)  │   (Bob answers)
   │  ACK                  ─────────▶ │
   │ ◀═══════ RTP media (both ways) ═▶ │   (the conversation)
   │  BYE                  ─────────▶ │   (Alice hangs up)
   │ ◀───────── 200 OK               │
§03

Медиа и изменения по ходу вызова

Как только ACK завершает установление, медиа RTP текут напрямую между конечными точками (или через медиарелей) на портах, согласованных SDP, независимо от тракта сигнализации. Изменения по ходу вызова делаются re-INVITE или UPDATE, несущими новый SDP — так выполняются удержание (a=sendonly), возобновление (a=sendrecv), пересогласование кодека и добавление видео, всё внутри существующего диалога без разрыва вызова.

§04

Завершение вызова — BYE

Любая сторона завершает установленный вызов отправкой BYE, что другая подтверждает 200 OK; диалог затем закрывается, и медиа останавливаются. BYE — это внутридиалоговый запрос, поэтому он несёт установленные Call-ID, тег From, тег To и следующий CSeq. Поскольку это обычная транзакция, потерянный BYE повторно передаётся до подтверждения, так что обе стороны сходятся на завершении вызова.

§05

Прерывание вызова в процессе — CANCEL

Если вызывающий сдаётся до ответа вызываемого — вызов ещё звонит — UAC отправляет CANCEL, а не BYE, потому что окончательный ответ ещё не пришёл. Вызываемый прекращает звонить и возвращает 487 Request Terminated на исходный INVITE, что вызывающий подтверждает ACK. CANCEL допустим только в этом окне до ответа; как только получен 200 OK, вызов установлен, и завершать его нужно BYE.

Завершение против прерывания вызова
СитуацияМетодРезультат
Звонок принят, теперь положите трубкуBYE200 OK; диалог закрыт
Ещё идёт вызов, вызывающий абонент отказываетсяCANCEL487 Request Terminated в ответ на INVITE
Вызываемый абонент отклоняет вызов во время посылки вызова(ответ) 486/603Busy Here / Decline; вызывающий отправляет ACK
Часто задаваемые вопросы

Часто задаваемые вопросы

Какова базовая схема вызова SIP?

INVITE (с предложением SDP) → 100 Trying → 180 Ringing → 200 OK (с ответом SDP) → ACK, затем текут медиа RTP, и вызов завершается BYE → 200 OK. Трёхстороннее рукопожатие INVITE/200/ACK устанавливает диалог; BYE его разрывает.

Почему SIP использует трёхстороннее рукопожатие для INVITE?

ACK подтверждает, что вызывающий получил окончательный 200 OK, делая установление вызова надёжным даже поверх ненадёжного UDP. Поскольку 200 OK на INVITE повторно передаётся до ACK, трёхсторонний обмен гарантирует, что обе стороны согласны, что вызов установлен, до того как медиа станут доверенными.

Как поставить вызов SIP на удержание?

Отправьте re-INVITE (или UPDATE) внутри установленного диалога, несущий новый SDP, задающий направление медиа a=sendonly (и a=sendrecv для возобновления). Диалог и вызов остаются; меняется только направление медиа, так же доставляется и музыка на удержании.

Когда отправлять CANCEL вместо BYE?

Отправляйте CANCEL, когда вызов ещё звонит и окончательный ответ не пришёл — он прерывает ожидающий INVITE и даёт 487. Отправляйте BYE только после того, как вызов установлен (получен 200 OK). Использование неверного оставляет стороны рассинхронизированными.

Идут ли медиа тем же путём, что и сообщения SIP?

Обычно нет. Сигнализация SIP может проходить через несколько прокси, но медиа RTP текут на отдельно согласованных портах, обычно напрямую между конечными точками или через выделенный медиарелей или SBC — поэтому сигнализация может пройти, тогда как медиа (звук) независимо не проходят.

Ссылки

Технические характеристики источника

На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)

BNПоддерживается инженерной командой BroadNet·Обмен сообщениями операторского класса с 2003 года.
Прикрепите это к проводу

Разработано с использованием реального SMPP подключения и REST API.

Запросите тестовый доступ с реальными тестовыми ключами: сначала отправьте их на свой подтвержденный номер, а затем, после утверждения вашей личности отправителя и маршрутов, переходите к использованию в производственной среде более чем в 200 странах.