Переключение протоколов TCP и UDP в TERA
TERA поддерживает динамическое переключение режима работы каналов:
-
из протокола TCP в UDP;
-
обратное переключение из UDP в TCP при превышении порога пропущенных кадров.
Помимо переключения для указанных каналов поддерживается защищенный режим работы (протоколы: TLS для TCP, DTLS для UDP). Управление переключением и защитой соединений производится через конфигурационные файлы 30-teraqxl.xorg.conf (см. подраздел Конфигурационный файл 30-teraqxl.xorg.conf) или /etc/xdg/x11tera/x11tera.conf (см. подраздел Конфигурационный файл x11tera.conf).
|
Функционал позволяет адаптировать работу каналов TERA к текущим сетевым условиям (в том числе, качеству сети) и задачам (например, переход на UDP медиапотоки для минимизации задержки и потерь).
Процесс переключения всегда инициируется клиентским приложением (ПО Termidesk Viewer), TERA-сервер либо обеспечивает переключение, либо отказывает в нем. Переключение режимов выполняется для каждого канала TERA индивидуально.
Гарантированная последовательность приема сообщений при переключении с TCP на UDP обеспечивается следующим алгоритмом:
-
при запросе на переключение в UDP пересылка управляющих сообщений продолжается в TCP-канале;
-
сведения о подключении передаются TERA-сервером также в TCP-канале;
-
клиентское приложение, получив параметры подключения, начинает процедуру, называемую «проталкиванием» UDP-датаграмм (NAT hole punching) для обеспечения работы при использовании NAT. Ответные UDP-датаграммы TERA-сервер отправляет, используя адрес отправителя, полученный от клиентского приложения. UDP-канал на этом еще не работает;
-
решение о функционировании UDP-канала принимается клиентским приложением после получения ответных UDP-датаграмм от TERA-сервера. Но на этом этапе продолжается использование TCP-канала, т.к. переключение еще не выполнено;
-
после получения ответных UDP-датаграмм от TERA-сервера клиентское приложение начинает процедуру пересылки накопленных данных (forwarding) для досылки по UDP всех данных из буфера TCP-канала. После этого клиентское приложение переходит к использованию UDP для всех последующих сообщений. При этом:
-
данные, переданные по TCP до момента переключения, уже упорядочены;
-
данные, переданные по UDP в процессе пересылки, нумеруются или снабжаются последовательными метками (имплементация зависит от версии протокола);
-
для разделения данных используется маркер
forwarding_notify: все, что передавалось до него по TCP/UDP-каналам, считается доставленным. Все, что после, передается по UDP-каналу с собственной нумерацией;
-
-
TERA-сервер, получив
forwarding_notify, завершает процедуру пересылки со своей стороны и переходит в режим работы по UDP. С этого момента стороны работают только по UDP.
|
Если клиентское приложение подключается к TERA-серверу, не поддерживающему протокол UDP (или его поддержка была отключена на TERA-сервере), то оно не сможет начать взаимодействие по UDP. TCP-канал не закрывается при переключении в UDP, т.к. он сохраняется для критически важных данных (например, нажатие клавиш на клавиатуре передаются в TCP-канале, а перемещение мыши в UDP-канале). |
|
В TERA предусмотрен останов попыток переключения в UDP, если клиентским приложением обнаружены неудачные попытки (когда TERA-сервер присылает не «строгий» ответ) через переменные |