пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
В современном мире рынком правят мобильные и веб-приложения. Преобладающая позиция – ориентация в первую очередь на мобильные или веб-устройства. Но это вовсе не значит, что настольные приложения никому не нужны. Мы все также нуждаемся в наших любимых настольных приложениях.
Давайте посмотрим на некоторые примеры, где могут использоваться настольные приложения:
Автономные коммерческие приложения
Приложения для совместной работы
Утилиты и плагины
Системные приложения и службы
Мультимедийные приложения
Сетевые приложения
Как правило, все эти инструменты именуются «настольными приложениями». Но у каждого из них свой набор функций, причем как с точки зрения функциональных возможностей, так и в рамках стека технологий.
Все становится еще более запутанным, когда ваше приложение нуждается в пользовательском интерфейсе. В таком случае это значит, что вам нужно подыскивать
инструменты для создания пользовательского интерфейса
.
У вас может возникнуть вопрос, почему я использую слово «инструменты», а не что-то наподобие «фреймворки», «библиотеки», «элементы интерфейса» и т.д.?
Хороший вопрос!
Ответ довольно короткий: не все ИНСТРУМЕНТЫ, которые я буду описывать ниже, принадлежат в одной и той же категории.
Я вам докажу. Давайте посмотрим на список инструментов, которые я буду здесь рассматривать. Я добавил краткие определения с официальных страниц в Википедии:
Winforms
: бесплатная
библиотека графических классов
с открытым исходным кодом.
WPF
: бесплатная
графическая подсистема
с открытым исходным кодом.
UWP
:
вычислительная платформа
Cocoa
: собственный объектно-ориентированный
интерфейс прикладного программирования (API – Application Programming Interface)
.
Electron
:
программная среда
с открытым исходным кодом.
Swing
:
набор элементов интерфейса для создания графических пользовательских интерфейсов
.
JavaFX
:
программная платформа
Qt
:
набор элементов интерфейса для создания графических пользовательских интерфейсов
.
Xojo
:
среда и язык программирования
.
Lazarus
:
бесплатная кросс-платформенная визуальная интегрированная среда разработки (IDE – Integrated Development Environment)
.
Видите? Здесь десять разных названий для десяти разных ИНСТРУМЕНТОВ.
Это вводит разработчиков в заблуждение.
Допустим, вы хотите разработать настольное приложение с пользовательским интерфейсом. Вы начинаете искать по одному или двум из этих ключевых слов (или по каким-то похожим). Однако вы упускаете другие варианты.
Давайте приведем пример. Введем запрос в гугл:
«лучшая библиотека графических классов для разработки настольных приложений».
В итоге вы найдете Winforms в большинстве результатов поиска.
А как же WPF, Swing, Qt и все прочие варианты из списка выше? А ведь они тоже отлично подойдут для вашей задачи.
И это именно то, с чем я хочу разобраться в этой статье. Я хочу познакомить вас с 10 инструментами для создания пользовательского интерфейса. В дальнейшем вы сможете сосредоточить свое внимание на плюсах и минусах каждого из них и, исходя из своих потребностей, выбрать тот инструмент, который вам подходит больше всего.
#1 – Winforms
Windows Forms – это самый старый потомок GUI-библиотек (библиотек для построения графических пользовательских интерфейсов) Microsoft .NET.
Впервые он был выпущен еще в 2002 году как часть .NET Framework. И вот, прошло почти 20 лет, и он все еще является одним из самых популярных инструментов для создания настольных приложения для ОС Windows.
Научиться работать с WinForms не так сложно. Основная идея состоит в том, то вы рассматриваете приложения с пользовательским интерфейсом как пользовательское приложение, которое управляется событиями. А для проектирования и разработки приложений вы можете использовать конструктор Visual Studio, который работает посредством перетаскивания элементов.
Даже если вам не нужно, чтобы ваш пользовательский интерфейс адаптировался под размеры экрана, или же проект сам по себе не такой большой, то данный инструмент все равно отлично подойдет для вашей работы. Однако Winforms утрачивает свою актуальность, и в большинстве случаев он не является вариантом номер один.
#2 – WPF
Windows Presentation Foundation (WPF) – это второе детище среди графических инструментов от Microsoft .NET. Сейчас это один из самых популярных и усовершенствованных инструментов для разработки настольных приложения для ОС Windows.
Впервые он был выпущен в 2006 году. Шли годы, и он становился все более полноценным. На данный момент WPF является частью дистрибутива .NET Core.
Если сравнивать его с WinForms, то у него гораздо более широкий спектр функциональных возможностей. У него много потрясающих шаблонов, стилей и привязок. Кроме того, есть немало внешних инструментов/библиотек, например, MVVM Light, Prism, Caliburn.Micro, и наборов элементов управления от таких компаний, как Telerik. Все это делает процесс разработки существенно проще.
Однако он имеет довольно крутую кривую обучения. Это объясняется тем, что вам нужно изучить синтаксис XAML (Extensible Application Markup Language – расширяемый язык разметки приложений) и шаблон проектирования MVVM (Model-View-ViewModel – Модель-Представление-Модель представления).
#3 – UWP
Сейчас мы с вами поговорим о недавно появившемся продукте Microsoft .NET, а именно Universal Windows Platform (UWP).
Компания Microsoft создала эту вычислительную платформу с графическим пользовательским интерфейсом в 2012 году, и с того времени она активно ее продвигала. Хотелось бы надеяться, что у них получится сделать из нее золотой стандарт для приложений с пользовательским интерфейсом.
Если вы знаете, как работать с WPF, то (практически) знаете, как работать с UWP. В его основе также лежит XAML, он работает с теми же шаблонами проектирования и стратегиями привязки. Кроме того, в рамках проектов UWP вы можете использовать готовые шаблоны или наборы элементов управления.
Существенное различие здесь в том, что UWP ориентирован на устройства с ОС Windows 10 (ПК, смартфоны, планшеты, Xbox и т.д.).
Самое классное в UWP – это то, что как только вы завершить разработку приложения, вы можете обнародовать свое решение в Windows Store, и, будем надеяться, заработать немного денег.
#4 – Cocoa
Cocoa – это собственный объектно-ориентированный API, который предназначен для разработки настольных приложения для ОС macOS. Это первый и самый банальный инструмент, который приходит в голову, если речь идет о разработке настольных приложений на платформе macOS.
У Cocoa довольно большой спектр различных функциональных возможностей, например, элементы пользовательского интерфейса, анимация и распознавание жестов.
Когда вы разрабатываете настольные приложения с помощью Cocoa, вы можете пойти двумя путями:
Воспользоваться собственными инструментами macOS (например, XCode)
Воспользоваться другими языками программирования (например, Python, Ruby, Perl)
Если вы выберите второй вариант, то вам потребуются «мосты» и «соединители» (например, PyObjC, RubyCocoa и PasCocoa).
#5 – Electron
Electron – это бесплатный проект с открытым исходным кодом. Его разработал GitHub, и сопровождает его тоже GitHub. Многие компании, например, Stack, Microsoft и Facebook, применяют этот фреймворк в своих разработках.
Самое классное в Electron то, что вы можете разрабатывать кроссплатформенные настольные приложения с помощью HTML, CSS и JavaScript. Для разработки настольных приложений, которые можно запускать через браузер, он использует NodeJS и Chromium. Кроме того, вместе с Electron вы можете использовать различные фреймворки и библиотеки, например, Angular, React или Vue.
Самое плохое, что я могу сказать об Electron, - он потребляет очень много ресурсов ЦП. Однако если вам не нужен большой объем памяти, то это не будет для вас большой проблемой.
#6 – Swing
Swing – это набор инструментов для создания графического пользовательского интерфейса, в основе которого лежит Java. В него входят большое количество различных элементов интерфейса и пакетов. В связи с этим, для того, чтобы запустить Swing, вам нужно установить JRE.
С помощью Swing вы можете разрабатывать мощные настольные приложения. В нем вы можете найти дополнительные возможности для построения графического пользовательского интерфейса, например, визуализация данных представлений или обработчики событий.
У Swing есть еще одна приятная особенность – настольные приложения можно делать переносимыми. Вы можете с легкостью превратить свое настольное приложение в веб-приложение, внеся небольшие изменения в код.
Но у Swing есть и недостаток – его код очень сильно привязан к виртуальной машине Java (JVM – Java Virtual Machine). Получается, что запуск приложений, в основе которых лежит Swing, на мобильных устройствах ограничен. Кроме того, Swing не полностью совместим с последними версиями Java, а использование более старых версий для запуска тяжелых приложений может замедлить вашу работу.
#7 – JavaFX
JavaFX – это еще один фреймворк, основанный на Java. Он предназначен для проектирования и разработки мощных настольных приложений на всех основных платформах (Windows, Linux, Mac).
JavaFX является частью Eclipse IDE, а фонд компании Oracle побуждает разработчиков перейти с Swing на JavaFX.
Если сравнивать JavaFX c Swing, то он выигрывает на его фоне за счет более современных и навороченных функций. Сюда относятся большой набор графических компонентов, функции, связанные с вводом данных и их визуализацией. Кроме того, вы можете создавать графические интерфейсы без единой строки кода; для этого вам понадобиться компоновщик сцен JavaFX.
И тем не менее, помните о том, что у JavaFX довольно небольшое сообщество и крутая кривая обучения.
#8 – Qt
Qt – это набор элементов интерфейса, в основе которого лежит C++. Он предназначен для создания кроссплатформенных пользовательских интерфейсов и настольных приложений. Многие крупные компании, например, Microsoft, Philips, Tesla, HP, Volvo, BMW и Huawei, используют Qt в процессе разработки их программных обеспечений. Это многое говорит о его возможностях и надежности.
Поддержка С++ делает его идеальным вариантов для создания инструментов, оптимизированных с точки зрения потребления ресурсов. Кроме того, он совместим со всеми основными платформами, такими как Windows, Linux, Mac OS, Android, и встраиваемыми системами.
У Qt есть один недостаток: внешний вид пользовательских интерфейсов, созданных с его помощью, может не сильно вызывать восторг. Но и это еще не все, было бы здорово, если бы вы изучили QML (декларативный язык, который чем-то похож на JSON).
#9 – Lazarus
Lazarus – это кроссплатформенная визуальная IDE, которая предназначена для разработки настольных и мобильных приложений. У нее есть конструктор окон, где вы можете перетаскивать графические элементы. После чего вы можете добавить логику функционирования приложения в уже добавленные графические элементы. Более того, у вас есть возможность создавать свои собственные эксклюзивные компоненты.
Lazarus делает процесс разработки настольных приложений приятным и спокойным. Одно приложение может быть ориентировано и на macOS, и на Linux, и на Windows (с небольшими изменениями или вовсе без них). Lazarus предлагает различные компоненты, которые позволяют подключаться к базам данных MySQL, PostgreSQL, FireBird, Oracle, SQLite, Sybase и т.д., и, под занавес, набор графических компонентов, который доступен через конструктор пользовательского интерфейса, и внешние элементы управления от сторонних разработчиков.
Pascal – это довольно старый язык программирования. Он не пользуется такой популярностью, как современные языки программирования, например, С#, Java или Python. А это значит, что соответствующих онлайн-ресурсов не так много, и обновления для языка и IDE выпускаются не так часто.
#10 – Xojo
Пожалуй, Xojo – это самый малоизвестный фреймворк, предназначенный для разработки настольных приложений, среди тех, которые представлены в этом списке. Что самое интересное, этот фреймворк не такой уж и молодой (он появился в середине 90-х годов). Однако вплоть до 2019-2020 годов он не смог привлечь к себе должного внимания. В большой степени это связано с тем, что Xojo принял решение добавить больше различных функций для macOS, Linux и iOS.
Xojo – это объектно-ориентированный язык программирования. Если говорить о процессе разработки настольных приложений, он предлагает такие функции, как собственные элементы управления, пользовательский интерфейс с возможностью перетаскивания элементов и платформу. Самое классное в Xojo то, что вы можете разрабатывать программное обеспечение, которое ориентировано на macOS, Microsoft Windows, Linux, iOS, Raspberry Pi и Интернет.
Кроме того, Xojo пользуется популярностью в коммерческой области. Он не является общедоступным, и несмотря на то, что вы можете пользоваться IDE совершенно бесплатно, если вы планируете создавать автономные приложения, за это придется платить. При этом многие разработчики отмечали, что Xojo подвержен ошибкам и имеет низкую производительность.
Заключение
Если вы планируете разрабатывать настольные приложения с пользовательским интерфейсом, вам стоит учесть некоторые аспекты:
Планируете ли вы создавать кроссплатформенные приложения?
Какие языки программирования вы предпочитаете использовать в работе?
Необходима ли вам оптимизация использования ресурсов?
Какие графические функции вам нужны?
Хотите ли вы обнародовать свой конечный продукт или вы будете использовать его в пределах своего компьютера?
И т.д.
Вот мои личные рекомендации:
Если вы хотите, чтобы процесс разработки был быстрым, и вам не нужны всякие навороченные функции, используйте Winforms.
Если вы знаете, что такое MVVM, и знакомы с XAML, и ваше приложение не нуждается в сложных функциях пользовательского интерфейса, используйте WPF.
Если вы планируете разрабатывать настольные приложения для Windows 10, используйте UWP.
Если вы планируете разрабатывать настольные приложения для macOS, используйте Cocoa.
Если вы знаток в том, что касается веб-разработки, и хотите разрабатывать кроссплатформенные приложения, которые не требуют большого объема памяти, используйте Electron.
Если вы планируете переходить к веб-версии приложения и не хотите прикладывать много усилий, используйте Swing.
Если вы планируете разрабатывать кроссплатформенные настольные приложения с современным внешним видом, используйте JavaFX.
Если вы планируете создавать сложные настольные приложения, которые будут оптимизированы с точки зрения потребления ресурсов и независимы от платформы, используйте Qt.
Если вы планируете разрабатывать простые кроссплатформенные приложения, но не хотите прикладывать для этого много усилий, используйте Lazarus.
Если вы ищете более современный инструмент для того, чтобы создавать кроссплатформенные настольные приложения, используйте Xojo.
Основная цель TCP состоит в том, чтобы обеспечить транспортировать данные поверх IP. Как протокол более высокого уровня, он полагается на возможности адресации и мультиплексирования IPv6 для передачи информации на правильный хост назначения. По этой причине TCP не требует схемы адресации.
Управление потоком
TCP использует метод скользящего окна для управления потоком информации по каждому соединению между двумя хостами. Рисунок 1 демонстрирует это. На рисунке 1 предположим, что начальный размер окна установлен равным 20. Затем последовательность событий:
В момент времени t1 отправитель передает 10 пакетов или октетов данных (в случае TCP это 10 октетов данных).
В момент времени t2 получатель подтверждает эти 10 октетов, и для окна установлено значение 30. Это означает, что отправителю теперь разрешено отправлять еще до 30 октетов данных перед ожиданием следующего подтверждения; другими словами, отправитель может отправить до 40 октетов, прежде чем он должен будет дождаться подтверждения для отправки дополнительных данных.
В момент времени t3 отправитель отправляет еще 5 октетов данных, номера 11–15.
В момент времени t4 приемник подтверждает получение октетов через 15, и окно устанавливается на 40 октетов.
В момент времени t5 отправитель отправляет около 20 октетов данных, пронумерованных 16–35.
В момент времени t6 получатель подтверждает 35, и окно устанавливается на 50.
Следует отметить несколько важных моментов, касающихся этой техники:
Когда получатель подтверждает получение определенного фрагмента данных, он неявно также подтверждает получение всего, что было до этого фрагмента данных.
Если приемник не отправляет подтверждение—к примеру , передатчик отправляет 16-35 в момент времени t5, а приемник не отправляет подтверждение—отправитель будет ждать некоторое время и считать, что данные никогда не поступали, поэтому он будет повторно отправлять данные.
Если получатель подтверждает некоторые данные, переданные отправителем, но не все, отправитель предполагает, что некоторые данные отсутствуют, и ретранслирует с точки, которую подтвердил получатель. Например, если отправитель передал 16-35 в момент времени t6, а получатель подтвердил 30, отправитель должен повторно передать 30 и переслать.
Окно устанавливается как для отправителя, так и для получателя
Вместо использования номеров октетов TCP присваивает каждой передаче порядковый номер; когда приемник подтверждает определенный порядковый номер, передатчик предполагает, что приемник фактически получил все октеты информации вплоть порядкового номера передачи. Для TCP, таким образом, порядковый номер действует как своего рода “стенография” для набора октетов. Рисунок 2 демонстрирует это.
На рисунке 2:
В момент времени t1 отправитель объединяет октеты 1–10 и передает их, помечая их как порядковый номер 1.
В момент времени t2 получатель подтверждает порядковый номер 1, неявно подтверждая получение октетов 1–10.
В момент времени t3 отправитель связывает октеты 11–15 вместе и передает их, помечая их как порядковый номер 2.
В момент времени t4 получатель подтверждает порядковый номер 2, неявно подтверждая октеты, отправленные через 15.
В момент времени t5 предположим, что 10 октетов поместятся в один пакет; в этом случае отправитель отправит два пакета, один из которых содержит 16–25 с порядковым номером 3, а другой - октеты 26–35 с порядковым номером 4.
В момент времени t6 приемник подтверждает порядковый номер 4, неявно подтверждая все ранее переданные данные.
Что произойдет, если один пакет информации будет пропущен?
Что делать, если первый пакет из потока в 100 пакетов не получен? Используя систему, описанную на рисунке 2, получатель просто не подтвердит этот первый пакет информации, вынуждая отправителя повторно передать данные через некоторое время. Однако это неэффективно; каждый потерянный пакет информации требует полной повторной отправки из этого пакета. Реализации TCP используют два разных способа, чтобы получатель мог запросить один пакет.
Первый способ - тройное признание. Если получатель трижды подтверждает пакет, который предшествует последнему подтвержденному серийному номеру, отправитель предполагает, что получатель запрашивает повторную передачу пакета. Три повторных подтверждения используются для предотвращения неправильной доставки пакетов или отброшенных пакетов, вызывающих ложный запрос на повторную передачу.
Второй способ заключается в реализации выборочных подтверждений (SACK).15 SACK добавляет новое поле к подтверждению TCP, которое позволяет получателю подтвердить получение определенного набора серийных номеров, а не предполагать, что подтверждение одного серийного номера также подтверждает каждый более низкий серийный номер.
Как долго передатчик ждет перед повторной передачи?
Первый способ, которым отправитель может обнаружить потерянный пакет - это время ожидания повторной передачи (RTO), которое рассчитывается как функция времени приема-передачи (RTT или rtt). Rtt — это временной интервал между передачей пакета отправителем и получением подтверждения от получателя. RTT измеряет задержку в сети от передатчика до приемника, время обработки в приемнике и задержку в сети от приемника до передатчика. Обратите внимание, что rtt может варьироваться в зависимости от пути, по которому каждый пакет проходит через сеть, локальных условий в момент коммутации пакета и т. д.
RTO обычно рассчитывается как средневзвешенное значение, при котором более старые временные интервалы оказывают меньшее влияние, чем более поздние измеренные значения.
Альтернативным механизмом, используемым в большинстве реализаций TCP, является быстрая ретрансляция. При быстрой повторной передаче получатель добавляет единицу к ожидаемому порядковому номеру в любом подтверждении. Например, если отправитель передает последовательность 10, получатель подтверждает последовательность 11, даже если он еще не получил последовательность 11. В этом случае порядковый номер в подтверждении подтверждает получение данных и указывает, какой порядковый номер он ожидает от отправителя для передачи в следующий раз.
Если передатчик получает подтверждение с порядковым номером, который на единицу больше последнего подтвержденного порядкового номера три раза подряд, он будет считать, что следующие пакеты были отброшены.
Таким образом, существует два типа потери пакетов в TCP, когда реализован быстрый запуск. Первый-это стандартный тайм-аут, который возникает, когда отправитель передает пакет и не получает подтверждения до истечения срока действия RTO. Это называется отказом RTO. Второй называется быстрым сбоем ретрансляции. Эти два условия часто обрабатываются по-разному.
Как выбирается размер окна?
При выборе размера окна необходимо учитывать ряд различных факторов, но доминирующим фактором часто является получение максимально возможной производительности при одновременном предотвращении перегрузки канала. Фактически, контроль перегрузки TCP, вероятно, является основной формой контроля перегрузки, фактически применяемой в глобальном Интернете. Чтобы понять контроль перегрузки TCP, лучше всего начать с некоторых определений:
Окно приема (RWND): объем данных, которые приемник готов принять; это окно обычно устанавливается на основе размера буфера приемника или какого-либо другого ресурса, доступного в приемнике. Это размер окна, объявленный в заголовке TCP.
Окно перегрузки (CWND): объем данных, которые передатчик готов отправить до получения подтверждения. Это окно не объявляется в заголовке TCP; получатель не знает размер CWND.
Порог медленного запуска (SST): CWND, при котором отправитель считает соединение с максимальной скоростью передачи пакетов без возникновения перегрузки в сети. SST изначально устанавливается реализацией и изменяется в случае потери пакета в зависимости от используемого механизма предотвращения перегрузки.
Большинство реализаций TCP начинают сеансы с алгоритма медленного старта. 16 На этом этапе CWND начинается с 1, 2 или 10. Для каждого сегмента, для которого получено подтверждение, размер CWND увеличивается на 1. Учитывая, что такие подтверждения должны занимать ненамного больше времени, чем один rtt, медленный запуск должен привести к удвоению окна каждого rtt. Окно будет продолжать увеличиваться с этой скоростью до тех пор, пока либо пакет не будет потерян (приемник не сможет подтвердить пакет), CWND не достигнет RWND, либо CWND не достигнет SST. Как только любое из этих трех условий происходит, отправитель переходит в режим предотвращения перегрузки.
Примечание. Каким образом увеличение CWND на 1 для каждого полученного ACL удваивает окно для каждого rtt? Идея состоит в следующем: когда размер окна равен 1, вы должны получать один сегмент на каждый RTT. Когда вы увеличиваете размер окна до 2, вы должны получать 2 сегмента в каждом rtt; на 4, вы должны получить 4 и т. д. Поскольку получатель подтверждает каждый сегмент отдельно и увеличивает окно на 1 каждый раз, когда он подтверждает сегмент, он должен подтвердить 1 сегмент в первом rtt и установить окно на 2; 2 сегмента во втором rtt, добавляя 2 к окну, чтобы установить окно на 4; 4 сегмента в третьем RTT, добавив 4 к окну, чтобы установить размер окна равным 8 и т. д.
В режиме предотвращения перегрузки CWND увеличивается один раз за каждый rtt, что означает, что размер окна перестает расти экспоненциально, а вместо этого увеличивается линейно. CWND будет продолжать расти либо до тех пор, пока получатель не подтвердит получение пакета (TCP предполагает, что это означает, что пакет был потерян или отброшен), либо пока CWND не достигнет RWND. Существует два широко распространенных способа, которыми реализация TCP может реагировать на потерю пакета, называемых Tahoe и Reno.
Примечание. На самом деле существует множество различных вариаций Tahoe и Reno; здесь рассматриваются только самые базовые реализации. Также существует множество различных методов реагирования на потерю пакета, когда соединение находится в режиме предотвращения перегрузки.
Если реализация использует Tahoe, и потеря пакета обнаружена посредством быстрой повторной передачи, она установит SST на половину текущего CWND, установит CWND на исходное значение и снова начнет медленный запуск. Это означает, что отправитель снова будет передавать 1, 2 или 10 порядковых номеров, увеличивая CWND для каждого подтвержденного порядкового номера. Как и в начале процесса медленного запуска, это приводит к удвоению CWND каждого rtt. Как только CWND достигнет SST, TCP вернется в режим предотвращения перегрузки.
Если реализация использует Reno, и потеря пакета обнаружена посредством быстрой повторной передачи, она установит SST и CWND на половину текущего CWND и продолжит работу в режиме предотвращения перегрузки.
В любой реализации, если обнаруживается потеря пакета из-за того, что получатель не отправляет подтверждение в пределах RTO, CWND устанавливается на 1, и медленный запуск используется для увеличения скорости соединения.
Контроль ошибок
TCP предоставляет две формы обнаружения ошибок и управления ими:
Сам протокол, наряду с механизмом управления окнами, обеспечивает доставку данных в приложение по порядку и без какой-либо недостающей информации.
Контрольная сумма дополнения единицы, включенная в заголовок TCP, считается более слабой, чем Cyclic Redundancy Check (CRC) и многие другие формы обнаружения ошибок. Эта проверка ошибок служит дополнением, а не заменой, коррекции ошибок, обеспечиваемой протоколами ниже и выше в стеке.
Если получатель обнаруживает ошибку контрольной суммы, он может использовать любой из описанных здесь механизмов, чтобы запросить отправителя повторно передать данные—просто не подтверждая получение данных, запрашивая повторную передачу через SACK, активно не подтверждая получение данных через быструю повторную передачу или отправляя тройное подтверждение для конкретного сегмента, содержащего поврежденные данные.
Номера портов TCP
TCP не управляет каким-либо типом мультиплексирования напрямую; однако он предоставляет номера портов, которые приложения и протоколы выше TCP в стеке протоколов могут использовать для мультиплексирования. Хотя эти номера портов передаются в TCP, они обычно непрозрачны для TCP; TCP не придает никакого значения этим номерам портов, кроме использования их для отправки информации правильному приложению на принимающем узле.
Номера TCP-портов делятся на два широких класса: хорошо известные и эфемерные. Хорошо известные порты определяются как часть спецификации протокола верхнего уровня; эти порты являются портами «по умолчанию» для этих приложений. Например, службу, поддерживающую Simple Mail Transfer Protocol (SMTP), обычно можно найти, подключившись к узлу с использованием TCP на порт номер 25. Службу, поддерживающую Hypertext Transport Protocol (HTTP), обычно можно найти, подключившись к узлу с использованием TCP на порт 80. Эти службы не обязательно должны использовать эти номера портов; большинство серверов можно настроить на использование какого-либо номера порта, отличного от указанного в спецификации протокола. Например, веб-серверы, не предназначенные для общего (или общедоступного) использования, могут использовать какой-либо другой TCP-порт, например 8080.
Эфемерные порты значимы только для локального хоста и обычно назначаются из пула доступных номеров портов на локальном хосте. Эфемерные порты чаще всего используются в качестве исходных портов для TCP-соединений; например, хост, подключающийся к службе через порт 80 на сервере, будет использовать эфемерный порт в качестве исходного TCP-порта. До тех пор, пока любой конкретный хост использует данный эфемерный номер порта только один раз для любого TCP-соединения, каждый сеанс TCP в любой сети может быть однозначно идентифицирован через исходный адрес, исходный порт, адрес назначения, порт назначения и номер протокола, работающего поверх TCP.
Настройка сеанса TCP
TCP использует трехстороннее рукопожатие для установки сеанса:
Клиент отправляет синхронизацию (SYN) на сервер. Этот пакет является обычным TCP-пакетом, но с битом SYN, установленным в заголовке TCP, и указывает, что отправитель запрашивает сеанс для настройки с получателем. Этот пакет обычно отправляется на хорошо известный номер порта или на какой-то заранее установленный номер порта, который, как известно клиенту, будет прослушиваться сервером по определенному IP-адресу. Этот пакет включает в себя начальный порядковый номер клиента.
Сервер отправляет подтверждение для SYN, SYN-ACK. Этот пакет подтверждает порядковый номер, предоставленный клиентом, плюс один, и включает начальный порядковый номер сервера в качестве порядкового номера для этого пакета.
Клиент отправляет подтверждение (ACK), включающее начальный порядковый номер сервера плюс один.
Этот процесс используется для обеспечения двусторонней связи между клиентом и сервером перед началом передачи данных. Первоначальный порядковый номер, выбранный отправителем и получателем, в большинстве реализаций рандомизирован, чтобы не дать стороннему злоумышленнику угадать, какой порядковый номер будет использоваться, и захватить сеанс TCP на начальных этапах его формирования.
Настроить бэкэнд-службу с нуля сложно. Для облегчения работы можно использовать Firebase, но это не единственное в своем роде решение. В данном материале рассмотрим альтернативные решения бэкэнда для веб-приложений и мобильных приложений.
Что такое бэкэнд?
Бэкэнд - это программное обеспечение, которое обрабатывает данные мобильного или веб-приложения. Он содержит всю логику доступа и управления данными, к которым обычные пользователи не могут получить доступ. Бэкэнд также отвечает за обработку веб-запросов и веб-ответов.
Обычно он известен как часть приложения, которое скрыто от пользователя, и он взаимодействует с фронтэндом (то что пользователь видит), чтобы отобразить запрашиваемые данные.
Для создания бэкэнд-решений можно использовать несколько языков программирования, таких как Python, JavaScript и PHP. В дополнение к этим языкам, вы можете использовать серверные фреймворки, такие как Django, NireJS и Laravel, которые обеспечивают «стандартный» способ построения сложных приложений.
Чтобы создать пользовательское бэкэнд-решение, требуются хорошие навыки работы с некоторыми из упомянутых выше языков программирования, и, что более важно, много времени.
Если вы хотите пропустить этот процесс и сосредоточиться на скорейшем завершении проекта, вы можете использовать готовое к использованию бэкэнд-решение или, если вы предпочитаете модный термин «бэкэнд как услуга» (Baas - Backend-as-a-service).
Наиболее популярным сервисом является Firebase, консолидированный продукт, поддерживаемый Google, но у него есть некоторые недостатки:
Ограниченная миграция данных
Ограниченное хранение данных
Больше нацелен на Android (большие улучшения на iOS в последние месяцы)
Основная служба не является открытой
Для хранения данных приложения и управления ими вы полагаетесь на внешнюю службу
Firebase - отличный продукт, особенно если вы только начинаете, но, чтобы иметь выбор, важно знать некоторые альтернативы.
1. Appwrite
Appwrite - это комплексное бэкэнд-решение практически для каждого веб- или мобильного приложения, о создании которого вы мечтаете. Он является решением с открытым исходным кодом, имеет нулевые зависимости и легко интегрируется (через SDK) с некоторыми наиболее популярными инструментами и языками.
Appwrite - это автономный бэкэнд сервер, который поставляется в виде Docker-образа. Это означает, что ее можно установить в любой ОС, поддерживающей интерфейс командной строки Docker.
Эта кроссплатформенная функциональность позволяет запускать Appwrite на локальном рабочем столе или на любом облачном сервере. Appwrite поставляется со встроенной панелью, которая позволяет управлять приложениями как проектами. Каждый проект может интегрироваться непосредственно с вашим приложением.
Другие интересные особенности Appwrite:
Простота
Отличная документация
Кроссплатформенность
Нулевые зависимости (кроме Docker)
2. Supabase
Supabase - это альтернатива Firebase с открытым исходным кодом, которая выполняет повторяющиеся операции CRUD и позволяет сосредоточиться на вашем продукте.
Помимо возможности самостоятельного хостинга, Как и Appwrite, Supabase можно развернуть локально. Но в отличии от первого, Supabase также предлагается в облачном варианте. Он предоставляет все бэкэнд-услуги, необходимые для создания продукта. Вот основные:
База данных Postgres
Идентификация
Хранение файлов
Автоматически созданные API
Вы можете создать учетную запись в GitHub, выбрать бесплатный план и создать приложение за считанные минуты.
Supabase поставляется с панелью мониторинга, включающая редактор таблиц (аналогично электронной таблице), встроенный редактор SQL и управление пользователями. Имеется обширная официальная документация, которая позволяет быстро начать разработку приложения на этой платформе.
3. Parse Platform
Parse Platform – это полный стек приложений. Его основным продуктом является сервер Parse - бэкэнд сервер с открытым исходным кодом и автономным хостингом, который может быть развернут в любой инфраструктуре, поддерживающей Node.js.
Parse Server использует MongoDB или Postgres в качестве базы данных и позволяет использовать собственную инфраструктуру для развертывания внутреннего сервера. Если вы хотите разработать приложение локально, вы можете сделать это с помощью Node.
ParseplatformIt имеет несколько SDK с открытым исходным кодом, которые позволяют интегрировать почти все существующие веб-приложения или мобильные приложения за пару команд.
Самое интересное в Parse - это широкое сообщество. Они создали множество проектов для расширения функциональности Parse, таких как адаптер MySQL или Live Query for .Net.
4. Cloudboost
Cloudboost - это полнофункциональный JavaScript бэкэнд, включающий все инструменты и инфраструктуру, необходимые для создания современных веб-приложений и мобильных приложений.
При реализации основных функция вроде поиск или аутентификация пользователей, задачу целостности данных это решение берёт на себя. Все находится на одной платформе, поэтому вы экономите много времени и инвестируете в разработку своего приложения.
Главный недостаток: он не является ни открытым, ни бесплатным.
5. Nhost
Хотите использовать современный бэкэнд для создания современных приложений? Если да, Nhost то, что вам нужно. Вдохновленный от Firebase, это готовый к производству бэкэнд, который включает базу данных Postgres, Hasura, GraphQL, встроенную аутентификацию и хранилище.
Как и в случае с каждым из представленных до сих пор бэкэнд-решений, оно предлагает набор SDK для интеграции вашего приложения.
Это решение с открытым исходным кодом, но он предлагает облачную версию, которую вы можете начать использовать бесплатно и выбрать план после того, как вы попробуете его функции. Лучше всего в Nhost то, что у вас есть полный доступ к вашим данным (в отличии от Firebase), и вы можете экспортировать их в любое время.
Nhost только становится, и вы можете наблюдать за их прогрессом и статистикой на их сайте.
Заключение
Backend-as-a-service позволяет делегировать базовае функции приложения и стандартные операции CRUD третьей стороне, чтобы сосредоточиться на создании наилучшего проекта за меньшее время.
