Шесть заголовков обязательны в каждом запросе SIP: Via (записывает путь и несёт branch транзакции), From и To (логические стороны, с тегами), Call-ID (уникальный идентификатор вызова), CSeq (порядковый номер плюс метод) и Max-Forwards (ограничение переходов). Вместе Call-ID, тег From и тег To идентифицируют диалог.
Шесть обязательных заголовков
RFC 3261 требует шесть полей заголовков в каждом запросе. Via прослеживает маршрут запроса и сообщает ответам, как вернуться. From и To идентифицируют логического инициатора и цель запроса. Call-ID — это глобально уникальный токен, общий для всех сообщений одного вызова. CSeq упорядочивает запросы внутри диалога и именует метод. Max-Forwards — это убывающий счётчик переходов, предотвращающий петли. Опустите любой из них — и сообщение недопустимо.
| Заголовок | Назначение |
|---|---|
| Via | Записывает каждый хоп; ответы проходят по нему обратно. Содержит branch транзакции |
| From | Логический инициатор; содержит тег |
| To | Логический получатель; получает тег в ответе |
| Call-ID | Глобально уникальный идентификатор всего вызова |
| CSeq | Порядковый номер + метод; упорядочивает запросы внутри диалога |
| Max-Forwards | Ограничение на количество переходов (обычно 70); предотвращает образование маршрутных петель |
Via и параметр branch
Каждый прокси, пересылающий запрос, вставляет собственный заголовок Via сверху, строя стек, по которому ответы спускаются обратно — ответ маршрутизируется исключительно следованием списку Via, поэтому он повторяет путь запроса. Параметр branch в Via идентифицирует транзакцию; начиная с RFC 3261, он должен начинаться с фиксированного magic cookie z9hG4bK, отмечающего branch как глобально уникальный и совместимый с RFC 3261. Сопоставление ответов и повторных передач с нужной транзакцией зависит от этого значения.
Теги, диалоги и транзакции
Идентичность диалога собирается из трёх частей: Call-ID плюс тег в From и тег в To. Вызывающий задаёт тег From, когда отправляет INVITE; вызываемый добавляет тег To в своём ответе, и в этот момент диалог полностью идентифицирован для обеих сторон. Каждый последующий внутридиалоговый запрос (re-INVITE, BYE) несёт все три, поэтому он связан с нужным вызовом. Транзакции, напротив, сопоставляются по branch в Via и методу — более тонкая гранулярность, чем диалог.
| Область действия | Идентифицируется по |
|---|---|
| Диалог (вызов) | Call-ID + From-tag + To-tag |
| Транзакция (запросы + ответы) | branch из Via + метод запроса |
| Упорядочивание запросов в диалоге | Номер CSeq (увеличивается с каждым запросом) |
Contact, маршрутизация и другие распространённые заголовки
Помимо обязательных шести, несколько заголовков формируют маршрутизацию и возможности. Contact даёт прямой URI, по которому отправитель достижим для будущих запросов — критично в REGISTER и в сообщениях, устанавливающих диалог. Record-Route позволяет прокси оставаться в тракте сигнализации на весь диалог, а Route направляет последующие запросы через эти прокси. Expires ограничивает регистрацию или подписку. Allow, Supported и Require объявляют и согласуют возможности и расширения. Content-Type и Content-Length описывают тело (обычно SDP).
Via: SIP/2.0/UDP pc.example.com;branch=z9hG4bK74bf9 ← transaction id
From: Alice <sip:alice@example.com>;tag=9fxced76sl ← caller + From-tag
To: Bob <sip:bob@biloxi.com> ← callee (To-tag added in reply)
Call-ID: 3848276298220188511@pc.example.com ← whole-call id
CSeq: 1 INVITE ← sequence + method
Contact: <sip:alice@pc.example.com> ← where to reach the caller
Max-Forwards: 70 ← hop limitЧасто задаваемые вопросы
Что делает заголовок Via в SIP?
Via записывает путь, который проходит запрос: каждый прокси добавляет свой Via сверху, а ответы следуют по стеку Via обратно к отправителю. Его параметр branch идентифицирует транзакцию, поэтому ответы и повторные передачи сопоставляются с правильным запросом.
Что такое параметр branch z9hG4bK?
z9hG4bK — это обязательный magic cookie, с которого параметр branch SIP должен начинаться по RFC 3261. Он сигнализирует, что значение branch глобально уникально и совместимо с RFC 3261, и это ключ для сопоставления ответа с его транзакцией.
Как идентифицируется диалог SIP?
Сочетанием Call-ID, тега заголовка From и тега заголовка To. Вызывающий поставляет Call-ID и тег From в INVITE; вызываемый добавляет тег To в своём ответе. Все внутридиалоговые запросы несут те же три значения.
Для чего нужен заголовок CSeq?
CSeq содержит порядковый номер и метод запроса, упорядочивая запросы внутри диалога и позволяя каждой стороне обнаруживать повторные передачи и сообщения не по порядку. Номер возрастает с каждым новым запросом; метод должен совпадать с помечаемым им запросом.
В чём разница между Contact и To?
To — это логическая цель запроса, и она обычно не меняется. Contact — это конкретный URI, где отправитель фактически достижим для последующих запросов. Прокси маршрутизируют по To/Request-URI, но последующие внутридиалоговые запросы отправляются на Contact.
Технические характеристики источника
На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)