Какой принцип работы HTTP протокола?
Протокол HTTP (аббревиатура от анг. HyperText Transfer Protocol, протокол передачи гипертекста) является протоколом седьмого прикладного уровня модели OSI. HTTP есть основой системы World Wide Web, с помощью которого предоставляется возможность просмотра, доступа к веб-страницам в браузере и обеспечивается работа сети Интернет. В этот и состоит главная цель протокола. Также HTTP может служить в качестве транспорта для других протоколов прикладного уровня, например, SOAP.
Робота HTTP основана на клиент-серверной архитектуре. Где идет “общение” между клиентом и сервером посредством запросов и ответов. Об этом пройдемся более детально. Для этих целей использует протокол транспортного уровня TCP. Сервер работает на 80 порту, а для клиента номер порта генерируется автоматически операционной системой.
Клиенты (в большинстве случаев веб-браузеры, но могут быть и другим ПО) выполняют соединение, формируют и отправляют запрос к серверу. Эти запросы должны иметь стандартизованную структуру.
Сервер в свою очередь получает запрос от клиента, проверяет его, выполняет необходимые действия по полученному запросу, и возвращает ответ с сообщением с результатами выполнения назад клиенту. Аналогично имеет определенную установленную стандартную структуру.
Также между клиентом и сервером могут существовать посредники, такие как Proxy, для выполнения транспортных задач.
Структура HTTP запроса должна включать в себя:
- стартовую строку запроса с указанным методом, URL, и версией HTTP
Например,
GET /promotions HTTP/1.1
Host: hyperhost.ua
Методом задается само действие которое нужно выполнить на сервере с ресурсом указанным в URL. URL (Uniform Resource Locator, уникальное положение ресурса) - путь к запрашиваемому ресурсу. Коротко пройдемся по основным методах: GET, POST, HEAD, PUT, DELETE, TRACE, OPTIONS, CONNECT.
- GET - этот метод применяется, чтобы получить данные с сервера по заданном адресе.
- HEAD - работает по аналогии, как GET, и используется для получения запрашиваемого ресурса по указанному пути. А отличие в том, что в ответе сервер передает лишь заголовки и статусную строку, но без тела сообщения.
- POST - нужен уже наоборот для передачи необходимый данных от клиента на сервер. Например, при заполнении форм регистрации посетителем сайта, отправка введенных данных будет идти этим методом.
- PUT - с помощью метода осуществляется обновление ресурса по указанному пути.
- DELETE - служит для удаления ресурса указанного в URI.
- CONNECT - направляет существующее соединение через прокси.
- OPTIONS - чтобы получить характеристики, возможности текущего HTTP соединения для указанного ресурса.
- TRACE - позволяет проследить состояние ресурса, какие изменение, кем и когда вносились и т.д.
Есть несколько версий протокола, до недавнего времени чаще всего используется расширенная версия HTTP 1.1, так как без проблем поддерживается всеми браузерами и серверами, но при использовании было ряд нюансов касательно TCP соединений так называемого «медленного старта» (данные отправляются не сразу, а используется алгоритм для определения допустимого объема данных для передачи, чтобы не получить перегрузку сети, этот момент не дает использовать полностью пропускную способность сети), и спустя 10 лет был анонсирована новую версию HTTP/2, где главной особенностью было включение HTTP-потоков (позволяло выполнять несколько запросов через одно TCP-соединение). HTTP/2 частично решал вопрос, но не до конца. Потому с прошлого года внедрилась для тестирования версия HTTP/3, где уже вместо TCP используется QUIC (транспортный протокол разработан Google), для решения проблем с «медленным стартом».
- заголовки запросов и их значения
Содержит дополнительную информацию касательно системных параметрах, файлах cookie и другой служебной информации. Нужно обязательно включить заголовок Host c версии HTTP 1.1, где указывается доменное имя. Делается то для того, что на одной IP может располагаться несколько сайтов, а заголовок будет указывать на сайт, для нужно выполнить то или иное действия опираясь на указанный метод в стартовой строке.
Может иметь и другие заголовки, например, Content-Type указывает на тип передаваемого сообщения, а Content-Length на его длину. Поля что начинаются с Accept указывают серверу выдавать только указанные в заголовку форматы данных, которые потом сможет распознать и обработать при получении клиент. Например, Accept - задается список допустимых форматов, Accept-Charset - список поддерживаемых кодировок, Accept-Language - список естественных языков, Accept-Ranges - список единиц измерения. Также можно выделить заголовок User-Agent, где указано программное обеспечение клиента и его компоненты. Существует очень много заголовков. Обзор всех заголовков и их значений описаны в документации для необходимой версии HTTP здесь.
Заголовки от тела отделяются пустой строкой.
3) тело запроса. Является необязательным элементом и может отсутствовать. Содержит в себе данные, которые будут передаваться в сформированном запросе.
Синтаксис ответа сервера очень похож с структурой запроса и включает:
- строку состояния, с указанием версии протокола, кодом состояния и его кратким описанием.
Например,
HTTP/1.1 200 OK
Именно по коду состояние клиентское приложение узнаёт о результатах отправленного запроса, анализирует его и определяет какие действия следует совершить дальше. Уже по началу кода состояния можно судить об успешности запроса, так как первая цифра указывает на класс состояния. Чтобы было более понятные, после кода идет краткая фраза на английском языке с объяснением причины полученного ответа. В нас на блоге ГиперХост есть отдельная статья посвященная кодам состояние с их детальным описанием, ознакомится можно по ссылке здесь, поэтому не будем задерживаться на этом пункте, а перейдем к следующему.
- заголовок ответа
Также дополняет ответ сервера дополнительной информацией, которая необходима для осуществления “общения” между клиентом и сервером. Можно выделить такие заголовки: Vary - предоставлен список всех заголовков запроса, которые были приняты во внимание при обработке запроса и формирования ответа. Server - указаны веб-сервер и его компоненты, именно где был сформирован ответ. А заголовок Via - преподносит список версий протокола, названий и версий прокси-серверов, через которых прошло сообщение. Заголовок Age содержит время в секундах, в течение которого объект находился в прокси-кэше. Allow - указывает на доступные методы, которые могут применяться к ресурсу (такой заголовок отправляется если указанный в запросе метод был недоступен). Public - похож на Allow, но определяет допустимые методы уже на уровне всего сервера. Заголовок Date - дата когда сообщение с сервера было отправлено к клиенту. Last-Modified - определяет дату последний модификации ресурса. Retry-After - указывает на время после которого клиент может осуществить следующий запрос к серверу.
Аналогично с другими заголовками можно ознакомится в документации.
- тело ответа также не есть обязательным составляющим ответа, но как вариант, может предоставлять в себе содержание запрашиваемого ресурса.
Говорить об HTTP можно очень долго, в этой статье мы описали некоторые базовые моменты. Но будем и дальше продолжать обращать внимание и оповещать тему развития протокола.