Ruffles - это полностью управляемая библиотека UDP, предназначенная для высокой производительности и низкой задержки.
Есть много библиотек RUDP, таких как ENET, Lidgren, Litenetlib. В то время как многие из них великолепны, Ruffles стремится заполнить одну нишу, которая в основном не заполнена, что является легким полностью управляемым библиотеками.
Для сравнения с примерами выше, ENET удивительна и в значительной степени то, кем хочет быть Раффлз, но это неуправляется. Lidgren, Litenetlib и многие другие управляемые библиотеки могут чувствовать себя слишком раздутыми и содержать много функций, которые являются ненужными, и они часто намного медленнее.
У Ruffles есть много особенностей, которых не хватает другим Libs. Смотрите ниже краткое изложение и подробное объяснение каждого.
Протокол оборков требует выполнения задачи, прежде чем можно будет установить соединение. В настоящее время эта задача - это хэшкаш, подобный вызову, которая выполняется сервером, грубой силы, решаемой клиентом и представленной. (Использует хэш-функцию Fowler-Noll-Vo вместо SHA1 в настоящее время).
Амплификация DOS предотвращается путем потребования непропорциональных размеров сообщений об соединении. Кроме того, из -за задачи соединения невозможно атаковать вычислительно атаковать на слое 4.
У Ruffles есть фиксированное количество слотов соединения, которое можно использовать для ожидающих соединений, это ограничивает удобство использования атак с заполнением слота на уровне 4. В ожидании подключений есть фиксированный тайм -аут для решения вычислительно дорогостоящей задачи хэшкаша перед тем, как их выбит, слот будет доступен еще раз после этого. Поскольку это только ограничивает атаки заполнения слотов, Ruffles также обладает механизмом безопасности, где в первом сообщении должен быть решен хэшкаш. Эта задача генерируется клиентом, и сервер подтвердит, что используемая дата является недавней, и что IV еще не использовался, заставляя клиентов пересказывать задачу Hashcash каждый раз, когда они хотят инициализировать рукопожатие.
С этими смягчения безопасности единственный способ снизить сервер - это исчерпать все ресурсы ЦП.
Ruffles обрабатывает все управление соединением для вас. Это полностью ориентированный на соединение протокол с пакетами Heartbeat Packetive, отправленными для обеспечения живого соединения.
Оборфли полностью не содержат мусора, это выполнено с помощью пользовательского распределения памяти в пространстве GC. Это гарантирует, что память не протекает в сборщик мусора, если только в целях изменения размера. Это заставляет оборки быстро пылать. Это также избегает копий памяти как можно больше. Поскольку оборки все еще работают в пространстве GC, любые утечки памяти в оборках будут обрабатываться коллекционером мусора, а пользователь будет уведомлен, поскольку деструктор памяти вызывается вместе со стеком -протеканием, где первоначально распределена просочившаяся память. См. Реализацию.
В настоящее время есть несколько способов отправки сообщений в оборках. Типы:
Все сообщения гарантированно будут доставлены, заказ не гарантирован, дубликаты отбрасываются. Использует фиксированное скользящее окно.
Все сообщения гарантированно будут доставлены при также гарантированном заказе, дубликаты отбрасываются. Использует фиксированное скользящее окно.
Все сообщения гарантированно будут доставлены при также гарантированном заказе, дубликаты отбрасываются. Использует фиксированное скользящее окно. Позволяет фрагментировать большие сообщения.
Доставка не гарантирована и не является заказом. Дубликаты сбрасываются.
Доставка не гарантирована, но заказ есть. Старые пакеты и дубликаты сбрасываются.
Доставка не гарантирована и не является заказом. Дубликаты не сброшены.
Необработанные пакеты UDP, которые не требуют соединения.
Все сообщения не гарантируются. Если вы отправляете несколько сообщений, по крайней мере, одно из них, чтобы прибыть. Если вы отправите одно сообщение, оно будет гарантированно. Сообщения всегда будут в порядке. Дубликаты сбрасываются.
Все сообщения гарантированно будут доставлены, заказ не гарантирован, дубликаты отбрасываются. Использует фиксированное скользящее окно. Позволяет фрагментировать большие сообщения.
Ruffles является изначально многопоточным и по умолчанию использует фонарный поток для обработки ввода -вывода сети.
Все общедоступные API в оборках предназначены для безопасных потоков и могут быть доступны из любого потока.
Оборфли на 100% не имеют зависимости, он, таким образом, очень портативен и должен работать на большинстве платформ.
Ruffles поддерживает режим двойного сокета IPv6. Это происходит с использованием двух сокетов, связанных с одним и тем же портом, тем самым выполняя полную функциональность двойного стека, которая невидима для пользователя.
Небольшие пакеты будут отложены для отправки, это позволяет их объединить в один больший пакет. Это может быть отключено и включено в соответствии с пакетом. Задержка и максимальный размер слияния также могут быть настроены.
Пакеты могут быть отправлены в виде ReliablesequenceDfragmented или надежного фрагментации, что позволяет одному пакету размером до 2^15*1450 байт = 47513600 байт = 47,5 мегабайт.
Пакеты ACK объединены в Bitfields, чтобы сделать их намного более компактными.
Подробная статистика может быть извлечена из соединений, включая отправленные байты, отправленные пакеты, время в оба конца и многое другое.
Автоматически обнаруживает максимально возможный MTU для каждого соединения.
Ограничьте сумму трафика, разрешенного для отправки в соединение. Пользовательские алгоритмы могут быть адаптированы с интерфейсом ibandwidthtracker.
Это то, что я хочу, и планирую добавить
Вот функции, которые рассматриваются, но не решаются. Это для предотвращения раздувания.
В настоящее время фрагментированный канал не имеет никакой скорости потока для ACK Resends.
Из -за ошибки Unity Ruffles не работает должным образом в IL2CPP по умолчанию. О ошибке сообщили Unity. Если вам нужно запустить оборки с помощью IL2CPP, составьте его с Это было исправлено. Не стесняйтесь использовать IL2CPP в вашем проекте.MILLISECONDS_SELECT Define. Это заставит метод выбора. Использовать время ожидания на основе миллисекунды вместо микросекунд.