Переключение протоколов 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-сервер присылает не «строгий» ответ) через переменные TERA_UDP_FAILURE_TIMEOUT и TERA_UDP_QUALITY_TIMEOUT. Переменные задаются в ОС пользовательской рабочей станции, откуда происходит подключение через клиентское приложение (см. подраздел Интерфейс командной строки ПО Termidesk Viewer документа СЛЕТ.10001-01 92 01 «Руководство пользователя. Настройка и эксплуатация компонента «Клиент»).