Opened 8 years ago

Closed 8 years ago

Last modified 7 years ago

#333 closed баг (fixed)

Программа не использует TCP SIP транспорт

Reported by: alx Owned by: dimag
Priority: major Milestone: 2 очередь
Component: ПО MC04-Dispatcher. Пульт диспетчера/техника Keywords: network
Cc: san

Description (last modified by alx)

Сейчас в процессе работы программа не слушает ни один TCP порт, из чего следует, что она не принимает TCP соединения для SIP. Это неправильно. Необходимо принимать SIP сообщения через TCP транспорт тоже.

Change History (9)

comment:1 by dimag, 8 years ago

По умолчанию используется UDP транспорт.

comment:2 by dimag, 8 years ago

Можно использовать следующие виды транспорта

PJSIP_TRANSPORT_UDP,
PJSIP_TRANSPORT_TCP,
PJSIP_TRANSPORT_TLS,
PJSIP_TRANSPORT_SCTP

Но в транспортной части клиента можно использовать только один из них, так что если надо добавить новую настройку во вкладку "Сеть" окна настроек с выбором транспортного протокола.
Это вопрос к Александру и Ване - вам нужен подобный функционал?

in reply to:  2 comment:3 by alx, 8 years ago

Replying to dimag:

Но в транспортной части клиента можно использовать только один из них,

Не понял эту часть фразы. Что Вы имеете в виду?

comment:4 by dimag, 8 years ago

Только один в данный момент времени, это и имел в виду, который и нужно задать перед инициализацией транспортного протокола.

in reply to:  4 comment:5 by alx, 8 years ago

Replying to dimag:

Только один в данный момент времени,

Если имеется в виду, что SIP сервер программы слушает только UDP сокет, как я это вижу сейчас, то это неправильно. Транспорт UDP имеет ограничение на размер сообщения, и, если сообщение превышает этот размер, клиент не может отправить его через транспорт UDP, вместо этого он пытается использовать TCP. А так как наш сервер TCP не слушает, сообщение в результате вообще не будет принято, а это обидно (прервется диалог).

RFC3261 в разделе "Transport" говорит: "All SIP elements MUST implement UDP and TCP".

И там же комментарий:

      Making TCP mandatory for the UA is a substantial change from RFC
      2543.  It has arisen out of the need to handle larger messages,
      which MUST use TCP, as discussed below.  Thus, even if an element
      never sends large messages, it may receive one and needs to be
      able to handle them.

comment:6 by dimag, 8 years ago

Согласно https://trac.pjsip.org/repos/wiki/Using_SIP_TCP#, PJSIP автоматически перключиться на протокол TCP, по следующему алгоритму, описанную по ссылке выше.
According to ​RFC 3261 section 18.1.1:

"If a request is within 200 bytes of the path MTU, or if it is larger than 1300 bytes and the path MTU is unknown, the request MUST be sent using an RFC 2914 congestion controlled transport protocol, such as TCP."

By this rule, PJSIP will automatically send the request with TCP if the request is larger than 1300 bytes. This feature was first implemented in ticket #831. The switching is done on request by request basis, i.e. if an initial INVITE is originally meant to use UDP but end up being sent with TCP because of this rule, then only that initial INVITE is sent with TCP; subsequent requests will use UDP, unless of course if it's larger than 1300 bytes. In particular, the Contact header stays the same. Only the Via header is changed to TCP.

То есть виды транспорта перечиленные в замечание 3, задают основной используемый транспортный протокол, если он чем-то не устраивает, то происходит переключение на TCP.

in reply to:  6 comment:7 by alx, 8 years ago

Description: modified (diff)

Replying to dimag:

According to ​RFC 3261 section 18.1.1:

В процитированном фрагменте идет речь об отправке запроса клиентом. В описании же тикета идет вечь вовсе не об отправке запроса клиентом, а о получении запросе сервером. - в описании тикета не случайно написано "...не слушает ни один TCP порт...", то есть речь идет о приеме входящих сообщений TCP, а не об установке исходящих. В comment:5 я также прямым текстом написал, что речь идет о сервере, а не о клиенте...

Описание тикета изменил, заменив не очень понятное "не использует" на "не принимает соединения...".

Version 0, edited 8 years ago by alx (next)

comment:8 by dimag, 8 years ago

Resolution: fixed
Status: newclosed

r370.
Добавил новый транспорт TCP по умолчанию.

comment:9 by san, 7 years ago

Milestone: Текущее2 очередь

Milestone renamed

Note: See TracTickets for help on using tickets.