﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	resolution	keywords	cc
396	Workaround для прокси-серверов, не уважающих Route	alx	alx	"== Введение ==

Платы VE-01 и VE-02 содержат в себе SIP UA и SIP прокси. UA для сетевой коммуникации (приема/передачи сообщений SIP) использует адрес/порт 127.0.0.1:6060 и, таким образом, недоступен из-за пределов платы. Вся коммуникация с UA может производиться только через прокси-сервер, имеющий доступные из внешней сети транспорты. Для того чтобы запросы SIP всегда передавались через прокси-сервер, в них используется заголовок `Route`. Пример обмена сообщениями двух UA через два прокси-сервера как он должен происходить:

{{{#!PlantUml
@startuml
skinparam ParticipantPadding 60
participant UAC
participant ""Proxy 1"" as P1
participant ""Proxy 2"" as P2
participant UAS

UAC -> P1: INVITE
P1 -> P2: INVITE\nRecord-Route: P1
P2 -> UAS: INVITE\nRecord-Route: P2\nRecord-Route: P1

UAS -> P2: 180 Ringing\nRecord-Route: P2\nRecord-Route: P1
P2 -> P1: 180 Ringing\nRecord-Route: P2\nRecord-Route: P1
P1 -> UAC: 180 Ringing\nRecord-Route: P2\nRecord-Route: P1

UAS -> P2: 200 OK\nRecord-Route: P2\nRecord-Route: P1
P2 -> P1: 200 OK\nRecord-Route: P2\nRecord-Route: P1
P1 -> UAC: 200 OK\nRecord-Route: P2\nRecord-Route: P1

UAC -> P1: ACK\nRoute: P1\nRoute: P2
P1 -> P2: ACK\nRoute: P2
P2 -> UAS: ACK

@enduml
}}}


== Проблема ==

За период производства плат со встроенным прокси-сервером (около 7 лет) стало известно о нескольких случаях неправильной работы внешних прокси-серверов, с которыми столкнулись потребители. Последний из таких случаев заключался в том, что прокси-сервер, работающий в сети пользователя, выбрасывал из запросов SIP заголовки `Route` и пытался передать сообщение так, как будто никакого маршрута в нем не было, то есть пытался доставить сообщение непосредственно адресату из Request-URI:

{{{#!PlantUml
@startuml
skinparam ParticipantPadding 50
participant UAC
participant ""Proxy 1\n(проблемный)"" as P1
box ""VE-01""
participant ""Proxy 2"" as P2
participant UAS
end box

UAC -> P1: INVITE
P1 -> P2: INVITE\nRecord-Route: P1
P2 -> UAS: INVITE\nRecord-Route: P2\nRecord-Route: P1

UAS -> P2: 180 Ringing\nRecord-Route: P2\nRecord-Route: P1
P2 -> P1: 180 Ringing\nRecord-Route: P2\nRecord-Route: P1
P1 -> UAC: 180 Ringing\nRecord-Route: P2\nRecord-Route: P1

UAS -> P2: 200 OK\nRecord-Route: P2\nRecord-Route: P1
P2 -> P1: 200 OK\nRecord-Route: P2\nRecord-Route: P1
P1 -> UAC: 200 OK\nRecord-Route: P2\nRecord-Route: P1

UAC -> P1: ACK\nRoute: P1\nRoute: P2
P1 ->x P1 : ACK на адрес 127.0.0.1

@enduml
}}}

Так как в случае платы VE-01 UAS имеет адрес 127.0.0.1, недостижимый напрямую из внешней сети, запрос ACK не достигает получателя.

== Задача ==

Предлагается рассмотреть и обсудить варианты обхода описанной выше проблемы. Варианты будем добавлять в комментарии к этому тикету."	задача	new	средний	2 очередь	any			san
