Когда пользователь вводит URL-адрес сайта в поисковой строке браузера, его компьютер или другое устройство инициирует соединение с сервером и отправляет ему HTTP-запрос — сообщение с некой информацией. Это может быть просьба отправить ему HTML-страницу или, наоборот, данные пользователя, которые серверу нужно обработать. По сути, браузер предоставляет пользователю графический интерфейс для получения информации с сайтов с помощью HTTP. 

HTTP-сообщения — это основной способ коммуникации устройств в клиент-серверной архитектуре. Кроме него есть и другие методы, например FTP или P2P. Но в бытовой деятельности интернет-пользователей наиболее частым сценарием является именно HTTP.

В этой статье мы рассмотрим, как общаются серверы и устройства пользователей: что такое HTTP-сообщение, какая у него структура и из чего состоит HTTP-запрос и ответ. А также вскользь затронем сам протокол HTTP и его основы.

❯ Для чего нужен HTTP

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

Он необходим для гипертекстовой передачи данных, например, HTML-страниц. Сам протокол относится к седьмому уровню модели OSI, т.е. прикладному. 

По сути, HTTP-сообщения — это простой текст. Сам протокол регламентирует правила составления этого текста и общения между устройствами: что идёт в начале, какая структура HTTP-запроса и ответа, за сколько сервер должен ответить и другое.

Обычно для приёма сообщений по HTTP используется 80 порт, а для зашифрованной версии HTTPS — 443.

Основная версия протокола, которая используется сейчас, — это HTTP 1.1. По сравнению с первой версией в нём уже есть заголовки — параметры, которые описывают HTTP-запросы, поддержаны новые методы и многое другое.

❯ Из чего состоит HTTP-сообщение

HTTP-сообщение — это простой текст, составленный по определенным правилам. В схеме HTTP-запросов и ответов есть три основных компонентов:

  • стартовая строка HTTP-запроса и ответа,

  • заголовки и их значения,

  • опционально — тело сообщения.

Стартовая строка

Это начало HTTP-сообщения. Она занимает одну строку, и в HTTP-протоколе стартовые строки запросов и ответов немного различается. 

В основе HTTP-запроса указывается:

  • Метод, который характеризуют желаемый результат запроса: передача данных, загрузка HTML-страницы или что-то другое.

  • URI. Это уникальный идентификатор ресурса. 

  • Версия протокола.

Вот пример стартовой строки HTTP-запроса:

GET /blog/examplepage HTTP/1.1

Что он означает: клиент с помощью метода GET запрашивает у сервера HTML-страницу, размещенную в /blog/examplepage, через протокол версии 1.1. 

В стартовой строке HTTP-ответа указаны другие параметры:

  • Версия протокола.

  • Код состояния (числа, которые характеризуют статусы HTTP-запроса).

  • (Опционально) Текстовое пояснение к коду.

Например, если запрос был успешно обработан, сервер начнёт HTTP-сообщение таким образом:

  
    
  
  HTTP/1.1 200 OK

Методы HTTP-запросов

Методы описывают тип запроса: запрашивает ли клиент только страницу, передаёт ли информацию внутри тела запроса и другое. В основном для получения и размещения данных используются два самых популярных метода — POST и GET

Краткое описание всех методов:

  • GET. С помощью него клиент запрашивает у сервера содержимое ресурса. Например, HTML-страницу. Кроме того, с помощью этого метода на сервер можно передать данные клиента. Для этого в адресе ресурса после символа ? необходимо добавить параметры и их значения, которые нужно передать на сервер. Данные, передаваемые в HTTP-запросе, выглядят следующим образом:

GET /blog/examplepage?variable1=somevalue1&variable2=somevalue2 HTTP/1.1

Здесь variable1 и variable2 — это параметры, которые передаст клиент, а somevalue1 и somevalue2 — их значения. Важное свойство метода — идемпотентность: если выполнить HTTP-запрос несколько раз с одинаковым содержанием, то результат тоже будет одинаковым. 

  • HEAD. Это метод для получения заголовков ресурса. Часто его применяют для получения метаданных и проверки того, менялся ли ресурс с момента последнего посещения и существует ли он. 

  • POST. С помощью этого метода клиент может передать данные в теле сообщения, например, в случаях, когда данные нельзя передать с помощью метода GET. Это может быть пост в соцсети или данные банковской карты, которую нежелательно оставить в истории поиска. Также POST является неидемпотентным методом: при его отправке результат может отличаться. Ещё одна особенность POST — ответы на него не будут кэшироваться.

  • OPTIONS. С помощью него можно запросить список методов, которые он или его ресурс поддерживает. Также OPTIONS можно использовать для того, чтобы «пропинговать» сервер — протестировать его работоспособность.

  • PUT. Этот метод создаёт новый ресурс или заменяет существующий данными, которые указаны в теле запроса.

  • PATCH. Работает таким же образом, как и PUT, только по отношению к части ресурса.

  • DELETE. Клиент сообщает о том, что хотел бы удалить некий ресурс.

  • TRACE. С помощью него можно проверить, изменяют ли промежуточные узлы в сети запрос клиента.

  • CONNECT. Запускает туннель между клиентом и сервером.

Коды состояния

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

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

  • 100. Такой код характеризует то, что HTTP-сообщение клиента успешно принято и он может дальше отправлять их.

  • 101. В HTTP-запросе можно попросить сервер переключиться на другую версию протокола, используя заголовок Upgrade. Если сервер удовлетворит такой запрос, то в ответе пришлёт код 101. 

  • 102. Используется в работе HTTP-запросов, которые сервер принял, но ещё не успел обработать.

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

  • 200 OK. Самый распространённый код состояния. Он подразумевает, что запрос клиента выполнен успешно.

  • 201. Такой код используется в тех случаях, если с помощью запроса создаётся новый ресурс. Например, с помощью метода PUT. Если операция выполнена успешно, в ответе будет указан такой код.

Redirection. Такой класс кодов состояния используется в тех случаях, когда для выполнения операции нужно изменить запрос. Чаще всего это связано с неправильным URI ресурса.

Несколько примеров:

  • 301 Moved Permanently. Используется в тех случаях, когда запрашиваемый ресурс переместили в другую директорию навсегда — её можно будет найти в заголовке Location. Также у этого кода состояния есть похожий код 308, который также означает, что клиент должен использовать такой же метод к новому местоположению ресурса. 

  • 302 Found. Этот код состояния применяется тогда, когда запрашиваемый ресурс в текущий момент временно размещён на другом адресе. Его укажут в заголовке Location. Ещё у этого кода состояния есть похожий код 307, который используется в тех случаях, когда клиент должен использовать такой же метод.

Client Error. Коды состояния, которые относятся к этому классу, используются в случаях, когда во время выполнения запроса произошла ошибка на стороне клиента.

Часто встречаются такие коды:

  • 400 Bad Request. Клиент составил своё HTTP-сообщение неправильно.

  • 403 Access Forbidden. К ресурсу необходим другие права доступа.

  • 404 Not Found. Такой код состояния встречается чаще всего и означает, что сервер принял запрос, но по указанному адресу ничего не обнаружил.

Server Error. Это похожий класс кодов состояния, которые сигнализируют об ошибке. Однако в этот раз ошибка произошла на стороне сервера. Вот несколько вариантов:

  • 500 Internal Server Error. Сервер не смог обработать запрос из-за внутренней ошибки. Например, в PHP-коде, который используется для обработки запроса, есть проблемы.

  • 502 Bad Gateway и 504 Gateway Time Out. Иногда сервер выступает в роли промежуточного узла. Если следующий узел вернёт ошибку, сервер в ответе укажет код состояния 502. Если не ответит за отведённое время, то 504.

  • 503 Service Unavailable. Такой код состояния означает, что сейчас на сервере технические неполадки и он не может обработать запрос.

В конце статьи мы добавили таблицу со всеми HTTP-кодами, статусами и их описанием.

Что такое заголовки в HTTP?

Они определяют дополнительные параметры HTTP-сообщения. Они представляют собой пару из параметра и его значения, которые разделяются двоеточием. На одну строку — один параметр. 

Все заголовки можно разделить на четыре типа:

  • Те, что используются и в HTTP-запросах, и в HTTP-ответах, а также не относятся к телу сообщения.

  • Параметры HTTP-запроса.

  • Заголовки только HTTP-ответов.

  • И такие, что содержат данные о теле сообщения: его длину, формат данных и многое другое.

В целом, заголовков достаточно много, поэтому расскажем о самых распространённых: 

  • Host. Это заголовок HTTP-запроса, который содержит в себе адрес сервера, к которому делает запрос клиент. Если соединить значение Host с URI, получится URL-адрес ресурса. Пример HTTP-запроса:

  
    
  
  GET /blog/examplepage HTTP/1.1
Host: timeweb.cloud
  • Date. Это заголовок с датой, когда было создано HTTP-сообщение.

  • Last-Modified. Если ресурс изменялся, то благодаря Last-Modified сервер сообщит, когда именно.

  • Content-Type. Характеризует то, в каком формате и кодировке передаётся тело сообщения.

  • Content-Language. С помощью этого заголовка можно указать язык тела сообщения. 

  • Content-Length. Используется для того, чтобы сообщить размер тела сообщения. Полезен в тех случаях, когда тело сообщения слишком громоздко.

Тело сообщения

Это необязательный элемент HTTP-сообщения с полезной нагрузкой. Необязательный потому, что не каждое сообщение содержит в себе HTML-страницу или пользовательские данные. Например, в теле сообщения указывается содержимое HTTP-запроса при использовании метода POST

От остальных элементов HTTP-запроса и ответа эта отделяется одной пустой строкой. Его конец — это две пустые строки. Если внутри тела есть две пустые строки, то нужно использовать заголовок Content-Length. С ним вторая сторона будет ожидать полного сообщения, длина которого равна значения заголовка.

Чтобы все стороны диалога по HTTP-протоколу понимали, как именно передаётся информация, используется стандарт MIME для идентификация содержимого по заголовку Content-Type. Например, он регламентирует обычный текст, HTML-страницы или JSON. 

Ещё стандарт описывает нестандартные ситуации. Например, в данных форме. Они передаются в формате «ключ=значение», поэтому знак равно в данных заменяется на код %3D

❯ Список HTTP-кодов

Код

Статус

Описание

100

Continue

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

101

Switching Protocols

Сервер сменил версию протокола по просьбе клиента.

102

Processing

Так сервер сообщает клиенту, что принял запрос, но всё ещё обрабатывает его. Необходим для того, чтобы соединение не прекратилось из-за превышения времени ожидания. Этот код состояния используется в WebDAV — наборе расширений и дополнений к HTTP. 

103

Early Hints

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

200

OK

Запрос успешно обработан.

201

Created

Запрос успешно выполнен, и в результате обработки появился новый ресурс.

202

Accepted

Сервер принял запрос, но пока что ещё не обработал его.

203

Non-Authoritative Information

Сервер взял информацию для ответа не из первоисточника. Например, резервной копии.

204

No Content

В ответе нет тела сообщения.

205

Reset Content

Сервер сообщает клиенту, что тот должен сбросить введённые данные.

206

Partial Content

Используется, если клиент запросил только фрагмент ресурса.

207

Multi-Status

Сервер передаёт в ответе результаты выполнения сразу нескольких операций. Используется в WebDAV.

208

Already Reported

Используется в WebDAV и означает, что часть сообщения есть в предыдущем ответе.

226

IM Used

Сервер успешно обработал заголовок запроса A-IM. Используется для дельта-кодирования.

300

Multiple Choices

Сервер может предоставить ресурс в разных форматах MIME.

301

Moved Permanently

Запрашиваемый ресурс переместили в другую директорию навсегда — её можно будет найти в заголовке Location.

302

Found

Запрашиваемый ресурс в текущий момент временно размещён на другом адресе — его можно будет найти в заголовке Location.

303

See Other

Ответ на запрос можно найти по другому URI с помощью GET.

304

Not Modified

Используется, если клиент запрашивал ресурс с заголовками If-Modified-Since или If-None-Match.

305

Use Proxy

Запрашиваемый ресурс доступен только через прокси.

307

Temporary Redirect

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

308

Permanent Redirect

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

400

Bad Request

Клиент составил своё HTTP-сообщение неправильно.

401

Unauthorized

Чтобы получить доступ к ресурсу, клиент должен пройти аутентификацию.

402

Payment Required

Предусмотрен для будущего использования.

403

Forbidden

У клиента нет необходимых прав доступа

404

Not Found

К сожалению, на данном адресе сервер ничего не нашёл. Скорее всего, клиент ошибся с URI или страница была удалена.

405

Method Not Allowed

Сервер не поддерживает тот метод запроса, что выбрал клиент.

406

Not Acceptable

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

407

Proxy Authentication Required

Клиент должен пройти аутентификацию на прокси-сервере.

408

Request Timeout

Клиент не передал информацию серверу в определенный срок. 

409

Conflict

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

410

Gone

Означает, что ресурс удалён или недоступен.

411

Length Required

Клиент должен указать размер тела сообщения.

412

Precondition Failed

Сервер вернёт такой код состояния, если ни один из условных заголовков запроса не выполняется.

413

Payload Too Large

Тело запроса слишком велико.

414

URI Too Long

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

415

Unsupported Media Type

Сервер не работает с указанным типом данных.

416

Range Not Satisfiable

Range вышел за пределы ресурса.

417

Expectation Failed

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

418

I'm a teapot

Шутливый код, введенный в протоколе HTCPCP.

421

Misdirected Request

Запрос был перенаправлен на другой сервер, который не смог его осуществить.

422

Unprocessable Entity

В запросе есть логическая ошибка. Используется в WebDAV.

423

Locked

Ресурс, к которому делается запрос, был заблокирован из-за используемого метода. Используется в WebDAV.

424

Failed Dependency

Запрос не выполнен, так как он зависел от другого запроса, который также не был обработан. Используется в WebDAV.

425

Too Early

Сервер не готов обрабатывать запрос. 

426

Upgrade Required

Клиент должен обновить версию протокола для выполнения запроса.

428

Precondition Required

Клиент должен использовать заголовки с условиями. 

429

Too Many Requests

Клиент отправил слишком много запросов за короткий промежуток времени.

431

Request Header Fields Too Large

Сервер отказывается обрабатывать запрос, потому что поле с заголовками слишком большое.

451

Unavailable For Legal Reasons

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

500

Internal Server Error

Внутренняя ошибка сервера.

501

Not Implemented

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

502

Bad Gateway

Если сервер — прокси или промежуточный шлюз, он отправит такой код в том случае, когда следующий узел возвращает ошибку.

503

Service Unavailable

Сейчас сервер не может обработать запрос по техническим причинам. 

504

Gateway Timeout

Если сервер — прокси или промежуточный шлюз, он отправит такой код в том случае, когда следующий узел не ответил за отведённое время.

505

HTTP Version Not Supported

Сервер не поддерживает выбранную версию протокола.

506

Variant Also Negotiates

Внутренняя конфигурация сервера привела к цикличности.

507

Insufficient Storage

Серверу не хватает места для выполнения запроса. Используется в WebDAV.

508

Loop Detected

При обработке запроса возник бесконечный цикл.

510

Not Extended

На сервере нет расширения, которое хочет использовать клиент.

511

Network Authentication Required

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

❯ Заключение

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

Почитать подробнее об об актуальной спецификации HTTP/1.1 можно в RFC9112.


Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud  в нашем Telegram-канале 

Перейти ↩

? Читайте также:

Комментарии (0)