Ответ
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.Ответ 18+ 🔞
Давай разберём эту штуку, которая у нас под капотом веба работает. HTTP/1.1, блядь. Представь себе, что это как два мужика перекрикиваются через забор, по строгим правилам. Один орет запрос, второй — отвечает. И так по кругу, пока не надоест.
### 1. Кричит клиент (HTTP-запрос)
Состоит из трёх кусков, как бутерброд:
* **Первая строка — что хочешь:** `МЕТОД /путь HTTP/версия`. Типа `GET /index.html HTTP/1.1`. То есть "эй, дай-ка мне эту страницу, по старым правилам".
* **Заголовки — уточнялки:** Парочки `ключ: значение`. Типа `Host: example.com` — это вообще обязательно, а то сервер, ёпта, не поймёт, к кому обращаются. Ещё можно `User-Agent` впендюрить, чтобы похвастаться, каким браузером сидишь.
* **Тело — если несёшь подарок:** Не всегда есть. Если просто смотришь — тела нет. А если, например, логинишься (POST-запрос) — то там твой логин-пароль в теле и плывёт. От заголовков тело отделяется пустой строкой, чтоб не путать.
### 2. Отвечает сервер (HTTP-ответ)
Сервер не молчит, он тоже по формату отвечает:
* **Первая строка — отмазка или согласие:** `HTTP/версия КОД_ОТВЕТА ПОЯСНЕНИЕ`. Классика — `HTTP/1.1 200 OK`. А может и `404 Not Found`, если файлик потерял, пидарас.
* **Заголовки — что несёт:** Тоже парочки. `Content-Type: text/html` — говорит, что в теле HTML, готовься рендерить. `Content-Length` — предупреждает, сколько байт гонит, чтобы ты не ждал вечность.
* **Тело — сам товар:** Вот она, страница, 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