26

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

Но HTTP использует TCP, который ориентирован на состояние.

Если это так, как HTTP становится без сохранения состояния?

4 ответа4

42

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

Транспортной технологией может быть TCP, или старый SPX Novell, или SCTP, или что-то еще, что вы можете придумать, и HTTP все равно будет работать так же. HTTP требует потокового или ориентированного на соединение протокола - и зависит от разрешаемых URL-адресов - но ему все равно, как это сделать.

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

Тот факт, что протокол нижнего уровня является состоящим из состояния, не означает, что что-то поверх него автоматически становится состоящим или требует наличия состояния.

Сам HTTP не имеет состояния. Это означает, что приложения должны реализовать другой уровень поверх HTTP, чтобы установить состояние. Обычно это делается с помощью файлов cookie сеанса.

10

"HTTP не имеет состояния" означает, что каждая транзакция HTTP (пара запрос-ответ) может обрабатываться независимо от любого состояния из предыдущей пары запрос-ответ.

Чтобы транспортировать конкретную пару запрос-ответ, вам нужен протокол, который может переносить туда как угодно большой блок, так и произвольно большой блок, и для этого на уровне с ограниченным размером пакета протокол TCP должен быть с состоянием.

Но за границей транзакции нет государства. Клиент может сбросить соединение и установить новое для следующего запроса. Фактически это был единственный вариант в ранних версиях, и он все еще работает так, если клиент не включает заголовок Connection: keep-alive .

Следующий запрос также может быть легко обработан другим сервером, и клиент никогда не узнает, потому что серверу не нужно поддерживать какое-либо состояние (если только приложение не добавляет свое собственное состояние поверх HTTP, обычно в форме сеанса; последующие осложнения в балансировке нагрузки это наказание за создание протокола HTTP с отслеживанием состояния. Это используется для балансировки нагрузки на занятых серверах.

2

Природа HTTP без состояния означает, что на этом уровне информация о состоянии не создается и не используется.

Вы можете увидеть это в нескольких случаях, например, в HTTP-аутентификации, учетные данные отправляются с каждым запросом, а постоянные подключения - это просто оптимизация (т. Е. Если я отправляю учетные данные, сервер забывает их после запроса, даже если он выходит соединение открыто).

В отличие от этого, механизмы входа в систему на основе файлов cookie сохраняют состояние, но не являются частью HTTP.

1

Вы должны понимать это как набор русских кукол (или коробок, если хотите), каждая из которых несет в себе еще одну, вот в общем-то, как это работает: TCP переносит HTTP "внутрь", но его это не волнует или его особенности.

Чтобы получить полную картину, я рекомендую прочитать о модели OSI, так как она проясняется.

TCP находится на несколько уровней ниже HTTP в модели OSI, каждый уровень фактически соответствует своему протоколу.

В нашем случае HTTP находится на уровне представления и приложения, а TCP - на транспортном уровне. Или, если вы используете модель TCP/IP, протоколы TCP и IP располагаются на уровне сетевого соединения, а HTTP - на уровне приложений и представления.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .