Carambolas - это постоянно развивающаяся библиотека поддержки общего назначения, состоящая из множества сборков стандарта 2.0 . В частности, Он оснащен пользовательской многоканальной надежной реализацией протокола UDP, предназначенной для приложений продуктов с низкой задержкой/низкой пропускной способностью. Полем
Первый релиз - минимальное ядро с полностью функциональным сетевым модулем. Этот репозиторий структурирован вокруг одного решения, потому что я планирую расширить, добавив новые модули в будущем.
Тестовая охват все еще минимален, поэтому уровень правильности не следует подразумеваться без тщательного осмотра исходного кода. Это постоянный проект на самых ранних этапах.
Вскоре будут доступны двоичные файлы в архивном разделе или в виде пакетов Nuget.
Локальный хост представлен экземпляром Carambolas.net.host . Он должен использоваться для подключения к удаленному хосту или принять входящие соединения.
Каждый удаленный хост представлен экземпляром Carambolas.net.peer .
Такие события, как подключение, отключение и данные, получены через объект хоста, в то время как объекты одноранговых однозначности могут использоваться для отправки данных или активного отключения.
На этом этапе подключение, отключение, отправка и приема операций не блокируются; открытые и близкие блокируются (по очевидным причинам).
Обратите внимание, что один и тот же объект хоста может использоваться для активного запроса соединений и приема входящих соединений все одинаково, что делает его пригодным для использования в топологиях P2P. Роли клиента/сервера не соблюдаются и возникают просто из -за того, как настроен хост. Хост может даже одновременно отправлять запросы на соединение на несколько удаленных хостов.
Примеры :
Объект хоста создается для подключения к удаленному сверстнику. Внутренняя петля отвечает за то, чтобы события не были привлечены к следующей итерации.
using ( var host = new Host ( "MyHost" )
{
host . Open ( IPEndPoint . Any , new Host . Settings ( 0 ) ) ;
host . Connect ( new IPEndPoint ( IPAddress . Loopback , 1313 ) , out Peer peer ) ;
.. .
while ( true )
{
while ( host . TryGetEvent ( out Event e ) )
{
if ( e . EventType == EventType . Data )
Console . WriteLine ( $ "DATA: { e . Peer } { e . Data } " ) ;
else if ( e . EventType == EventType . Connection )
Console . WriteLine ( $ "CONNECTED: { e . Peer } " ) ;
else if ( e . EventType == EventType . Disconnection )
{
Console . WriteLine ( $ "DISCONNECTED: { e . Peer } { e . Reason } " ) ;
return ;
}
}
Thread . Sleep ( 33 ) ;
}
}Объект хоста создал создание, чтобы ждать до 10 входящих соединений. Внутренняя петля отвечает за то, чтобы события не были привлечены к следующей итерации.
using ( var host = new Host ( "MyHost" )
{
host . Open ( new IPEndPoint ( IPAddress . Loopback , 1313 ) , new Host . Settings ( 10 ) ) ;
.. .
while ( true )
{
while ( host . TryGetEvent ( out Event e ) )
{
if ( e . EventType == EventType . Data )
Console . WriteLine ( $ "DATA: { e . Peer } { e . Data } " ) ;
else if ( e . EventType == EventType . Connection )
Console . WriteLine ( $ "CONNECTED: { e . Peer } " ) ;
else if ( e . EventType == EventType . Disconnection )
{
Console . WriteLine ( $ "DISCONNECTED: { e . Peer } { e . Reason } " ) ;
return ;
}
}
Thread . Sleep ( 33 ) ;
}
} Этот проект восходит к 2015 году, когда я приехал в Канаду, чтобы изучить дизайн и разработку видеоигр в кинокол. Торонто. Первоначальная мотивация состояла в том, чтобы создать сборник аксессуаров, которые можно повторно использовать в нескольких проектах Unity3D. Через некоторое время я начал исследовать сетевые решения для многопользовательской игры в проспекте, и фокус сместился в направлении разработки повторного сетевого модуля. Первоначально я обратился к этой проблеме как простой вопрос интеграции UNET или любой другой подходящей сторонней библиотеки, которую я мог найти в то время. Вскоре после этого я начал сталкиваться со всевозможными проблемами от разбитых допущений до скрытых компромиссов реализации. Было нередко находить надутые (почти вводящие в заблуждение) списки функций, несовместимости проектирования или простых разбитых реализаций. В частности, больше всего меня беспокоило, так это то, что многие аспекты решений казались случайно произвольными, практически без объяснения объяснения того, почему этот подход был предпочтительным или определенным пределом. Я бы часами проверил источник проекта, делая заметки, чтобы выяснить, почему что -то было так, как только понять, что другая часть кода была прямо противоречила.
Все это привело меня к большей работе, и в конце концов я решил создать легкую сетевую библиотеку самому с разумным списком функций, который я мог бы реализовать и проверить. Нет спешки, никаких сроков. Просто искренняя попытка реализовать лучшее техническое решение, которое я мог бы разработать.
Тем временем я закончил обучение, вернулся на работу на полный рабочий день и должен был отложить этот проект в сторону. Год назад, обнаружив несколько старых заметок, я восстановил свой архив прототипов и решил собрать всеобъемлющую сборку со всей информацией, которую я собрал, чтобы не только другие люди могли экспериментировать с ней, но и понять, как это сработало и почему.
Управляемые сборки могут быть построены на любой платформе с компилятором, который поддерживает C# 7.3 или выше. Тесты и приложения для вспомогательных приложений требуют NetCore 2.2.
Нативные библиотеки могут быть построены с использованием Cmake с GCC или Visual Studio.
Поддерживаемые версии ОС:
Для любой другой платформы или в отсутствие требуемой нативной библиотеки существует код запасного.
Все проекты C# и сценарии сборки настроены для хранения промежуточных файлов и двоичных файлов в папке сборки , расположенной в корне проекта, поэтому сборки можно легко осмотреть, проверять и очистить.
Код использует Dllimport для привязки собственных библиотек. Dllimport всегда может использовать имена библиотеки Windows и автоматически добавят префиксы/суффиксы других платформ по мере необходимости. Например, carambolas.net.native.dll, имя нативной библиотеки в Windows становится libcarambolas.net.native.dll.so на Linux и libcarambolas.net.native.dll.dynlib на macos. Сценарии построения уже создают библиотеки под собственными именами.
Для удобства включено решение для визуальной студии, поэтому для Windows не требуется никаких дополнительных этапов сборки. Обязательно выберите платформу, соответствующую операционной системе хоста (либо x86, либо x64). Это необходимо для создания тестовых приложений и для модульных тестов. Все сборки .NET созданы для AnyCPU независимо от выбранной платформы решений, но Visual Studio должна знать, какие нативные библиотеки создают для тестирования, поскольку они должны быть развернуты бок о бок с соответствующими сборами.
Используйте nugetpack.bat, чтобы скомпилировать собственную библиотеку и портативные сборки и создать пакеты Nuget в одном действии.
Используйте build.bat для создания всех проектов для выпуска без использования Visual Studio.
Visual Studio для Mac не была проверена и не поддерживается, поэтому не ожидайте, что она будет работать.
Убедитесь, что у вас есть Cmake (> = 2,8) и GCC, чтобы скомпилировать собственную библиотеку. Dotnet Core SDK 2.1 необходим для составления сборок и генерации пакетов Nuget.
Используйте nugetpack.sh, чтобы скомпилировать собственную библиотеку и портативные сборки и создать пакеты Nuget в одном действии.
Используйте build.sh для создания всех проектов для выпуска без использования Visual Studio.
Убедитесь, что установили Cmake (> = 2,8), сборка и GCC-Multilib, чтобы иметь возможность компилировать собственную библиотеку как для x86, так и для X64.
На ubuntu run: $ sudo apt-get установить строительную gcc-multilib g ++-multilib cmake
Dotnet Core SDK 2.1 необходим для составления сборки и генерации пакетов Nuget.
На Ubuntu Run:
$ wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get update;
sudo apt-get install -y apt-transport-https &&
sudo apt-get update &&
sudo apt-get install -y dotnet-sdk-2.1
Используйте nugetpack.sh, чтобы скомпилировать собственную библиотеку и портативные сборки и создать пакеты Nuget в одном действии.
Используйте build.sh для создания всех проектов для выпуска без использования Visual Studio.
Минимальный набор модульных тестов реализован вокруг ключевых функций с использованием проектов XUNIT.
Carambolas.net.tests.host - это простое приложение для консоли, используемое для вручную проверку базовой функциональности сети. Это особенно полезно, когда на стороне Wireshark и неуклюже
Carambolas.net.tests.integration - это набор интеграционных тестов для Carampolas.net, также реализованный с помощью XUNIT. Тесты выполняются последовательно, каждый из которых начинает два отдельных потока (сервер и клиент), которые общаются через интерфейс Loopback в течение определенного времени. Петушка представляет собой идеальную сеть, в которой время в оба конца минимально, пакеты никогда не выходят из строя и никогда не теряются, если не будет переполнения Баффера. Эти характеристики полезны для проверки нормальных путей выполнения.
Wireshark - это бесценный инструмент отладки, который можно использовать для мониторинга сетевой активности и осмотра пакетов. Кроме того, Wireshark поддерживает специальный класс плагинов, называемых диссекторами, которые можно использовать для анализа пользовательских протоколов.
Этот проект включает в себя базовый диссектор Wireshark для Carambolas. Чтобы использовать его, убедитесь, что Wireshark уже установлен.
Curmsy-это программа захвата сетевых пакетов, которая работает в пользовательском режиме и способна перехватывать пакеты для моделирования деградированных сетевых условий в режиме реального времени.
Добавьте предварительную линию фильтра, например, следующую в файле config.txt, чтобы воздействовать на хосты, подключенные интерфейсом Loopback, на том же порте, который использовался в интеграционных тестах (1313):
carambolas: udp and outbound and loopback and (udp.DstPort == 1313 or udp.SrcPort == 1313)
Обратите внимание, что есть несколько предостережений при использовании неуклюжего с интерфейсом Loopback. От неуклюжего руководства пользователя:
- Входящие пакеты Loopback не могут быть захвачены или повторно. Когда вы думаете об этом, действительно трудно сказать, что это входящий или исходящий пакет, когда вы отправляете пакеты с компьютера на себя. Фактически, базовая платформа фильтрации Windows, кажется, классифицирует все пакеты Loopback как исходящие. Запомнить, что когда вы обрабатываете на петлевых пакетах, вы не можете иметь «вход» в своем фильтре. Важно знать, что ваш компьютер может иметь IPS, кроме 127.0.0.1, как интрасетиный IP, выделяемый вашим маршрутизатором. Они также считаются петлевыми пакетами.
- Пакеты с петлю запечатлены дважды. Поскольку у нас нет входящих пакетов петли, все пакеты Loopback считаются исходящими. Таким образом, неуклюжий их дважды обрабатывает: первый раз, когда отправляется, и во второй раз при получении. Простым примером является то, что когда фильтр просто «исходящий», и применяйте задержку 500 мс. Когда вы пинг на Localhost, это будет задержка 1000 мс. Вы можете обойти его, указав порт назначения и тому подобное. Но было бы легче просто помнить об этом и будьте осторожны при установлении параметров.
- Входящий захват пакетов не работает постоянно. Как отмечалось ранее, входящие пакеты Loopback не могут быть внесены. Проблема в том, что в некоторых случаях некоторые пакеты могут быть классифицированы как входящие пакеты, даже если IP -адрес назначения не ваш компьютер. Это влияет только на пакеты без плиты. Если вы работаете только над Localhost, все будет хорошо. Цель будущего выпуска состоит в том, чтобы диагностировать это вызвано, и обеспечить решение.
- Невозможно фильтровать на основе общего захвата сети процессов, перечисляется в качестве функции. Но на самом деле это так, поскольку нет простого способа предоставить надежное решение.
Я всегда открыт для вкладов, либо в виде отчетов об ошибках, исправлений ошибок (еще лучше!), Либо улучшенное тестовое покрытие.
Запросы на функции приветствуются, но могут быть сохранены в отставании в зависимости от того, насколько обширны, осуществимы или желательны. Если запрос на функцию слишком сложный, он может зависеть от спонсорства, поскольку у меня есть ограниченные ресурсы (время и деньги) для посвящения.
Если вы хотите поддержать этот проект, мне может быть интересно услышать от вас, так что протяните руку!
На португальском языке Карамболас - это форма карамболы во множественном числе (= starfruit). Термин также используется в разговорной речи в определенных регионах Бразилии для выражения удивления или нетерпения.
Перед Карамболасом я предпринял как минимум полдюжины попыток организовать свои идеи в полезном проекте. С Карамболасом я решил построить серию прототипов, чтобы узнать о проблемах дизайна и проверить различные подходы. Каждый прототип имел кодовое имя, сформированное буквой, и номер, начинающийся с A1. Исходным кодом, который первоначально был импортирован в этом хранилище, была 75 -я итерация 9 -го прототипа, следовательно, A9.
Нативные библиотеки предоставляются в основном по соображениям производительности, поэтому они абсолютно необязательны. Было бы необоснованно попытаться предоставить собственную реализацию для каждой возможной платформы (подумайте обо всех рабочих столах, мобильных, консоли, встроенных ...), и полагаться исключительно на собственные библиотеки уменьшит целевые платформы только к горстке, возможно, только на рабочем столе (Windows, Linux и MacOS). Таким образом, как правило, в управляемом коде всегда должна быть запасная реализация для любой функции, реализованной нативной библиотекой.
Поскольку нативные библиотеки являются необязательными, программа не может сказать, должен ли там быть недостающий файл или нет, поэтому не было ошибки, не брошенной или зарегистрировано для пропущенной нативной библиотеки. По определению, отсутствующая собственная библиотека никогда не является ошибкой.
В общем, вы не можете. И вы не должны, по крайней мере, не с точки зрения API. Не должно иметь значения для пользователя (или программиста приложений), какая основная стратегия реализации используется в зависимости от зависимости, в данном случае Carambolas. Однако эта информация может быть актуальна для развертывания, поэтому каждый раз, когда создается объект Interop, который также имеет автоматический отступление, код дает индикативную информацию о журнале. Например, Carambolas.net.socket будет создавать информацию о журнале, аналогичную «использованию Carambolas.net.sockets.native.socket», когда нативная библиотека будет найдена для реализации базового сокета. Таким образом, если вы развертываете с помощью местных библиотек, вы можете определить, используются ли они на самом деле.
Это означает, что вы развертываете нативную библиотеку, которая либо испорчена, либо составлена для неправильной архитектуры процессора.
Нативные библиотеки должны идти бок о бок с соответствующими сборами взаимодействия, и, хотя сборки могут быть составлены один раз для любой архитектуры процессора, нативные библиотеки не могут. Они должны соответствовать архитектуре процессора рабочей операционной системы, в противном случае они рассматриваются как коррумпированные файлы, а .NET бросает систему. BadimageformateXception. Обратите внимание, что это не то же самое, что пытаться загрузить библиотеку, которая не найдена, которая по определению не является ошибкой.
Продукт задержки полосы пропускания (BDP) является продуктом пропускной способности передачи сетевой ссылки (в битах в секунду) и его времени задержки в оба конца (в секундах). Он представляет собой максимальный объем данных, которые сеть может сохранить до того, как может появиться любое подтверждение.
BDP может использоваться для классификации сетей в зависимости от того, находится ли он выше или ниже определенного порога. Сети с большим BDP называются длинными жирными сетями (LFN). LFN могут быть сетями с очень большим средним средним временем в обратном пути (безрегулируемой пропускной способности, как в спутниковых звенах) или широкой сетью (высокая полоса), которая отображает значительно небольшие времена обработки (как в гигабитных ссылках Ethernet).
Проверьте Википедию для получения дополнительной информации об этом.
Объект Carrammbolas.net.socket служит фасадом для реализации собственного сокета или реализации запасной, которая полагается на System.net.sockets.socket. Это помогает отделить и уменьшить сложность объектов хозяина и сверстников. Обратитесь к Doc/readme-carambolas.net для получения дополнительной информации.
System.net.IpAddress и System.net.IpendPoint - это изменяемые объекты, которые способствуют ряд неотъемлемых ассигнований во всех текущих реализациях .NET Core и .net Framework. Carambolas.net.IpAddress и Carambolas.net.IpendPoint - это неизменные типы значений, которые способствуют снижению давления GC. Обратитесь к Doc/readme-carambolas.net для получения дополнительной информации.
Aead with Chacha20 и Poly1305 поддерживается вне коробки. Пользовательские стратегии могут быть реализованы путем предоставления хоста реализации интерфейсов Carampolas.net.icipher и Carambolas.net.icipherfactory. Единственные требования:
Пользовательское приложение может свободно сжимать свои данные перед отправкой, но в настоящее время нет механизма для обеспечения автоматического сжатия/декомпрессии отдельных сообщений или полных пакетов.
Весь исходный код и любые двоичные файлы, созданные для развертывания вместе с пользовательским приложением, лицензированы по лицензии MIT.
Carambolas.commandlinearguments была основана на статье Griffonrl с исходным кодом, опубликованным по лицензии MIT с дополнительными идеями из другой статьи Джейка Джиннивана, которая расширилась на исходном источнике.
Carambolas.security.comprogygraphy.crc32c был основан на CRC32.NET с силой по лицензии MIT.
Carambolas.security.comegraphy.nacl был основан и расширен на NaCl.core Дэвидом де Сметом по лицензии MIT.
Диссектор по протоколу, написанный в LUA для Wireshark, доступен по лицензии GPLV3. Он должен использоваться только в качестве входного файла для Wireshark, чтобы расширить свои возможности и позволить ему отображать больше информации о пакетах UDP, отформатированных в соответствии с протоколом сети Карамболаса. Поэтому он полностью отделен и не взаимодействует, не зависит и не вносить свой вклад каким -либо образом любым исходным файлам, сборкам или собственным библиотекам.