Предупреждение
RNL, включая его криптографический код, до сих пор не проверялся, поэтому RNL предназначен только для игр реального времени и мультимедийных приложений без обработки каких-либо критических данных, но не для серьезных приложений с критическими данными!
Описание
RNL означает «Сетевая библиотека реального времени».
RNL — это сетевая библиотека на основе UDP для приложений и игр реального времени, вдохновленная ENet, yojimbo, libgren и т. д.
RNL разработан на основе общих шаблонов, используемых в играх реального времени, которые привязаны к симуляции, а не к вводу-выводу и полностью сохраняют состояние, поэтому асинхронный ввод-вывод не имеет большого смысла. Таким образом, конструкция ядра RNL является однопоточной, а не многопоточной. Но вы можете использовать несколько экземпляров TRNLHost внутри нескольких разных потоков (от одного до очень небольшого количества экземпляров на один поток), чтобы вы могли проводить несколько сетевых игр на одном компьютере, при условии, что этот компьютер достаточно мощный и быстрый для размещения нескольких сетевые игры совпадают одновременно.
А на стороне игрового клиента все сетевое оборудование должно работать, если возможно, в собственном потоке (также, если возможно, закрепленном за ядром ЦП), во избежание возможных помех и других подобных проблем. (оффтоп: то же самое относится и к аудиопотоку, если только кому-то не нравятся возможные проблемы с опустошением аудиобуфера и т. д., когда ему не хватает процессорного времени в нужные моменты времени. :-))
А для более крупных игр с массой клиентов в одном игровом мире вам следует использовать несколько разделенных экземпляров TRNLHost, чтобы каждый TRNLHost мог обслуживать только несколько подключенных клиентов в нескольких потоках, а это, в свою очередь, на нескольких физических выделенных серверах, что также, в свою очередь, могут общаться друг с другом, имитируя впечатление единого очень большого игрового мира. По крайней мере, один экземпляр TRNLHost скорее предназначен для типичного небольшого количества клиентов, поскольку это типичный случай для эго-шутеров, гоночных игр и т. д. Или, другими словами, для больших игровых миров с массой клиентов: разделяй и властвуй (например, с частично перекрывающимися секторами игрового мира, просто в качестве примера концепции концепции «разделяй и властвуй»)
Поддержи меня
Поддержите меня на Patreon
Функции
- В основном полностью объектно-ориентированный дизайн кода.
- Поддержка IPv6
- Кросс-платформа
- Windows (с FreePascal и Delphi)
- Linux (с FreePascal)
- *BSD (с FreePascal)
- Android (с FreePascal и Delphi)
- Дарвин (MacOS(X) и iOS) (с FreePascal и Delphi)
- Протокол на основе UDP
- Секвенирование
- Каналы
- Со следующими возможными свободно настраиваемыми типами каналов:
- Надежный заказанный
- Надежный неупорядоченный
- Ненадежный заказанный
- Ненадежный неупорядоченный
- Надежность
- Фрагментация и повторная сборка
- Агрегация
- Адаптивность
- Портативность
- Возможность использования одноранговой модели или даже смешанной одноранговой и гибридной модели клиент/сервер вместо чистой модели клиент/сервер и, конечно же, классической модели клиент/сервер.
- Криптографически безопасный генератор псевдослучайных чисел (CSPRNG)
- Основан на arc4random, но с ChaCha20 вместо RC4 в качестве основного строительного блока.
- Множественные источники энтропии (потому что никогда не следует доверять одному источнику энтропии, поскольку у него может быть лазейка)
- Включая использование инструкций rdseed/rdrand на новых процессорах x86 в качестве дополнительного квазиаппаратного источника энтропии, если эти инструкции поддерживаются текущим работающим процессором.
- Взаимная аутентификация
- Основан на протоколе типа «станция-станция» (STS), который предполагает, что стороны имеют ключи подписи, которые используются для подписи сообщений, тем самым обеспечивая безопасность минификации от атак «человек посередине», в отличие от базового простого протокола Diffie- Метод Хеллмана без каких-либо расширений.
- Долгосрочные закрытые/открытые ключи представляют собой ключи ED25519 и используются только для целей подписи.
- Прямая секретность с использованием эллиптической эфемерной кривой Диффи-Хеллмана (кривая 25519)
- Следствием этого, наряду с другими фактами, является то, что каждое соединение всегда имеет новые частные и публичные краткосрочные ключи с обеих сторон и, следовательно, также новые общие секретные краткосрочные ключи.
- Краткосрочные частные/открытые ключи представляют собой ключи X25519, а краткосрочный общий секретный ключ используется только для целей шифрования на основе AEAD.
- Шифрование пакетов с аутентификацией и связанными данными (AEAD)
- На основе ChaCha20 в качестве шифра и Poly1305 в качестве криптографического кода аутентификации сообщения.
- Защита от повторного воспроизведения пакетных данных приложений
- На основе различных механизмов защиты на этапе установления соединения и зашифрованных порядковых номеров пакетов.
- Механизм отложенного установления соединения как дополнительный механизм минимизации поверхности атаки
- Токены подключения и аутентификации (в качестве дополнительной опции, когда у вас должен быть отдельный внеполосный канал связи, например, главный бэкэнд на основе HTTPS для генерации и обработки этих данных) в качестве дополнительного механизма минимизации поверхности атаки против усиления DDoS. нападения
- Токены подключения передаются в виде открытого текста, поэтому они быстро проверяются при первом пакете данных при попытке подключения, без необходимости сначала расшифровывать токен подключения, прежде чем его можно будет проверить, поэтому для того, чтобы сэкономьте процессорное время на этом этапе. Эта опция в первую очередь предназначена для защиты от DDoS-атак с усилением. Это означает, что сервер не будет реагировать сразу, если токен подключения не совпадает с первым пакетом данных при попытке подключения, и, таким образом, DDoS-атаки с усилением просто перейдут в ничего. Следовательно, эти токены должны быть действительны только в течение короткого периода времени, что также относится к основной серверной части вашей инфраструктуры.
- Токены аутентификации передаются в зашифрованном виде после успешной обработки обмена личными/открытыми ключами, генерации общего секретного ключа и т. д. Токены аутентификации, в отличие от токена подключения, НЕ являются средством противодействия DDoS-атакам категории, а, скорее, токены аутентификации предназначены, как следует из названия, только для целей аутентификации отдельного внеполосного канала связи, иными словами, в качестве дополнительных защита от несанкционированных подключений, при которой вы можете более подробно проверить ее на главной серверной стороне вашей инфраструктуры, прежде чем «клиент» сможет подключиться к реальному серверу, где и происходят все реальные действия.
- Ограничитель количества попыток подключения
- Настраивается с двумя константами, пакетом и периодом
- Настраиваемый ограничитель скорости полосы пропускания
- Дополнительная функция виртуальной сети (например, для быстрого решения локальной обратной связи без сетевого API для однопользовательских игр, которое по-прежнему должно основываться на концепции сервер/клиент)
- Симулятор сетевых помех (например, для тестовых случаев и т. д.)
- Настраиваемая имитация вероятности потери пакетов (каждого для входящих и исходящих пакетов)
- Настраиваемая имитация задержки (для входящих и исходящих пакетов)
- Настраиваемый моделируемый джиттер (каждый для входящих и исходящих пакетов)
- Настраиваемая имитация вероятности дублирования пакетов (каждого для входящих и исходящих пакетов)
- Механизм регулировки сложности ответа на запрос динамического соединения
- Настраивается со значением коэффициента
- На основе механизма определения количества кадров в секунду сглаживания истории, но вместо количества кадров в секунду количество попыток подключения в секунду
- Дополнительные алгоритмы сжатия на выбор
- Deflate (совместимый с битовым потоком zlib LZ77 и канонический гибрид Хаффмана, в этой реализации только фиксированный-статический-канонический-хаффман на стороне компрессора, но сторона декомпрессора является полнофункциональной)
- LZBRRC (компрессор в стиле LZ77 вместе с серверной частью кодера энтропийного диапазона)
- BRRC (кодер диапазона энтропии чистого порядка 0)
- CRC32C вместо CRC32 (без C в конце)
- И многое другое. . .
Запланированные функции (также известные как Todo) в случайном порядке приоритетов.
Общие рекомендации для разработчиков кода
Общие рекомендации для разработчиков кода
Лицензия
Лицензия zlib
IRC-канал
IRC-канал #rnl на Freenode
Спасибо
- Спасибо Ли Зальцману за ENet как источник вдохновения для идей реализации базового дизайна API.
- Спасибо Гленну Фидлеру за вдохновение для идей реализации, ориентированных на безопасность.
- Спасибо Сергею Игнатченко (Заяц «No Bugs») за вдохновение, а также за идеи реализации, ориентированные на безопасность.