Как вынудить клиент переключиться, RTP транспортируют от UDP до TCP?

Если клиент хочет наблюдать поток, который находится на моем сервере RTSP, он сначала пытается установить поток через протокол UDP. Как я могу сказать этому, что мой сервер только поддерживает RTP/AVP/TCP и что это должно переключить транспорты?

Я хочу завершить поддержку UDP на своем сервере, но все клиенты сначала пытаются УСТАНОВИТЬ сессию по UDP, и позже они делают так по TCP..., и я хочу переключить их на TCP как можно скорее в протоколе RTSP.

Как я могу сделать это?

7
задан Aliaksandr Belik 17 October 2013 в 11:40
поделиться

4 ответа

Хорошо, один из способов - отправить «400 Bad Request» в качестве ответа на клиентский запрос SETUP ... и он автоматически переключается на протокол TCP. Это для RealOne и QuickTime.

Но я не уверен, что это сработает на всех остальных игроках, так как это взлом.

Есть другие идеи? = |

4
ответ дан 6 December 2019 в 07:50
поделиться

Какой клиент подключается к вашему серверу? Некоторые клиенты могут запускаться с помощью метода URI в URL-адресе. Например, вы можете указать rtspt: //myhost/path.sdp.

Если у вас есть контроль над клиентом / серверами, вы можете использовать заголовок Require на клиентах и ​​Unsupported на серверах, чтобы указать, что UDP не поддерживается; но большинство клиентов, которых я видел, не используют это.

1
ответ дан 6 December 2019 в 07:50
поделиться

Вы можете попробовать передать заголовок "транспорт" в ответ на запрос Describe и указать там, что ваш сервер поддерживает только транспорт RTP / AVP / TCP, и клиент должен знать, что UDP не поддерживается.

1
ответ дан 6 December 2019 в 07:50
поделиться

Насколько мне известно, на стороне сервера нет никакого контроля для предпочтения типа транспорта. Сервер должен быть универсальным, он должен поддерживать RTP через UDP, RTP через TCP, RTP через RTSP и RTP через RTSP через HTTP (S). И его клиенты выбирают, какой транспорт выбрать. Транспортное поле сначала отправляется в запросе SETUP

1) UDP

 C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0
               CSeq: 1
               Transport: RTP/AVP/UDP;unicast;client_port=3056-3057

2) TCP

    C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0
               CSeq: 1
               Transport: RTP/AVP/TCP;unicast;client_port=3056-3057

3) RTP через RTSP и RTP через RTSP через HTTP (S)

S->C: RTSP/1.0 200 OK
           CSeq: 2
           Date: 05 Jun 1997 18:57:18 GMT
           Transport: RTP/AVP/TCP;interleaved=0-1

Как мы видим, запрос «Тип транспорта» имеет вид отправлено клиентской стороной.

Если вы хотите поддерживать только TCP-сервер, вы можете отправить «400 Bad Request» или «461 Unsupported transport» в ответ на запрос SETUP, как предложено вами, или другой способ - отправить 200 OK, но не передавать какие-либо RTP-пакеты. Клиент будет тайм-аут и узнает, что он находится за прокси-сервером, и он снова отправит запрос SETUP с параметром RTP / AVP / TCP (не идеальный случай).

7
ответ дан 6 December 2019 в 07:50
поделиться