Компания Valve открыла реализацию системы TCP-подобных коммуникаций поверх UDP
Как сообщает opennet.ru компания Valve перевела в разряд свободного ПО библиотеку GameNetworkingSockets с реализацией системы передачи сообщений поверх UDP, которая может применяться для организации высокоскоростного и надежного сетевого обмена данными в играх. Код написан на языке С++ и поставляется под лицензией BSD.
GameNetworkingSockets реализует поверх UDP похожий на TCP протокол, обеспечивающий установку соединения, но ориентированный на передачу сообщений вместо потоков. При этом через установленный канал связи сообщения могут передаваться как в режиме гарантированной доставки, так и с использованием более быстрого режима ненадежной передачи. Протокол поддерживает такие возможности как обработка фрагментации, пересборка пакетов, прогнозирование и ограничение пропускной способности.
Имеется встроенная поддержка шифрования канала связи. Данные в пакетах шифруются с использованием алгоритма блочного шифрования AES, а для обмена ключами и проверки сертификатов применяются цифровые подписи на базе эллиптических кривых Ed25519. Механизмы доставки ключей и выбора вектора инициализации для каждого пакета основаны на методах, применяемых в протоколе QUIC.
Разработчикам предложена библиотека c реализацией C++ класса SteamNetworkingSockets, а также инструментарий для симуляции потери пакетов и получения детальной статистики. Среди необходимых для сборки зависимостей: OpenSSL, Google protobuf, ed25519-donna, curve25519-donna и ujson (компактный парсер JSON, который уже включен в состав GameNetworkingSockets.
Из планов на будущее называется переработка кода "SNP", который отвечает за инкапсуляцию API-сообщений в UDP-пакеты и выполнение таких операций как фрагментация и пересборка слишком больших пакетов, cлияние мелких сообщений и переотправка потерянных фрагментов. В новой реализации появится более продвинутая реализация скользящего окна и полноценная возможность упорядочивания пакетов (сейчас пакет пришедший не по порядку просто отбрасывается). Также планируется уйти от применения специфичных для Steam идентификаторов CSteamID в пользу более универсальной структуры идентификации и избавиться от зависимости от OpenSSL, в котором используется только реализация AES.