Когда пользователь вводит 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 с помощью |
304 |
Not Modified |
Используется, если клиент запрашивал ресурс с заголовками |
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-канале ↩