Почему говорится, что «HTTP - это протокол без сохранения состояния»?

170

HTTP имеет файлы cookie HTTP. Файлы cookie позволяют серверу отслеживать состояние пользователя, количество подключений, последнее подключение и т. Д.

HTTP имеет постоянные соединения (Keep-Alive), где несколько запросов могут быть отправлены с одного TCP-соединения.

Хосе Нобиле
источник
3
Другой областью, где я не вижу «отсутствия гражданства», является авторизация, в частности, прокси-авторизация. Похоже, что это состояние во время переговоров. Для NTLM-аутентификации клиент должен помнить тип Proxy-Authentication, а сервер должен находиться в состоянии, так как есть последовательность для типов сообщений NTLM. Так что я не уверен, что понимаю ответы.
Линдси Морсилло
1
Должен ли я теперь добавить HTTP / 1.1? Потому что я думаю, что HTTP / 2 имеет состояние.
Хосе Нобиле
4
HTTP / 2 с состоянием. HTTP 1 не имеет состояния. Более поздние дополнения, предназначенные для HTTP 1, такие как куки, добавили состояние. Эти дополнения не являются частью "основной" спецификации HTTP 1. Вот почему HTTP 1 считается протоколом без сохранения состояния, хотя на практике это не так. HTTP / 2, с другой стороны, был разработан с запеченными компонентами с отслеживанием состояния. Никаких дополнений не требовалось, чтобы соответствовать требованию быть помеченным как «сохраняющее состояние».
Zamicol

Ответы:

130

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

Что касается HTTP, то все они все еще являются отдельными запросами и должны содержать достаточно информации для выполнения запроса. В этом суть "безгражданства". Запросы не будут связаны друг с другом, если отсутствует какая-либо общая информация, о которой знает сервер, которая в большинстве случаев является идентификатором сеанса в файле cookie.

Chao
источник
1
Что происходит, когда сервер запоминает сеанс (на стороне сервера) и настраивает взаимодействие с пользователем в соответствии с ним?
NurShomik
3
@NurShomik: См stackoverflow.com/a/3521393/319403 для объяснения того , как сеансы обычно работают.
cHao
12
@Andrew: HTTP не «построен на» TCP, а состояние TCP не HTTP. Это два совершенно разных протокола на разных уровнях стека. Вы можете использовать HTTP по именованным каналам, если хотите, или даже отправлять файлы, если у вас достаточно мазохистов, чтобы согласиться на это, и это будет работать именно потому, что HTTP не зависит от транспортного протокола. На этом уровне все это просто запросы и ответы. Это делает сам HTTP без сохранения состояния независимо от того, какое состояние может использоваться / поддерживаться / требоваться протоколами более низкого или более высокого уровня.
Чао
@cHao Хорошо, я уступлю. Если мы определяем безгражданство как «не обязательно иметь состояние, чтобы работать» (см. Ответ dimo414 ниже, перечисляющий варианты состояния в HTTP, цитируемом из Википедии), и если мы рассматриваем каждый протокол строго сам по себе, а не на основе нижележащих уровней тогда да, я могу согласиться с тем, что HTTP "без сохранения состояния".
Эндрю
101

Из Википедии :

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

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

  • использование HTTP-файлов cookie.
  • сеансы на стороне сервера,
  • скрытые переменные (когда текущая страница содержит форму), и
  • Перезапись URL с использованием параметров в кодировке URI, например, /index.php?session_id=some_unique_session_code.

Что делает протокол не имеющим состояния, так это то, что серверу не требуется отслеживать состояние по нескольким запросам, а не то, что он не может этого делать, если хочет. Это упрощает контракт между клиентом и сервером и во многих случаях (например, обслуживание статических данных по CDN) сводит к минимуму объем данных, которые необходимо передать. Если бы серверам требовалось поддерживать состояние посещений клиентов, структура выдачи и ответа на запросы была бы более сложной. Как таковая, простота модели - одна из ее главных особенностей.

dimo414
источник
21

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

HTTP - это протокол без сохранения состояния, который означает, что соединение между браузером и сервером теряется после завершения транзакции.

Рахул Трипати
источник
2
Но HTTP может сохранять информацию на сервере, используя куки. HTTP с поддержкой активности не закрывает соединение при каждом запросе.
Хосе Нобиле
3
Проверьте эту статью: - ecst.csuchico.edu/~amk/foo/advjava/notes/servlets/Cookies.html
Рахул Трипати
18
Сохранение информации на сервере не означает, что соединение постоянно работает.
Сриян
1
@srijan Ну нет. Так? Никто не утверждал иначе.
Марк Амери
10

HTTP вызывается как, stateless protocolпотому что каждый запрос выполняется независимо, без каких-либо сведений о запросах, которые были выполнены до него, что означает, что после завершения транзакции соединение между браузером и сервером также теряется.

Протокол делает то, statelessчто в своем первоначальном дизайне HTTP является относительно простым file transfer protocol:

  1. сделать запрос на файл с именем URL,
  2. получить файл в ответ,
  3. Отключить.

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

оборота Mobeen Sarwar
источник
3

Если протокол HTTP задан как полный протокол State, окно браузера использует одно соединение для связи с веб-сервером для множественного запроса, переданного веб-приложению. Это дает возможность окну браузера на длительное время устанавливать соединения между окном браузера и веб-серверами и сохранять они находятся в состоянии ожидания в течение длительного времени. Это может создать ситуацию достижения максимальных подключений веб-сервера, даже если большинство подключений в клиентах не используются.

Раджасехар Редди
источник
1
У HTTP уже есть keep-alive, это означает, что сервер не закрывает соединение, и клиент может сделать много запросов по одному и тому же соединению.
Хосе Нобиле
3

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

user3496740
источник
1

Что такое безгражданство ??

Как только запрос сделан и ответ возвращен клиенту, соединение будет разорвано или прервано. Сервер забудет все о запрашивающей стороне.

Почему без гражданства ??

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

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

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

Чираг Сони
источник
1

HTTPбез гражданства TCPС состоянием. Нет так называемого HTTP connection, но только HTTP requestи HTTP response. Нам не нужно ничего поддерживать, чтобы сделать другое HTTP request. Заголовок соединения, который является «keep-alive», означает, что TCPон будет повторно использоваться последующими HTTPзапросами и ответами, вместо того, чтобы постоянно разъединять и восстанавливать TCPсоединение.

Xing
источник
0

Я думаю, что кто-то выбрал очень неудачное название для концепции STATELESS, и поэтому все недоразумение вызвано. Речь идет не о хранении каких-либо ресурсов, а скорее об отношениях между клиентом и сервером.

Клиент: Я держу все ресурсы на своей стороне и высылаю вам «список» всех важных предметов, которые необходимо обработать. Делать свою работу.

Сервер: Хорошо, позвольте мне взять на себя ответственность за фильтрацию того, что важно, чтобы дать вам правильный ответ.

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

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3

JacobTheKnitter
источник