Asterisk при отправке REFER

Разработка и отладка Asterisk и его приложений.

Модераторы: Admins, Модераторы

Ответить
Аватара пользователя
IgorG
Модератор
Сообщения: 1054
Зарегистрирован: 21 ноя 2005, 05:59
Откуда: Россия, Омск
Контактная информация:

Asterisk при отправке REFER

Сообщение IgorG » 29 окт 2008, 11:15

Есть ли вообще на форуме те, кто разбираются в работе протокола SIP?

Ситуация следующая: Asterisk выполняет переадресацию SIP вызова при уже установленной сессии. Переадресация ведёт себя достаточно интересно, вот график пакетов на астериске:

Код: Выделить всё

Asterisk        Server
------ REFER ------>
------ BYE -------->
<----- 401 &#40;REFER&#41; -----
<----- 401 &#40;BYE&#41; ------
------ BYE &#40;AUTH&#41; ------>
------ REFER &#40;retr&#41; ----> &#40;6 раз&#41;
<----- 401 &#40;REFER&#41; ------ &#40;6 раз&#41;
Я догадываюсь где здесь ошибка со стороны астериска, но не могу понять как диалог должен выглядеть в конечном итоге, чтобы эту ситуацию исправить:
1. Нельзя отправлять BYE сразу после REFER, не дождавшись завершения переадресации
2. После того как окончание сессии посредством BYE произошло, нужно прекратить попытки передачи REFER запроса

Кто может, прокомментируйте. Даже если не найдём окончательного ответа, то это поможет при обращении в sip-implementors и asterisk-dev за помощью. Спасибо.


PS. А есть ли какая-то утилита, чтобы графики SIP потоков рисовать в графическом виде и в текстовом?
OpenSUSE 11.2 / Asterisk-trunk / Celeron 1100 (512mb) / chan_lcr / Linksys / Aastra 9112i
http://igorg.ru

Аватара пользователя
Cache
Модератор
Сообщения: 688
Зарегистрирован: 12 янв 2007, 11:39
Откуда: Россия. Шатура
Контактная информация:

Сообщение Cache » 29 окт 2008, 16:19

поидее должно быть так

Код: Выделить всё

A                      B
       Refer&#40;1&#41;
----------------->
      202&#40;2&#41;
<----------------
    NOTIFY&#40;3&#41;
<----------------
   200 OK &#40;4&#41;
------------------>
                        ------->
                               любой абонент
                       <------------
    NOTIFY&#40;5&#41;
<-----------------
    200 OK &#40;6&#41;
------------------>

Код: Выделить всё

REFER sip&#58;alexander@10.10.10.242 SIP/2.0 
Via&#58; SIP/2.0/UDP 10.10.10.242;branch=z9hG4
To&#58; <sip&#58;alexander@10.10.10.242
Refer-To&#58; любой URI
Contact&#58; sip&#58;alexander@10.10.10.242
Content-Length&#58; 0 

NOTIFY sip&#58;anton@10.10.10.242 SIP/2.0 
Via&#58; SIP/2.0/UDP 10.10.10.242;branch=z9hG4bK9323394234 
To&#58; <sip&#58;anton@10.10.10.242>;
From&#58; <sip&#58;alexander@10.10.10.242>;tag=4992881234 
Call-ID&#58; 898234234@10.10.10.242
CSeq&#58; 1993403 NOTIFY 
Max-Forwards&#58; 70 
Event&#58; refer 
Subscription-State&#58; terminated;reason=noresource 
Contact&#58; sip&#58;alexander@10.10.10.242
Content-Type&#58; message/
это если по стандрату
нанотехнолигии в области Asterisk

Аватара пользователя
IgorG
Модератор
Сообщения: 1054
Зарегистрирован: 21 ноя 2005, 05:59
Откуда: Россия, Омск
Контактная информация:

Сообщение IgorG » 29 окт 2008, 17:16

По стандарту оно понятно, но проблема в том что астериск может отправить BYE раньше получения какого-либо ответа на REFER. В стандарте я не нашёл ничего противоречащего такому поведению. Хочу разобраться и исправить.

Если идей нет, то буду писать в sip-implementors, результаты отпишу здесь.

PS. Насчёт построения графиков уже подсказали: BreakPoint SIP Workbench
OpenSUSE 11.2 / Asterisk-trunk / Celeron 1100 (512mb) / chan_lcr / Linksys / Aastra 9112i
http://igorg.ru

Аватара пользователя
IgorG
Модератор
Сообщения: 1054
Зарегистрирован: 21 ноя 2005, 05:59
Откуда: Россия, Омск
Контактная информация:

Сообщение IgorG » 02 ноя 2008, 05:39

В общем в чём проблема вполне понятно:
1. В RFC5057 описано поведение в подобных случаях. В данном случае отправка BYE после REFER не завершает диалог, а только обозначает нежелание переводящей звонок стороны (Asterisk) продолжить диалог в случае неудачной переадресации.
2. Asterisk ошибочно считает что передача пакета с REFER неудалась. Это вызвано с одной стороны ошибкой в коде заставляющей игнорировать ответы на REFER, а с другой тем, что не отслеживается состояние SIP диалога.

Первое будет исправить достаточно просто, второе - не уверен. Так же второе обстоятельство мешает добавить поддержку PRACK и UPDATE запросов в Asterisk. :(
OpenSUSE 11.2 / Asterisk-trunk / Celeron 1100 (512mb) / chan_lcr / Linksys / Aastra 9112i
http://igorg.ru

Ответить