Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы и средства передачи данных в автоматизированных системах. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
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 данные уже когда-то были созданы, то они
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]