Какова структура и основные компоненты HTTP/1.1 запроса и ответа?

«Какова структура и основные компоненты HTTP/1.1 запроса и ответа?» — вопрос из категории Сети, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HTTP/1.1 — это текстовый протокол прикладного уровня, работающий по принципу "запрос-ответ" поверх TCP. Каждый обмен состоит из двух частей: запроса от клиента и ответа от сервера. ### 1. HTTP-запрос (Client Request) Состоит из трех частей: * **Стартовая строка (Start Line):** `METHOD /path HTTP/VERSION`. Например: `GET /index.html HTTP/1.1`. * **Заголовки (Headers):** Пары `ключ: значение`, предоставляющие метаинформацию. Обязательный заголовок в HTTP/1.1 — `Host`. * **Тело (Body):** Необязательные данные, передаваемые серверу (например, JSON в POST-запросе). Отделяется от заголовков пустой строкой. ### 2. HTTP-ответ (Server Response) Структура аналогична запросу: * **Строка состояния (Status Line):** `HTTP/VERSION STATUS_CODE REASON_PHRASE`. Например: `HTTP/1.1 200 OK`. * **Заголовки (Headers):** Метаинформация об ответе, например `Content-Type` или `Content-Length`. * **Тело (Body):** Содержимое ответа (HTML-страница, JSON-данные и т.д.). ### Пример обмена ```http # --- Запрос клиента --- GET /page.html HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Accept-Language: en-US # --- Ответ сервера --- HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 155 Date: Fri, 20 Oct 2023 10:00:00 GMT Example Page

Hello, World!

``` **Ключевая особенность HTTP/1.1** — **Head-of-Line Blocking (HOLB)**: следующий запрос в рамках одного TCP-соединения не может быть отправлен, пока не получен ответ на предыдущий. Эта проблема решается в более новых версиях протокола, таких как HTTP/2.