Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Принципы построения и основные задачи, выполняемые серверными программами(Создание сетевых клиентских приложений)

Содержание:

ВВЕДЕНИЕ

Тема данной курсовой работы является «Принципы построения и основные задачи, выполняемы серверными программами». В настоящее время это достаточно актуальная тема. В связи с все большим распространением Интернета все больше и больше разработчиков программного обеспечения выбирают клиент-серверную архитектуру там, где это возможно. В контексте работы с базами данных клиент-серверная архитектура актуально в первую очередь потому что позволяет обеспечить простые и относительно дешевые средства для коллективной работы с базой данных.

Важной задачей для информационных стратегий организаций является присутствие в Интернете и разработка распределенных информационных систем, которые обеспечивают связь с заказчиками и поставщиками, маркетинг и многие другие виды деятельности. Это повышает интерес к созданию информационных систем, использующих распределённые вычисления.

При работе с серверными программами одной из основных архитектур построения программного обеспечения является клиент-серверная архитектура. Подобным подход в производстве программного обеспечения имеет ряд преимуществ, таких как: отсутствие дублирования кода клиентскими программами, более низкие требования к компьютерам клиентских программ, централизованное управление базами данных, которые хранятся на сервере и как правило лучше защищены.

Большинство задач, решаемые программистами в повседневной работе связано с выполнением локальных действий в системе. Обычно они не выходят за рамки работы с файловой системой и взаимодействия с периферией компьютера. Более трудная задачей является заставить взаимодействовать несколько программ, работающих на разных компьютерах, которые подключены к сети.

Основной единицей всего сетевого программирования в большинстве операционных систем является сокет. Как функции файлового ввода-вывода определяют интерфейс взаимодействия с файловой системой, так и сокет соединяет программу с сетью. С его помощью программа может отправлять и принимать сообщения.

1. Принципы построения серверных программ

1.1. Создание сетевых клиентских приложений

Клиентское приложение должно выполнить несколько действий для установления соединения с другим компьютером или сервером в сети. Эти действия должны быть выполнены в определенной последовательности. На каждом из этапов программа может задавать различные опции. Но не все эти действия являются обязательными, если некоторые из них пропущены, операционная система воспользуется установками по умолчанию. Базовая последовательность действий имеет следующий вид: создание сокета, поиск адресата, организация канала связи с другой программой и разрыв соединения.

Рассмотрим каждый из этапов:

  1. Создание сокета. Выбор сетевого домена и типа сокета.
  2. Задание параметров сокета. Является необязательным этапом. Поведением сокета возможно управлять множеством параметров.
  3. Привязка в определенному адресу или порту. Является необязательным этапом. Установка конкретного IP-адреса и выбор порта. При пропуске этого этапа операционная система разрешит связь с любым IP-адресом и назначит произвольный номер порта.
  4. Подключение к одноранговому компьютеру или серверу. Является необязательным этапом. Организация двунаправленного канала связи между клиентской и другой сетевой программой. При пропуске этого этапа будет создан канал адресной передачи сообщений без установления соединения.
  5. Частичный разрыв соединения. Является необязательным этапом. выбор одного из двух режимов работы: прием или передача. Данный этап можно выполнить, если создан запасной канал связи.
  6. Прием и передача сообщений. Является необязательным этапом. этот этап возможно пропустить, если требуется всего лишь проверить доступность сервера.
  7. Разрыв соединения. Безусловно этот этап является важным так как долго выполняющиеся программы могут со временем исчерпать лимит дескрипторов файлов, если не закрывать неиспользуемые сеансы.

В сетях применяется множество различных протоколов, приспособленных для решения множества специфических задач. Семейство протоколов TCP/IP (Transmission Control Protocol/Internet Protocol) ориентированно на передачу пакетов и выявление нефункционирующих соединений. Если в какой-то момент будет обнаружено нарушение сегмента сети, система сразу же начинает искать новый маршрут.

Сопровождение пакетов, обнаружение потерь и ретрансляция – это сложные алгоритмы, так как в них необходимо учитывать большое количество различных факторов. Обычно в процессе проектирования приложений об этих алгоритмах не вспоминают, так как детали скрыты в протоколах.

TCP/IP – многоуровневый стек: высокоуровневые протоколы более надежны, но менее гибки, на нижних уровнях повышается гибкость, но за счет надежности. Стандартная подсистема функций ввода-вывода так же является многоуровневой. Компьютеры, которые работают с TCP/IP для взаимодействия друг с другом используют преимущественно сокеты.

Каждый передаваемый пакет содержит в себе данные, адреса отправителя и получателя. Так же каждый протокол добавляет к пакету свою сигнатуру, заголовок и другую служебную информацию. Данная информация позволяет передавать пакет на том уровне, для которого он предназначен.

Простейшим соединением является то, в котором клиент подключается к серверу, посылает запрос, а затем получает ответ. Некоторые сервисы могут даже не требовать наличия тела запроса.

При программировании, обычно имеется функция, являющаяся универсальным инструментом для организации связи с другим компьютером и запуска процесса приема/передачи сообщений. Обычно такая функция создает дескриптор, позволяющий обращаться к компьютерам по сети.

После того как был создан сокет необходимо подключится к серверу. Сетевое соединение представляет собой канал передачи сообщений. В сети сервер должен в процессе соединения узнать адрес и порт, по которым можно будет отправить ответ клиентскому компьютеру.

После того как было установлено соединение, дескриптор сокета становится дескриптором ввода-вывода, доступный обеим программам. Большая часть серверов предназначены для выполнения единственной транзакции, после чего разрывают соединение (к примеру сервер HTTP 1.0 отправляет запрошенный файл и разрывает соединение). Когда сокет открыт, становится возможен вызов стандартных низкоуровневых функций ввода-вывода для приема и передачи данных. Дескриптор сокета можно даже преобразовать в файловый дескриптор если требуются высокоуровневые функции ввода-вывода.

После получения информации от сервера необходимо разорвать соединение. В большинстве программ используется стандартный системный вызов.

Во время создания программой сокета и подключения к TCP-серверу, происходит ряд действий. Сам по себе сокет организует лишь очередь сообщений. Основная часть действий происходит при подключении. В таблице 1.1 поэтапно показано что происходит на стороне клиента и сервера.

Действия клиента

Действия сервера

Создание очереди сообщений, установка флагов протокола

Ожидание подключения

Операционная система назначает сокету порт, если он не был назначен до этого

Ожидание подключения

Отправка сообщения, в котором запрашивается установление соединения и сообщается номер порта

Ожидание подключения

Ожидание ответа сервера

Помещение запроса в очередь порта

Ожидание ответа сервера

Чтение данных из очереди, прием запроса и создание уникального канала для сокета

Ожидание ответа сервера

Создание уникального задания или потока для взаимодействия с программой

Ожидание ответа сервера

Отправка подтверждения о том, что соединение установлено. Сервер либо отправляет сообщение по указанному порту, либо ожидает запроса от программы. После передачи данных сервер может закрыть канал, если он выдает только односторонние сообщения

Таблица 1. Действия, выполняемые при создании сокета и подключении к серверу

Описанный процесс может быть гораздо более сложным в том случае если между клиентом и сервером находятся компьютеры, выполняющие маршрутизацию (коммутацию и верификацию пакетов, фрагментацию и дефрагментацию, трансляцию протоколов, туннелированные и т.д.).

В TCP/IP адрес имеет фиксированную длину, данное ограничение потребовало от разработчиков протокола IP тщательного продумывания особенностей его функционирования. Раньше протокол позволял решать множество задач, таких как идентификация компьютера, преобразование адресов, маршрутизация. В наше время он столкнулся с новыми проблемами, связанными с большой скоростью роста сети Internet.

В протоколе IP имеются различные типы пакетов. Пакеты бывают неструктурированными, служебными (ICMP), дейтаграммными (UDP) и потоковыми (TCP). Каждый из них играет свою роль в сети.

У каждого пакета имеется заголовок. Так как ICMP, UDP и TCP включются в IP-пакет, общий размер заголовка может варьироваться от 20 до 120 байт. Пропускную способность сети определяет соотношение между объемом передаваемых данных и размером заголовка.

Поскольку протокол TCP имеет самый большой размер заголовка, он обладает наименьшей пропускной способностью. Этот протокол чаще всего используется в Internet, так как он обеспечивает надежное соединение между компьютерами. Так же этот протокол позволяет работать с высокоуровневыми функциями ввода-вывода.

Протокол UDP позволяет передавать одиночные сообщения между компьютерами, не устанавливая повторное соединение. В нем вводится понятие виртуального порта, с помощью которого приложение имеет как бы монопольный доступ к сети. Данный протокол обеспечивает высокую пропускную способность, но невысокую надежность передачи данных.

Сообщения могут передаваться двумя различными способами: непрерывным потоком (TCP) или в виде дискретных пакетов (UDP). В TCP необходимо, чтобы с адресатом было установлено соединение. Это гарантирует отсутствие потерь данных и доставку пакетов в нужном порядке. В UDP соединение можно не устанавливать, в таком случае программа должна помещать в каждое сообщение адрес получателя.

Протокол TCP обеспечивает надежность, но снижает производительность. Возможно повысить надежность UDP, внедрив в программу средства проверки доставки, идентификации пакетов, устранения избыточности, проверки целостности и предотвращения зависаний. Данные протоколы обеспечивают разный уровень межпрограммного взаимодействия. В UDP происходит манипулирование отдельными сообщениями, а в TCP данные рассматриваются как поток.

1.2. Создание серверных приложений

Процесс построения сервера всегда начинается с создания сокета. Наподобие того как в клиентской программе требуется определенная последовательность системных вызовов, аналогичная последователь требуется на сервере.

Как правило в серверной программе нужно вызвать ряд системных функций в определенной последовательности. На примере простого эхо-сервера можно наглядно увидеть последовательность этих функций, не отвлекаясь на решение других, более узконаправленных задач. Вот общий алгоритм работы эхо-сервера:

  1. Создание сокета.
  2. Привязка к порту.
  3. Перевод сокета в режим прослушивания.
  4. Проверка подключения.
  5. Чтение сообщения.
  6. Возврат сообщения клиенту.
  7. Если полученное сообщение не является строкой «bye», возврат к пункту 5.
  8. Разрыв соединения.
  9. Возврат к пункту 4.

Работа с TCP-сокетами начинается с функции создания сокета, так же требуется задать номер порта, для того чтобы клиент мог к нему подключится. При задании номера порта запрашивается у операционной системы, может ли платформа использовать порт с заданным портом. Если сервер не указывает порт, система назначает ему ближайший свободный порт из пула доступных. Этот порт может быть различным при каждом последующим запуске серверной программы. Операционная система связывает порт только с одним процессом.

Сокет обеспечивает интерфейс, с помощью которого одна программа может взаимодействовать с другой по сети. После подключения программы к порту, никакая другая программа не может к нему обратится. Для разрешения подобных ситуация на сервере организуется очередь ожидания. При создании очереди ожидания указывается число позиций в очереди. Кроем того, сокет переводится в режим «только прослушивание».

После того как клиент устанавливает соединение с сервером, сокет, который находится в режиме прослушивания, организует новый двунаправленный канал между клиентом и своим собственным портом. С данного момента серверная программа взаимодействует с клиентом через новый канал.

При создании серверной программы важно учитывать, как осуществляется взаимодействие между клиентом и сервером и каким образом должна себя вести каждая из сторон. Детальный анализ используемого протокола позволяет определить, как лучше обрабатывать каждый запрос.

Одной из важнейшей особенностью системы является многозадачность. Данная особенность позволяет существенно упростить программирование, в том случае если есть возможность разделить общий алгоритм на несколько одновременно выполняющихся модулей, каждый из которых со своей спецификой. Многозадачность необходима для того, чтобы сервер мог работать с несколькими клиентами одновременно. В противном случае клиент, устанавливающий соединение, будет вынужден ожидать пока сервер не обслужит текущего клиента.

Задания представляют собой отдельные исполняемые модули в системе. Каждая выполняемая команда является заданием. В общей концепции многозадачности выделяют два основных понятия: процессы и потоки. Они представляют два различных способа совместного использования данных. У процессов и потоков свои, редко пересекающиеся, задачи. К примеру, процесс создается для выполнения внешней программы и получения от неё данных. Отдельный поток можно использовать для отображения графического файла по мере его загрузки. Так, выбор между потоком и процессом делается на основании простого правила: при необходимости совместного доступа к данным используется поток.

Для управления работы потоков имеются средства синхронизации. Благодаря синхронизации имеется возможность упорядочить доступ к общим ресурсам и обеспечить целостность данных.

Любое из заданий может принимать данные через каналы (программные или стандартные), так же задание может получать сигналы для обработки асинхронных событий. После создания канала и передачи по нему данных дочернему заданию, можно выгрузить родительскую программу. Так же с помощью каналом можно проводить переадресацию стандартных потоков ввода-вывода.

Когда программа запущена, она либо выполняется, либо чего-то ожидает (блокирована). Блокирование может возникать в двух случаях: в ходе операций ввода-вывода (программа тратит больше времени на осуществление ввода-вывода) и при доступе к процессору (программой больше времени тратится на вычисления). В случае блокировки в ходе операций ввода-вывода другие задания получают возможность выполнить свои собственные действия. Таким образом большинство заданий кооперируется при доступе к ограниченным ресурсам процессора. Когда одно из заданий блокируется в ходе операций ввода-вывода, активизируется другое задание. Но не всегда требуется завершение операций ввода-вывода для того, чтобы продолжить выполнение задания.

Вместо блокирования программы иногда можно заставить программу выполнять другие действия, пока не завершится обработка системного запроса. Программа может:

- проверить целостность данных;

- инициировать другие запросы или отслеживать их появление;

- обслуживать несколько других соединений;

- выполнять вычисления, требующие активного использования процессора.

Избежать блокирования можно использовав одну из трех методик: опрос каналов, тайм-ауты и асинхронный ввод-вывод.

Методика опроса позволяет избежать блокирования при осуществлении ввода-вывода. Суть её заключается в том, чтобы периодически проверять готовность канала. В первую очередь сокет должен быть переведен в неблокируемый режим, а затем проверить значение, возвращаемое системным вызовом отправки пакетов. Методика опроса позволяет собирать блоки поступающих данных и обрабатывать их по частям, пока передаются остальные данные.

Проблему файлового ввода-вывода возможно решить, если заставить операционную систему сообщать программе о готовности канала обрабатывать запросы. Благодаря этому программа сможет больше времени тратить на вычисления и меньше на выполнение системных вызовов. Основное отличие между методиками опроса каналов и асинхронного ввода-вывода заключается в том, сколько времени программа тратит на выполнение системных вызовов. В асинхронном режиме время работы функций отправки обработанных данных и получения данных из буфера очень велико, так как ядро само уведомляет программу о их завершении. С другой стороны, в режиме опроса программа должна сама периодически их вызывать.

Серверная программа взаимодействует с другими программами по сети. Так как производительность и время ответа разных компьютеров отличаются, важно знать, когда и как переходить в режим неблокируемого ввода-вывода, для того чтобы увеличить производительность работы клиентов и серверов и повысить их восприимчивость к командам пользователя. Две основные методики неблокируемого ввода-вывода – это режим опроса и асинхронный режим. Так же важным инструментом являются тайм-ауты. Они могут быть реализованы посредством специальных функций либо с помощью сигнала таймера, который «будит» программу, если системный вызов выполняется слишком долго.

В серверной программе можно выделить три основных компонента, требующих отдельного анализа: задание (главный процесс), соединение (сокет) и сообщение. Первый компонент отвечает за управление всеми связанными процессами и потоками. Второй компонент – это сам сокет и его параметры. Третий компонент – это процедуры взаимодействия с каналами ввода-вывода, отвечающие за прием и передачу сообщений. Для того чтобы добиться высокой производительности от серверной программы, необходимо сбалансировать работу первого и третьего компонентов и для второго компонента, с помощью параметров сокета, настроить соединение под особенности решаемой задачи.

1.3. Объектно-ориентированные сокеты

Объектно-ориентированная технология позволяет сосредоточится на особенностях каждого конкретного компонента и обеспечить его четким и неизменным интерфейсом, с помощью которого он сможет взаимодействовать с другими компонентами. Другая важнейшая цель объектно-ориентированного подхода заключается в возможности замены одного модуля другим. Придерживаясь такого подхода, необходимо обеспечить постоянство интерфейса модуля. Это необходимо для обеспечения возможности безболезненной замены на обновленную версию. Так же интерфейс модуля следует делать как можно более простым, чтобы к нему было проще подстраиваться.

Особенность объектно-ориентированного программирования (ООП) в том, что его можно применять везде, даже в обычных процедурных языках. Все сводится к пониманию методики и дисциплине программирования.

Первой ключевой концепцией ООП является инкапсуляция. Она критически важна для реализации принципа повторного использования, так как предписывает скрывать детали реализации в оболочке интерфейсов. Как правило глобальные переменные в ООП недопустимы. Все данные неразрывно связанны со своими объектами. Если нарушить эту связь, то теряется возможность повторного использования и автономного встраивания модуля.

Наследование – еще одна важнейшая концепция ООП. Наследование позволяет описать новый класс на основе уже существующего, при этом свойства и функциональность заимствуются новым классом у родительского. Класс, от которого производят наследование, называется базовым или родительским. Классы, которые произошли от базового, называются наследниками, потомками или производными классами. Наследование позволяет написать класс, который выполняет те же функции что и другой, но со своей специфической реализацией.

Третья базовая концепция ООП, абстракция, предписывает придание объекту характеристик, которые отличают его от всех объектов, четко определяя его концептуальные границы. Ключевая идея заключается в том, чтобы разделить способ использования составных объектов данных и детали их реализации в виде простых объектов. Такой подход позволяет работать с объектами, не вдаваясь в подробности их реализации.

Четвертой базовой концепцией ООП является полиморфизм. Полиморфизм – это возможность объектов с одинаковой спецификацией иметь разную реализацию. Полиморфизм позволяет писать более абстрактные программы и помогает чаще повторно использовать раннее написанный код.

Правильно применяя принципы ООП, возможно создавать эффективные программные модули, которые будут многократно использоваться при решении различных задач. Помимо этого, при использовании ООП подхода, можно писать программы, которые более проще отлаживать и расширять. Так же ООП позволяет больше сфокусироваться на анализе предметной области, чем на написании программы.

Java – хороший пример объектно-ориентированного языка программирования, который позволяет создавать многократно используемые, переносимые компоненты. Java обладает большой библиотекой сетевых классов. В пакет Network входят классы, позволяющие создавать потоковые (TCP), дейтаграммные (UDP) и групповые (UDP) сокеты. Возможности сокетов расширяются благодаря мощному набору классов ввода-вывода. Хоть этот набор и сложен, но он позволяет существенно упростить сетевое программирование. Благодаря средствам работы с потоками, которые предоставляет Java, проще проектировать серверные программы.

Хотя Java и является мощным языком программирования с множеством преимуществ, таких как независимость от платформы и оперативная компиляция, он имеет ряд недостатков. К недостаткам Java можно отнести низкую стабильность и недостаточную производительность. Поэтому, в зависимости от поставленных задач и условий их выполнения, как альтернативу Java в написании серверных программ можно выбрать C++.

ООП предоставляет множество возможностей, но также имеет и ряд недостатков. При использовании ООП подхода можно столкнутся с избыточным наследованием. Как правило достаточно построить естественную иерархию классов и добавить к ним пользовательский интерфейс. Порождать новый класс от другого стоит только в том случае, когда в нем изменяется модель поведения или, добавляются новые функции. Избыточное наследование возникает при неправильном моделировании обязанностей объектов. Когда все классы связанны между собой отношениями наследования, возникает сложная структура отношений. Такой проект достаточно сложно поддерживать, даже при наличии подробной документации.

Так же весомой проблемой при использовании ООП является разрастание исходно кода программы. Увеличение объемов объектов не существенно, когда в системе много памяти, но при увеличении объема исходного кода растет вероятность ошибок. Обычно размер классов значительно превышает размер их функциональных аналогов, написанных средствами модульного программирования. Однако, несмотря на повышение сложности программы, так же растут ее возможности и контроль над типами данных.

1.4. Сложные сетевые методики

Идея удаленного вызова процедур (RPC) состоит в расширении механизма передачи управления и данных внутри программы, выполняющейся на одном компьютере, на передачу управления и данных через сеть. Данный класс технологий позволяет программе вызывать функции или процедуры в другом адресном пространстве, которое находится либо на удаленном компьютере, либо в независимой сторонней системе на том же устройстве. Главной целью RPC была в том, чтобы сделать вызов удаленных систем похожим на вызов функций или процедур внутри программы. Средства RPC, в первую очередь, предназначены для облегчения организации распределенных вычислений.

RPC достигает прозрачности следующим образом. Когда вызываемая процедура в действительности является удаленной, в библиотеку помещается вместо локальной процедуры другая версия процедуры, клиентский стаб (stub - заглушка). Стаб вызывается аналогично оригинальной функции, так же происходит прерывание при обращении к ядру. Но в отличии от оригинальной функции, вместо помещения параметров в регистры и запрашивания данных у ядра, стаб формирует сообщение для отправки ядру удаленного компьютера.

RPC обладает следующими характерными чертами:

- асимметричность (одна из взаимодействующих сторон является инициатором);

- синхронность (выполнение вызывающей процедуры приостанавливается с момента выдачи запроса и возобновляется после возврата из вызываемой процедуры).

Так же, не маловажным аспектом серверных приложений является безопасность. Безопасная система не предоставляет больше функций, чем незащищенная, но незащищенная подвержена атакам и её данные становятся ненадежными. В большинстве случаев безопасность серверной программы считается само собой разумеющейся. Безопасность – это базовое требование, и клиент воспринимает её как неотъемлемую часть продукта.

Сетевое программирование основано на идее совместного доступа к данным и распределения вычислений. Предоставляя доступ к данным важно точно знать кто к ним обращается. С процессами сетевого взаимодействия неразрывно связанны понятия идентификации и доверия. Для обеспечения безопасности необходимо проводить идентификацию как на клиентской стороне, так и на серверной стороне. После того как клиент будет опознан, можно начинать доставку и получение информации.

Важной частью процесса создания безопасной системы является определение уровней идентификации пользователя. Простейшая форма – аутентификация – обычная проверка регистрационной информации. Примером является сеанс удаленной регистрации, когда у пользователя запрашиваются имя и пароль. Следующий уровень – авторизация – предполагает ограничение доступа к тем или иным ресурсам системы. Оба эти уровня имеют недостаток, заключающийся в том, что клиент не может определить, является ли сервер «троянским конем». Данную проблему можно решить с помощью сертификации. Сертификация обеспечивает достаточно высокий уровень безопасности. Она требует, чтобы доверенное третье лицо (сервер сертификатов) гарантировало подлинность как клиента, так и сервера.

Во время обмена данными может возникнуть два негативных процесса: подсматривание и вторжение. Подсматривание может являться проблемой в случае, если канал обмена данными закрытый. Вторжение, возникающее при регистрации пользователя в системе под чужим именем и паролем, может иметь более тяжёлые последствия.

Часто обмен данными происходит в открытую, так как передаваемые данные не компрометируют ни одну из сторон и не являются конфиденциальными. Таким образом функционируют web-серверы и многие простейшие сетевые службы. Открытый обмен данными не означает, что кто угодно может просматривать предаваемую информацию. Имеется в виду, что взаимодействующие программы не предпринимают каких-либо, мер предосторожности для обеспечения конфиденциальности.

Защита клиента и сервера начинается с определения того, каким формам атак они могут подвергаться. Вот основные их них:

- прослушивание линии – подслушивающая программа пропускает через себя потом сообщений, ожидая полезных для себя данных. В эту категорию попадают сетевые анализаторы.

- разделение линии – программа-вредитель ограничивает доступ к серверу или клиенту. Данная программа затрудняет соединение, замедляет время реакции сервера или вообще делает его недоступным.

- захват линии – вместо того чтобы затруднять соединение, программа может принять на себя роль одной из сторон. В некоторых стеках протоколов, например, в том, что реализован в Linux, подобная форма атаки затруднена, поскольку используется система порядковых номеров пакетов.

Со временем могут появляться новые способы вторжений, но, как правило, они попадают в одну из перечисленных категорий. Вирусы представляют несколько другую проблему. Они пользуются недостатками в системе защиты, но не являются разновидностью атак на защищенные данные. В сетевом программировании защищать необходимо все, что подключено к сети. Безопасность серверных программ не должна зависеть от операционной системы, поэтому уровень защищенности программы определяется в первую очередь разработчиком.

Наиболее распространёнными протоколами безопасности на сегодняшний день являются SSL (Secure Sockets Layer) и TLS (Transport Layer Security). Это протоколы, обеспечивающие безопасный канал между двумя компьютерами, взаимодействующими между собой по сети.

SSL – криптографический протокол, для обеспечения более безопасной связи. Этот тип цифровой безопасности, позволяющий зашифровать связь между компьютерами. Для аутентификации ключей обмена он использует асимметричную криптографию. В настоящее время эта технология устарела и заменяется TLS.

В работе SSL принимают участие три ключа: приватный, публичный и сеансовый. Ключ – это средство для зашифровывания и расшифровывания сообщений. Публичный ключ используется для зашифровывания сообщения. Клиент использует его тогда, когда нужно отправить сообщение серверу. Приватный ключ необходим для расшифровывания сообщений. Он используется сервером, когда получает сообщение от клиента. Сеансовый ключ используется одновременно для зашифровки и расшифровки сообщений. Клиент генерирует его на время сеанса и когда сеанс заканчивается, ключ перестает работать.

TLS, как и SSL, криптографический протокол, обеспечивающий защищенную передачу данных между компьютерами в сети. Он также использует асимметричное шифрование для аутентификации, симметричное шифрование для конфиденциальности и коды аутентичности сообщений для сохранения целостности сообщений.

2. Основные задачи, выполняемые серверными программами

2.1. Сервер маршрутизации

В сущности, сервера маршрутизации не являются серверами в классическом понимании. Они являются базовой функцией поддержки сети операционной системой. Маршрутизация является базовой функцией в протоколе IP стека TCP/IP. Маршрутизацией своих пакетов к месту назначения занимается любая система в сети, в то время как маршрутизацией чужих пакетов занимаются только маршрутизаторы (также именуемые роутерами или шлюзами). При маршрутизации чужих пакетов маршрутизатор занимается следующими задачами:

- получение пакета;

- поиск машины, куда следует этот пакет, или следующий маршрутизатор по маршруту;

- передача пакета или возвращение сообщения о невозможности его доставки;

- в случае невозможности доставки пакета по причине перегрузке маршрутизатора или сети, отбросить пакет без уведомлений.

При статической маршрутизации таблицы маршрутизации обслуживаются вручную. Этот тип маршрутизации подходит для небольших сетей, которые взаимодействуют с малым количеством других сетей, обычно не более двух. Но если сеть соединена с большим количеством сетей, то число шлюзов значительно вырастает. В таком случае для обслуживания таблиц маршрутизации вручную требуется много времени.

Для решения этой проблемы используют динамическую маршрутизацию. при динамической маршрутизации таблицы маршрутизации автоматически обновляются демонами. Происходит непрерывное оповещение демонов маршрутизации другими демонами маршрутизации, поэтому они постоянно обновляют таблицы маршрутизации.

Для обеспечения доставки пакета по кратчайшему и самому эффективному маршруту используется динамическая маршрутизация. С помощью динамической маршрутизации собирается информация о текущем состоянии сложной сети и поддерживается таблица маршрутов через эту сеть.

Предусмотрено два режима работы демонов – активный и пассивный. В активном режиме демон маршрутизации периодически оповещает хосты и шлюзы о состоянии маршрутизации для их локальных сетей, а также получает информацию о маршрутизации от других хостов и шлюзов. В пассивном режиме демон маршрутизации только получает информацию о маршрутизации и не обновляет информацию о маршрутизации удаленных шлюзов.

2.2. Файловые и медиа серверы

Файловый сервер является сервером, который обеспечивает доступ к файлам на диске. Файловые серверы предназначены для передачи файлов по требованию. Основными протоколами для осуществления передачи файлов являются FTP (File Transfer Protocol), TFTP (Trivial File Transfer Protocol), SFTP (SSH File Transfer Protocol) и HTTP (HyperText Transfer Protocol).

Протокол FTP основан на клиент-серверной архитектуре и использует разные сетевые соединения для передачи данных между клиентом и сервером. Клиент может подключится к серверу по протоколу пройдя аутентификацию, передавая логин и пароль в открытом виде, либо, если это разрешено на сервере, подключится анонимно. FTP не разрабатывался как защищенный протокол, поэтому имеет множество уязвимостей. Данный протокол не шифрует трафик, и все передачи с использованием его средств происходят в открытом виде и могут быть прочитаны любым, кто способен перехватить пакет по сети.

TFTP в основном используется для первоначальной загрузки бездисковых рабочих станций. В отличии от FTP он не поддерживает аутентификацию и основан на транспортном протоколе UDP. Главная цель TFTP это обеспечение простой реализации клиента. Именно поэтому, он используется главным образом для первичной загрузки бездисковых рабочих станций, конфигурации в «умные сетевые устройства» и загрузки обновлений. Так как протокол не поддерживает аутентификацию, единственный способ идентифицировать клиента - это его сетевой адрес. Но из-за того, что сетевой адрес может быть подделан, данный протокол не может обеспечить достаточный уровень безопасности.

Для обеспечения необходимого уровня безопасности используется протокол SFTP. Он предназначен для выполнения операций с файлами поверх надежного и безопасного соединения. В отличии от FTP он шифрует все данные передающиеся через него, таким образом предохраняя информацию от открытой передачи через сеть. По функциональность SFTP схож с FTP, но из-за различий в протоколе, клиенты FTP не могут соединится с SFTP-сервером и наоборот.

Протокол HTTP в основном предназначен для передачи текстовых файлов, но серверы, в качестве ответа, так же могут отдавать произвольные данные, такие как динамически созданные веб-страницы, изображения и другие медиа данные. Обмен сообщениями в данном протоколе происходит по обычной схеме «запрос-ответ». В отличии от других протоколов HTTP не сохраняет своего состояния между парами «запрос-ответ». Обычно, информацию о состоянии сохраняют приложения, использующие HTTP, для дальнейшего использования.

Другой тип файловых серверов позволяет монтировать свои дисковые разделы в дисковое пространство клиента для полноценной работы с файлами на них. Такие сервера как правило используют протоколы NFS (Network File System) и SMB (Server Message Block). Эти серверы работают через интерфейс RPC.

Отдельно можно выделить серверы доступа к данным. Задача таких серверов обслуживать базу данных и отдавать данные по запросу клиента. Как пример простого сервиса данного типа можно назвать LDAP (Lightweight Directory Access Protocol). Для получения доступа к серверам баз данных нет единого протокола, однако множество баз данных используют единые правила формирования запросов – язык SQL (Structured Query Language). Так же существуют NoSQL (Not Only SQL) базы данных.

Еще один тип серверов — это медиа сервер. Медиа серверы предоставляют доступ к мультимедийным источникам. Они могут предоставлять доступ как по запросу, схожим образом с файловыми серверами, так и в виде стриминга в реальном времени.

Серверы IP-телефонии (VoIP) обеспечивают возможность голосовой и видеосвязи в реальном времени посредством компьютерной сети. Помимо передачи потоковых медиа-данных, сервер IP-телефонии предоставляет возможности регистрации оконечного терминала, корректное установление связи между пользователями, маршрутизацию вызова. В зависимости от реализуемой техники VoIP сервер может обеспечивать только административные функции, такие как регистрация пользователей и коммутация вызовов. В таком случае потоковые данные передаются напрямую от пользователя к пользователю (peer-to-peer).

2.3. Серверы обмена сообщениями

Серверы обмена сообщениями позволяют пользователям получать и передавать сообщения. Чаще всего сообщения текстовые, но огни так же могут содержать медиа файлы. Среди серверов обмена сообщениями можно выделить два основных типа: серверы электронной почты и серверы обмена мгновенными сообщениями.

Общая идея электронной почты практически повторяет систему обычной почты, перенимая как термины, так и характерные особенности. Из достоинств электронной почты можно выделить следующие:

- легко запоминаемые и воспроизводимые человеком адреса вида <имя_пользователя>@<имя_домена> (например username@example.ru);

- возможность отправки как обычного, так и форматированного текста;

- возможность прикрепления к письму произвольных файлов;

- независимость серверов;

- высокая надежность пересылки сообщений;

- высока скорость передачи сообщений;

- простота в использовании.

Стандартным протоколом для обмена электронной почтой является SMTP (Simple Mail Transfer Protocol). Каждая SMTP-сессия состоит из двух компонентов: команд от клиента и ответов на них от сервера. Такой обмен может содержать ноль и больше SMTP-операций (транзакций). Каждая SMTP-операция состоит из трех последовательных этапов команда-ответ:

  1. Mail from. Определяет обратный адрес, данная переменная нужна для возвращенных писем.
  2. RCPT to. Определяет получателя сообщения. Данная команда может использоваться несколько раз, при необходимости указания нескольких получателей.
  3. Data. Необходим для отправки сообщения, включает в себя содержимое письма. «Data» содержит в себе информацию о заголовке и теле письма. При передаче ответ сервера происходит в два этапа: на первом сервер отвечает именно на команду «Data» (уведомление о готовности принять текстовое сообщение), а на втором сообщается было ли принято или отклонено все письмо в конце последовательности данных.

Существует две различные модели работы сервера с полученной почтой: концепция почтового терминала и почтового хранилища. Концепцией почтового хранилища подразумевается, что вся почта, связанная с почтовым ящиком, хранится на сервере, а пользователь обращается к хранилищу для просмотра имеющихся и написания новых писем. По этому принципу действует протокол IMAP (Internet Message Access Protocol) и большая часть веб-интерфейсов бесплатных почтовых сервисов. В концепции почтового хранилища на сервере почта хранится временно, а пользователю необходимо периодически обращаться к серверу и «забирать» письма (в этот момент клиент скачивает копию письма и удаляет её на сервере). По этому принципу действует протокол POP3 (Post Office Protocol Version 3).

При выборе протокола работы с почтой для сервера электронной почты, основываясь на работе протоколов, можно выделить два основных критерия:

- производительность сервера (IMAP более требователен к ресурсам нежели POP3, так как вся работа по обработке почты происходит на сервере, POP3 только передает письма клиенту);

- пропускная способность канала (POP3 передает письма клиенту полностью, в то время как IMAP может передавать сообщения по частям, если есть такая необходимость).

Отличие сервером обмена мгновенными сообщениями от серверов электронной почты заключается в том, что обмен сообщениями на серверах обмена мгновенными сообщениями происходит в реальном времени. Для данной коммуникации необходима клиентская программа (мессенджер). Мессенджеры не работают самостоятельно, а подключаются к серверу обмена сообщениями, для пересылки сообщений. Большинство мессенджеров позволяет увидеть подключен ли в данный момент другой пользователь, занесенный в список контактов. Данные сервера также позволяют обмениваться не только текстовыми сообщениями, но и мультимедийными файлами. Для серверов обмена мгновенными сообщениями нельзя выделить стандартные протоколы связи.

2.4. Серверы удаленного доступа

Серверы удаленного доступа необходимы для обеспечения пользователю аналога локального терминала для работы на удаленном компьютере, через соответствующую клиентскую программу. Аналог локального терминала может быть, как текстовым, так и графическим. Для обеспечения доступа к командной строке используют серверы telnet, RSH (Remote Shell) и SSH (Secure Shell).

Для обеспечения доступа к графическому интерфейс в Unix-системах используется X Window System. В Microsoft Windows стандартный сервер удалённого доступа к графическому интерфейсу называется терминальным сервером.

Сервер удалённого доступа используется для многих целей, например, для доступа к базам данных или корпоративному программному обеспечению сотрудниками организации из любой точки, где есть доступ к Интернет. В корпоративной сети такие серверы также могут использоваться для доступа сотрудников в Интернет.

Так же для удаленного управления используют протокол SNMP (Simple Network Management Protocol), для этого компьютер должен иметь SNMP-сервер. С помощью данного протокола, программное обеспечение обеспечивающее управление сетевыми устройствами может получить доступ к данным, хранящимся на управляемых устройствах.

2.5. Серверы приложений

Серверы приложений предоставляют сети прикладные сервисы. Их можно считать программной платформой, которые эффективно выполняют процедуры (программы, скрипты), на которых построено приложение. Данный тип серверов зачастую работает как набор компонентов, доступных разработчику программного обеспечения посредством API (Application Programming Interface), определенный самой платформой.

Использование сервера приложений при разработке программного обеспечения имеет ряд преимуществ. В их число входит целостность данных и кода. Благодаря выделению бизнес-логики на отдельный сервер или на несколько серверов, можно обеспечить обновления приложения для всех пользователей. Сводится к минимуму риск того, что старая версия программного обеспечения сможет получить доступ к данным или сможет их изменить.

Централизованная настройка также относиться к преимуществам. Все настройки приложения и управление им может происходить централизованно. Это значительно упрощает работу администрирования приложения, особенно при большом количестве пользователей.

Так же серверы приложения имеют преимущество в аспекте безопасности. Такие серверы работают как центральная точка, которую поставщики сервисов используют для управления доступа к данным и частям самих приложений. Наличие такого сервера позволяет скрыть уровень базы данных и переместить процесс аутентификации с небезопасного клиента на сервер приложений.

Среди серверов приложений можно отдельно выделить игровые сервера. Подобные сервера необходимы для обеспечения связи между клиентами, предоставления возможности коммуникации друг с другом и взаимодействия в рамках программного обеспечения игры. Одной из основных задач таких серверов является получение данных о клиенте и синхронизации этих данных между всеми участниками игровой сессии. Учитывая какие функции выполняют игровые сервера, они выдвигают высокие требования к аппаратному обеспечению машин, на которых они работают.

ЗАКЛЮЧЕНИЕ

В наше время сложно переоценить важность серверных программ из-за широкого распространения и повсеместного использования сети Интернет. Сегодня сетевые технология находятся на высоком уровне. Поэтому так же высоко востребовано сетевое программирования и создание серверных приложений. Ключевые проблемы сетевого программирования — это синхронизация и сверка данных. Для решения этих проблем было разработано множество технологий.

Для разработки серверных приложений используется множество языков программирования и технологий. Некоторые из них нацелены на работу на определенных операционных системах, другие же являются кроссплатформенными. Наиболее популярными являются Java и C++.

При разработке сетевых приложений критическими являются вопросы безопасности. Уязвимости, связанные с безопасностью, оставляют ряд проблем и подвергают компании различным рискам, таким как потеря корпоративных данных или информации о клиентах. Борьба с атаками требует решений по обеспечению сетевой безопасности и разработки сетевой стратегии безопасности. Для обеспечения базового уровня безопасности были разработаны протоколы связи использующие криптографические функции, но этого не всегда достаточно.

Серверные приложения имеют широкий круг применения. Они используются для организации сетевой инфраструктуры, хранения и передачи данных (как текстовых сообщений, так и медиа файлов), для обеспечения работы приложений посредством клиент-серверной архитектуры. В зависимости от поставленной задачи для разработки серверного приложения используются те или иные технологии и протоколы связи.

Сфер применения серверных программ так же множество. Их использование не ограничивается только генерацией динамических веб-страниц. Серверные программы помогают решать задачи коммуникации и совместной работы в организациях, обеспечивают работу информационных, образовательных и развлекательных ресурсов, решают проблемы коммуникации между людьми различными способами, от простого обмена сообщениями до видео звонков и видеоконференций.

БИБЛИОГРАФИЯ

  1. Дубаков А.А. Сетевое программирование: учебное пособие. - СПб.: НИУ ИТМО, 2013. - 248 с.
  2. Олифер В.Г. Олифер Н.А. Сетевые операционные системы. 2 изд. - СПб.: Питер, 2009. - 669 с.
  3. Уолтон Ш. Создание сетевых приложений в среде Linux. - СПб.: «Вильяме», 2001. - 464 с.
  4. Филимонов А.Ю. Построение мультисервисных сетей Ethernet. - СПб.: БХВ-Петербург, 2007. - 592 с.
  5. Сысолетин Е.Г. Разработка интернет приложений: учебное пособие для вузов. - Екатеринбург: Издательство Урал. Ун-тф, 2017. - 90 с.
  6. Чеппел Л. Титтел Э. TCP/IP. Учебный курс. - СПб.: БХВ-Петербург, 2003. - 976 с.
  7. Хант К. TCP/IP. Сетевое администрирование. 3 изд. - СПб.: Символ-Плюс, 2007. - 816 с.
  8. Джонс Э. Оланд Дж. Программирование в сетях Microsoft Windows. Мастер-класс. - СПб.: Питер; М Издательско-торговый дом «Русская Редакция», 2002. - 608 с.
  9. Стивенс У. Рудофф Э. Феннер Б. UNIX: Разработка сетевых приложений. 3 изд. - СПб.: Питер, 2007. - 1088 с.
  10. Кумар В. Кровчик Э. Лагари Н. Мунгале А. .NET. Сетевое программирование. - М.: Лори, 2020. - 400 с.