Файл: Принципы построения и основные задачи, выполняемые серверными программами и работа с ними.pdf
Добавлен: 05.04.2023
Просмотров: 180
Скачиваний: 2
ВВЕДЕНИЕ
Тема данной курсовой работы является «Принципы построения и основные задачи, выполняемы серверными программами». В настоящее время это достаточно актуальная тема. В связи с все большим распространением Интернета все больше и больше разработчиков программного обеспечения выбирают клиент-серверную архитектуру там, где это возможно. В контексте работы с базами данных клиент-серверная архитектура актуально в первую очередь потому что позволяет обеспечить простые и относительно дешевые средства для коллективной работы с базой данных.
Важной задачей для информационных стратегий организаций является присутствие в Интернете и разработка распределенных информационных систем, которые обеспечивают связь с заказчиками и поставщиками, маркетинг и многие другие виды деятельности. Это повышает интерес к созданию информационных систем, использующих распределённые вычисления.
При работе с серверными программами одной из основных архитектур построения программного обеспечения является клиент-серверная архитектура. Подобным подход в производстве программного обеспечения имеет ряд преимуществ, таких как: отсутствие дублирования кода клиентскими программами, более низкие требования к компьютерам клиентских программ, централизованное управление базами данных, которые хранятся на сервере и как правило лучше защищены.
Большинство задач, решаемые программистами в повседневной работе связано с выполнением локальных действий в системе. Обычно они не выходят за рамки работы с файловой системой и взаимодействия с периферией компьютера. Более трудная задачей является заставить взаимодействовать несколько программ, работающих на разных компьютерах, которые подключены к сети.
Основной единицей всего сетевого программирования в большинстве операционных систем является сокет. Как функции файлового ввода-вывода определяют интерфейс взаимодействия с файловой системой, так и сокет соединяет программу с сетью. С его помощью программа может отправлять и принимать сообщения.
1. Принципы построения серверных программ
1.1. Создание сетевых клиентских приложений
Клиентское приложение должно выполнить несколько действий для установления соединения с другим компьютером или сервером в сети. Эти действия должны быть выполнены в определенной последовательности. На каждом из этапов программа может задавать различные опции. Но не все эти действия являются обязательными, если некоторые из них пропущены, операционная система воспользуется установками по умолчанию. Базовая последовательность действий имеет следующий вид: создание сокета, поиск адресата, организация канала связи с другой программой и разрыв соединения.
Рассмотрим каждый из этапов:
- Создание сокета. Выбор сетевого домена и типа сокета.
- Задание параметров сокета. Является необязательным этапом. Поведением сокета возможно управлять множеством параметров.
- Привязка в определенному адресу или порту. Является необязательным этапом. Установка конкретного IP-адреса и выбор порта. При пропуске этого этапа операционная система разрешит связь с любым IP-адресом и назначит произвольный номер порта.
- Подключение к одноранговому компьютеру или серверу. Является необязательным этапом. Организация двунаправленного канала связи между клиентской и другой сетевой программой. При пропуске этого этапа будет создан канал адресной передачи сообщений без установления соединения.
- Частичный разрыв соединения. Является необязательным этапом. выбор одного из двух режимов работы: прием или передача. Данный этап можно выполнить, если создан запасной канал связи.
- Прием и передача сообщений. Является необязательным этапом. этот этап возможно пропустить, если требуется всего лишь проверить доступность сервера.
- Разрыв соединения. Безусловно этот этап является важным так как долго выполняющиеся программы могут со временем исчерпать лимит дескрипторов файлов, если не закрывать неиспользуемые сеансы.
В сетях применяется множество различных протоколов, приспособленных для решения множества специфических задач. Семейство протоколов 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. Создание серверных приложений
Процесс построения сервера всегда начинается с создания сокета. Наподобие того как в клиентской программе требуется определенная последовательность системных вызовов, аналогичная последователь требуется на сервере.
Как правило в серверной программе нужно вызвать ряд системных функций в определенной последовательности. На примере простого эхо-сервера можно наглядно увидеть последовательность этих функций, не отвлекаясь на решение других, более узконаправленных задач. Вот общий алгоритм работы эхо-сервера:
- Создание сокета.
- Привязка к порту.
- Перевод сокета в режим прослушивания.
- Проверка подключения.
- Чтение сообщения.
- Возврат сообщения клиенту.
- Если полученное сообщение не является строкой «bye», возврат к пункту 5.
- Разрыв соединения.
- Возврат к пункту 4.
Работа с TCP-сокетами начинается с функции создания сокета, так же требуется задать номер порта, для того чтобы клиент мог к нему подключится. При задании номера порта запрашивается у операционной системы, может ли платформа использовать порт с заданным портом. Если сервер не указывает порт, система назначает ему ближайший свободный порт из пула доступных. Этот порт может быть различным при каждом последующим запуске серверной программы. Операционная система связывает порт только с одним процессом.
Сокет обеспечивает интерфейс, с помощью которого одна программа может взаимодействовать с другой по сети. После подключения программы к порту, никакая другая программа не может к нему обратится. Для разрешения подобных ситуация на сервере организуется очередь ожидания. При создании очереди ожидания указывается число позиций в очереди. Кроем того, сокет переводится в режим «только прослушивание».
После того как клиент устанавливает соединение с сервером, сокет, который находится в режиме прослушивания, организует новый двунаправленный канал между клиентом и своим собственным портом. С данного момента серверная программа взаимодействует с клиентом через новый канал.
При создании серверной программы важно учитывать, как осуществляется взаимодействие между клиентом и сервером и каким образом должна себя вести каждая из сторон. Детальный анализ используемого протокола позволяет определить, как лучше обрабатывать каждый запрос.