Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Методы и средства передачи данных в автоматизированных системах. Учебное пособие
.pdf
4.6. Протоколы верхнего уровня
121
Далее проведем исследование протоколов верхнего уровня, на ко-
торые напрямую указывают пользователи таких систем, когда разрабатывают соответствующее программное обеспечение или используют его на
практике.
Эта информация необходима для понимания, как устроены методы
и средства обмена данными на самом верхнем уровне абстракции.
4.6. Протоколы верхнего уровня
Первым мы рассмотрим самый популярный сетевой протокол HTTP,
применяемый для доступа к удаленным ресурсам и для построения обмена
информацией в клиент-серверной архитектуре.
Протокол передачи гипертекста или hypertext transfer protocol
(HTTP) – это протокол прикладного уровня, первоначально создаваемый
для передачи структурированных текстовых данных в виде гипертекстовых
документов. Для гипертекста известен формат разметки документа HTML.
В настоящее время HTTP используется для передачи совершенно
произвольных текстовых данных или данных другого формата, приводимого к тексту, а точнее к строкам.
В основе применения протокола HTTP лежит технология «клиент-
сервер», т.е. предполагается, что:
1) существует множество потребителей информации или клиентов,
которые инициируют соединение и посылают запрос;
2) существует один или несколько поставщиков информации, также
называемых серверами, которые ожидают запроса клиентов на установление соединения, получают и обрабатывают запрос, выполняют необходимые действия и возвращают обратно сообщение со статусным кодом и результатом.
Протокол HTTP и его производные протоколы и технологии сейчас
повсеместно используется во Всемирной паутине.
HTTP используется также в качестве «инструмента для переноса
данных и форматов» для других протоколов прикладного уровня.
Среди тих можно назвать следующие:
1) текстовый формат обмена данными, основанный на JavaScript
(JSON);

Глава 4. Основы применения компьютерных сетей в автоматизированных…
122
2) протокол удалённого вызова процедур, использующий JSON для
кодирования сообщений (JSON-RPC);
3) протокол обмена структурированными сообщениями в распреде-
лённой вычислительной среде (SOAP);
4) стандарт/протокол вызова удалённых процедур и прообраз SOAP
(XML-RPC);
5) система удалённого вызова процедур (RPC), разработанная компа-
нией Google (gRPC);
6) набор расширений и дополнений к протоколу HTTP, поддержива-
ющих совместную работу пользователей над редактированием файлов и
управление файлами на удаленных веб-серверах (WebDAV) и так далее.
Как видно из перечисления выше, протокол HTTP является базой
для самых современных способов обмена информацией.
Сейчас повсеместно используется 2-я версия данного протокола,
но на смену постепенно приходит 3-я версия, более надежная и современная. Ее поддержка со стороны браузеров и средств разработки началась
уже в 2019 г.
Для HTTP основным объектом для манипуляций является некоторый удаленный ресурс, который в пределах сетевого домена однозначно
идентифицируется уникальным идентификатором или uniform resource
identifier (URI). Этот URI обязательно фигурирует в запросе клиентов и обрабатывается на сервере. URI лежит в основе внутренней маршрутизации
и системе доступа любых клиент-серверных приложений.
Такими идентификаторами могут быть помечены любые объекты:
1) файлы на удаленном сервере;
2) логические объекты или объекты бизнес-логики приложений;
3) системные триггеры событий сервера или же вообще что-то аб-
страктное.
Подробности запроса указываются в заголовке HTTP запроса, а тип
действия с удаленным ресурсом задается типом запроса.
В заголовке можно указывать, например:
1) кодировку запроса и ответа;
2) язык;
3) размер сообщения;
4) типы и форматы данных в сообщении;

4.6. Протоколы верхнего уровня
123
5) токены безопасности;
6) ссылки для перенаправления;
7) пользовательские параметры.
Именно благодаря заголовкам можно, например, указать, что сейчас
будет отправлена форма авторизации (multipart/form-data), затем файл
(Content-Disposition: attachment; filename="MyFileName.ext"), в следующем
сообщении со своим заголовком пойдет просто текст (Accept: text/plain), а
в завершении серии запросов пойдет команда в специальном формате
(Content-type: application/json; charset=utf-8).
По своей сути, HTTP – это протокол прикладного уровня, но в отличие от многих других протоколов, HTTP не сохраняет своего состояния.
Это свойство называется идемпотентностью запросов, т.е. при одинаковых
запросах к одному и тому же ресурсу, будет возвращаться один и тот же
результат. Это не является истиной для абсолютно всех запросов, выполняемых по HTTP. Например запросы для чтения ресурса будут иметь свойство идемпотентности, а вот одинаковые запросы по созданию ресурса на
сервере, передаваемые на один и тот же адрес, – не будут, так как в этом
случае будет создаваться новый объект в базе данных и будут возвращаться
разные идентификаторы. Операция удаления ресурса в случае его присутствия в базе данных вернет его идентификатор при первом запросе, но вернет ошибку 404 при повторном. Так что реакция на HTTP-запросы на самом деле зависит от бизнес-логики приложения.
Примечательно то, что компоненты, использующие HTTP, могут самостоятельно сохранять информацию о состоянии, связанную с последними запросами и ответами на них.
Примером таких состояний можно назвать «куки» (cookies) на стороне клиента и «сессии» (sessions) на стороне сервера.
Браузер, посылающий запросы, всегда старается отслеживать состояние и задержки ответов, хотя сам по себе протокол «ничего не знает» о
предыдущих запросах и ответах, так как в нём не предусмотрена внутренняя поддержка состояния.
Большинство протоколов, предусматривает установление TCP-сессией. В начале сессии происходит авторизация, и все дальнейшие действия
выполняются в контексте текущей сессии и в контексте авторизации.
Протокол HTTP устанавливает отдельную TCP-сессию на каждый
запрос.

Глава 4. Основы применения компьютерных сетей в автоматизированных…
124
В более поздних версиях HTTP разрешено делать несколько запросов
в ходе одной TCP-сессии, но клиенты обычно запрашивают только страницу
и все включённые в неё объекты, а затем сразу разрывают TCP-сессию и соединение.
Cookies как раз и используются для поддержки авторизованного или
неанонимного доступа. Примечательно также и то, что такой способ авторизации позволяет сохранить сессию даже после перезагрузки клиента и
сервера и восстановить ее.
В общем случае HTTP-запрос позволяет клиенту прислать на сервер
соответствующие параметры, которые будут переданы запускаемому
скрипту или приложению. Изначально для этого в HTML были введены
формы. Формы позволяют сделать запросы типа GET или POST, которые
будут рассмотрены ниже.
Исторически, первыми инструментами, которые позволяли обрабатывать HTTP-запросы на стороне сервера, были CGI – скрипты.
CGI – это common gateway interface или общий интерфейс шлюза.
Данный интерфейс позволяет реализовать вызов соответствующей программы-обработчика, т.е. образует консоль ввода-вывода для взаимодействия с клиентом.
Сейчас программирование CGI скриптов уже не так актуально, так
как серверное программное обеспечение пишется практически на всех популярных языках программирования: PHP, python, ruby, perl, javasrtipt,
java, C#, rust, golang и так далее. Существуют специализированные вебфреймворки и библиотеки и это направление программирования развивается дальше.
Кроме всего прочего, приведенные выше особенности HTTP позволили создавать поисковые машины, форумы, интернет-магазины и аукционы, создавать сетевые игры и социальные сети. Это позволило коммерциализировать Интернет, изначально создаваемый для научных и военных
нужд, и провести сеть «в каждый дом».
Всё программное обеспечение для работы с протоколом HTTP мы
можем разделить на три большие категории:
1) серверы, как основные инструменты приема и обработки запросов;
2) клиенты, как конечные потребители услуг сервера и источники за-
просов;

4.6. Протоколы верхнего уровня
125
3) прокси или посредники для выполнения транспортных функций и
промежуточной обработки запросов и данных.
Рассмотрим эти роли более подробно.
Серверное программное обеспечение сейчас заменяет (в паре с кли-
ентами) многие стандартные прикладные программы, ранее используемые
исключительно на ЭВМ. Многие фирмы-производители программного
обеспечения создают «веб-клоны» или «веб-версии» своих систем: это различные офисные приложения, бухгалтерские программы, игры, редакторы
и так далее. Сейчас выгодно привязывать клиента к серверу, а не к отдельному компьютеру. С другой стороны, при помощи облачных систем хранения данных можно «начать работу на одном устройстве и завершить ее на
другом», совершенно не беспокоясь о сохранности рабочего процесса.
Серверы создаются с самыми разными функциями и имеют различ-
ную сложность. Существуют микросерверы или серверы приложений,
обеспечивающие базовый функционал и сохранение данных и имеющие
всего несколько внутренних ресурсов и точек доступа. Также существуют
мощные серверы и даже распределенные вычислительные и облачные системы, обслуживающие миллионы клиентов одновременно.
Всем известно, что изначально протокол HTTP создавался для до-
ступа к гипертекстовым данным и документам во всемирной паутине.
В связи с этим, основным клиентским программным обеспечением и по сей
день можно считать браузеры.
При помощи браузеров мы сейчас читаем, смотрим видео, слушаем
музыку, учимся, удаленно управляем различными системами, играем в
игры, общаемся, потребляем удаленный контент.
С другой стороны, сейчас практически любое программное обеспе-
чение можно подключить к сети Интернет, если языковые средства разработки содержат в себе веб-клиент. Этот вариант мы используем для получения актуальных данных с удаленных серверов, сохранения данных, авторизации, обновления программного обеспечения и сертификатов лицензий.
Особенно сейчас нужно отметить мобильное направление развития
программных технологий и устройств – практически у каждого человека во
владении находится интеллектуальное мобильное устройство с выходом в
Интернет. Смартфоны настолько плотно вошли в нашу жизнь, что процент

Глава 4. Основы применения компьютерных сетей в автоматизированных…
126
потребления информации с их помощью превышает долю классических
браузеров, установленных на персональных ЭВМ.
Третий тип – прокси, применяются для промежуточной обработки
данных и могут быть использованы «между» клиентами и сервером. В терминологии программистов они носят название «промежуточного программного обеспечения» и, в зависимости от степени удаленности от сервера, могут помечаться как proxy или как middleware. Proxy принимает запросы от многих клиентов, проводят обработку данных, валидацию запросов, «отдают» статические ресурсы типа закэшированных страниц или картинок, а часть запросов пропускают внутрь системы на свободные серверы
или на один сервер приложений. Самым известным прокси-сервером сейчас является nginx. Это прокси-сервер общего назначения, разработанный
российским программистом Игорем Сысоевым. Уже длительное время он
обслуживает серверы многих высоконагруженных российских сайтов, таких как Яндекс, Mail.Ru, ВКонтакте и Рамблер. Согласно статистике
Netcraft nginx обслуживал или проксировал 22,50 % самых нагруженных
сайтов в октябре 2021 г. Вот некоторые примеры успешного внедрения
nginx: Dropbox, Netflix, Wordpress.com, FastMail.FM. Nginx часто применяется и независимыми разработчиками, которые ценят это программное решение за его простоту, надежность и гибкость.
Что же касается middleware, то это промежуточное или связующее
программное обеспечение, применяемое для обеспечения взаимодействия
между различными приложениями, системами, компонентами. Самый простой случай применения middleware – это авторизация пользователей. Созданный в программном коде сервера auth-middleware подключается к нужным маршрутам и группам маршрутов и в «прозрачном» режиме проверяет
факт авторизации пользователей, допуская к ресурсу только зарегистрированных клиентов, имеющих права этот ресурс использовать.
Практически все перечисленные выше решения самого разного уровня
и масштаба опираются на структуру, заголовки и типа HTTP-запросов. Рассмотрим для начала структуру HTTP-сообщения.
Каждое HTTP-сообщение состоит из трёх основных частей, которые
передаются в указанном порядке:
1) стартовая строка или starting line – это тип сообщения;

4.6. Протоколы верхнего уровня
127
2) заголовки или headers – это часть сообщения, характеризующая
тело, параметры передачи и содержащая прочие сведения;
3) тело сообщения или message body – это непосредственно данные
сообщения.
Тело сообщения обязательно должно отделяться от заголовков пу-
стой строкой. Оно может отсутствовать или быть пустым, но стартовая
строка и заголовок являются обязательными элементами.
Также для версии протокола HTTP 1.1 сообщение запроса обяза-
тельно должно содержать заголовок Host.
Стартовые строки HTTP-сообщения различаются для запроса и от-
вета. Строка запроса выглядит так:
«Метод» «URI» HTTP/«Версия»
Рассмотрим структуру более подробно:
1) Метод или method – это тип запроса, описываемое одним словом,
причем заглавными буквами. Следует помнить, что в устаревшей версии
HTTP 0.9 использовался только метод GET, а список современных методов
(для версии HTTP выше 1.1 представлен ниже).
2) Уникальный идентификатор ресурса или URI определяет путь к за-
прашиваемому ресурсу.
3) Версия или version – это пара разделённых точкой цифр. Напри-
мер: 1.0 или 1.1.
Чтобы запросить страницу данной статьи, клиент должен передать
строку (задан всего один заголовок):
GET /users HTTP/1.0
Host mysite.com
Стартовая строка ответа сервера имеет следующий формат:
HTTP/«Версия» «КодСостояния» Пояснение
Рассмотрим формат более подробно:
1) версия – это пара разделённых точкой цифр, так же как в запросе;
2) код состояния или status code – это три цифры: по этому цифровому
коду определяется дальнейшее содержимое сообщения и поведение клиента, так как это результат обработки запроса на стороне сервера (коды состояния также будут рассмотрены ниже);

Глава 4. Основы применения компьютерных сетей в автоматизированных…
128
3) пояснение или reason phrase – это короткое текстовое пояснение к
коду ответа для клиента: содержимое поля никоим образом не влияет на
сообщение и является необязательным, однако может использоваться,
например для показа всплывающих уведомлений.
Например, стартовая строка ответа сервера на предыдущий запрос
может выглядеть так:
HTTP/1.0 200 OK, Server is available!
Рассмотрим далее определение методов запросов.
Метод запроса HTTP – это стандартизированная последовательность
символов, кроме управляющих и разделителей, которая указывает на способ обработки запроса и на основную выполняемую операцию. Традиционно метод представляется коротким английским словом, записанным заглавными буквами.
Сервер может принимать любые названия методов, но если он не рас-
познает аббревиатуру метода, то он должен выдать статусное сообщение
501 Not Implemented. Если сервер «знает» такой метод, но он не может его
применить к указанному ресурсу, то он должен вернуть статус 405 Method
Not Allowed.
Рассмотрим далее стандартные методы HTTP запросов, которые обрабатываются сейчас и на сервере, и на клиентах.
Метод OPTIONS
Используется очень часто как тестовый запрос для определения возможностей веб-сервера, доступности ресурса или параметров соединения
для конкретного ресурса. В ответ серверу также следует включить дополнительный заголовок Allow со списком поддерживаемых методов. Также в
заголовке ответа может включаться информация о поддерживаемых расширениях.
Запросы OPTIONS, начиная с протокола HTTP 1.0 могут также применяться для проверки работоспособности сервера (аналогично команде
«пинг»). Результат выполнения этого метода не кэшируется.
Метод GET
Пожалуй, это самый известный метод для работы с серверами. Используется для запроса содержимого указанного ресурса. С помощью метода GET браузеры загружают статические страницы, а веб-приложения

4.6. Протоколы верхнего уровня
129
получают пакеты данных для заполнения реактивных элементов на страницах. С помощью метода GET можно также начать какой-либо процесс на
сервере, например инициировать цепочку в бизнес-логике. GET-запрос
обычно отправляется без тела сообщения, но может содержать в себе параметры запроса query params. При этом параметры или переменные запроса
могут находиться в адресной строке или быть частью URI.
Например, для запроса всех элементов списка (elements), можно выполнить следующий запрос на сервер myserver.ru с идентификатором ре-
сурса/api/v1/elements (где /api/v1/ является версией используемого программ-
ного интерфейса на сервере, а elements типом запрашиваемого ресурса):
GET http://myserver.ru/api/v1/elements
В то же самое время можно ограничить количество получаемых ресурсов при помощи так называемой «пагинации» или pagination. Пагинация
выполняется при помощи двух параметров: страницы и пределы (т.е. page
и limit) или же пределы и смещения (limit и offset). Страница или смещение
задает начальную позицию выдаваемого «окна» в серии данных, а пределы
задают размер окна. К примеру, у нас есть 1000 элементов в базе данных,
но мы хотим сделать постраничное отображение. Допустим мы хотим отобразить 5-ю порцию данных (страницу) с размером в 10 элементов. В этом
случае запрос приобретает вид:
GET http://myserver.ru/api/v1/elements?page=5&limit=10
Что касается других параметров GET-запроса, то они также передаются в URI. Клиент может передавать параметры выполнения после символа «?», например:
GET http://myserver.ru/api/v1/elements?param1=value1¶m2=value2
Как видно из примера, пагинация также является просто параметром
запроса, только обрабатывается она специальным образом.
Согласно стандарту HTTP, запросы типа GET считаются идемпотентными.
Кроме обычного метода GET, различают ещё:
1) GET-запрос с условием – он содержит заголовки If-Modified-
Since, If-Match, If-Range;
2) частичный GET-запрос – он содержит в запросе диапазон значе-
ний range.

Глава 4. Основы применения компьютерных сетей в автоматизированных…
130
Метод HEAD
Данный метод аналогичен методу GET, но в ответе сервера должно
отсутствовать тело.
Такой запрос обычно применяется для извлечения метаданных, про-
верки наличия ресурса, получения статуса операции.
Метод POST
Это второй по популярности метод запросов от клиента на сервер.
Он применяется именно для отправки данных пользователя на сервер.
В стандарте HTTP метод POST появился одним из первых и получил
широкое распространение. Это видно по тому, что он является стандартным решением для HTML-формы, до сих пор являющейся основным инструментом для сбора данных пользователя и отправки на обработку. При
помощи форм в блогах посетители обычно могут отправлять комментарии
к записям, пользователи сайтов могут заполнять форму обратной связи.
Также клиенты могут авторизоваться в веб-приложении или создавать свой
аккаунт: все это выполняется при помощи формы.
Клиент просто формирует тело запроса, размещает соответствующие заголовки пакета и отправляет POST-запрос из HTML-формы. При
этом все передаваемые данные включаются в тело запроса.
Также при помощи POST-запросов можно загрузить и файлы на
сервер.
В отличие от метода GET, метод POST уже не считается идемпотентным, как уже говорились выше. Напомним, что при помощи POST-запроса
обычно создаются новые объекты на сервере, т.е. многократное повторение
одних и тех же запросов POST может возвращать разные результаты (например, сервер выдает идентификатор созданного объекта).
Часто в ответ на POST-запрос сервер выдает еще и какое-либо
«тело» с данными. Но сообщение ответа сервера на выполнение метода POST не кэшируется.
Метод PUT
Часто применяется аналогично POST для загрузки каких-либо данных на указанный в запросе URI. Особенность данного запроса состоит в
том, что, если данных по URI еще не существует, то PUT его должен создать. А если по заданному URI данные уже когда-то были созданы, то они
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
