Почему говорится, что "HTTP - это протокол без сохранения состояния"?
HTTP имеет файлы cookie HTTP. Файлы cookie позволяют серверу отслеживать состояние пользователя, количество подключений, последнее подключение и т. Д.
HTTP имеет постоянные соединения (Keep-Alive), где несколько запросов могут быть отправлены с одного TCP-соединения.
8 ответов
Даже если несколько запросов могут быть отправлены через одно и то же соединение HTTP, сервер не придает особого значения их поступлению через один и тот же сокет. Это исключительно производительность, предназначенная для минимизации времени / полосы пропускания, которые в противном случае были бы потрачены на восстановление соединения для каждого запроса.
Что касается HTTP, то все они все еще являются отдельными запросами и должны содержать достаточно информации для выполнения запроса. В этом суть "безгражданства". Запросы не будут связаны друг с другом, если отсутствует какая-либо общая информация, о которой знает сервер, которая в большинстве случаев является идентификатором сеанса в файле cookie.
Из Википедии:
HTTP - это протокол без сохранения состояния. Протокол без сохранения состояния не требует, чтобы сервер сохранял информацию или статус о каждом пользователе в течение нескольких запросов.
Но некоторым веб-приложениям может потребоваться отслеживать продвижение пользователя от страницы к странице, например, когда веб-серверу требуется настроить содержимое веб-страницы для пользователя. Решения для этих случаев включают в себя:
- использование HTTP-файлов cookie.
- сеансы на стороне сервера,
- скрытые переменные (когда текущая страница содержит форму), и
- Перезапись URL с использованием параметров в кодировке URI, например, /index.php?session_id=some_unique_session_code.
Что делает протокол не имеющим состояния, так это то, что серверу не требуется отслеживать состояние по нескольким запросам, а не то, что он не может этого делать, если хочет. Это упрощает контракт между клиентом и сервером и во многих случаях (например, обслуживание статических данных по CDN) сводит к минимуму объем данных, которые необходимо передать. Если бы серверам требовалось поддерживать состояние посещений клиентов, структура выдачи и ответа на запросы была бы более сложной. Как таковая, простота модели - одна из ее главных особенностей.
HTTP называется протоколом без сохранения состояния, поскольку каждый запрос выполняется независимо, без каких-либо сведений о запросах, которые были выполнены до него, что означает, что после завершения транзакции соединение между браузером и сервером также теряется.
Что делает протокол без сохранения состояния, так это то, что в своем первоначальном варианте HTTP является относительно простым протоколом передачи файлов:
- сделать запрос на файл с именем URL,
- получить файл в ответ,
- Отключить.
Не было никакой связи между одним соединением и другим, даже от одного и того же клиента. Это упрощает контракт между клиентом и сервером и во многих случаях сводит к минимуму объем данных, которые необходимо передать.
Поскольку протокол без сохранения состояния не требует, чтобы сервер сохранял информацию о сеансе или статус о каждом коммуникационном партнере в течение нескольких запросов.
HTTP - это протокол без сохранения состояния, который означает, что соединение между браузером и сервером теряется после завершения транзакции.
Современный HTTP поддерживает состояние. Старый HTTP был без гражданства.
До того, как Netscape изобрела файлы cookie и HTTPS в 1994 году, http можно было рассматривать как апатрид. Со временем добавлялось все больше и больше аспектов с отслеживанием состояния по множеству причин, включая производительность и безопасность.
Хотя изначально HTTP 1 стремился к сохранению состояния, многие компоненты HTTP/2 являются самим определением состояния. HTTP/2 полностью отказался от любых целей без сохранения состояния.
Ни один разумный человек не может прочитать HTTP/2 RFC и подумать, что он не имеет состояния. Заблудшая старая догма "HTTP без сохранения состояния" ложна и далека от нынешней реальности HTTP с отслеживанием состояния.
Вот ограниченный, но не исчерпывающий список компонентов HTTP/1 и HTTP/2 с отслеживанием состояния:
- Файлы cookie, названные RFC "механизмом управления состоянием HTTP".
- HTTPS, в котором хранятся ключи в таком состоянии.
- HTTP-аутентификация требует состояния.
- Веб-хранилище.
- Кэширование HTTP с отслеживанием состояния.
- Сама цель идентификатора потока - состояние. Это даже в названии раздела RFC "Состояния потоков".
- Блоки заголовка, которые устанавливают идентификаторы потока, сохраняют состояние.
- Кадры, которые ссылаются на идентификаторы потока, сохраняют состояние.
- Сжатие заголовков, которое в HTTP RFC явно указано как с сохранением состояния, является с сохранением состояния.
- Оппортунистическое шифрование с отслеживанием состояния.
Раздел 5.1 HTTP/2 RFC - отличный пример механизмов с отслеживанием состояния, определенных стандартом HTTP/2.
Безопасно ли веб-приложениям рассматривать HTTP/2 как протокол без сохранения состояния?
HTTP/2 - это протокол с отслеживанием состояния, но это не означает, что ваше приложение HTTP/2 не может быть без состояния. Вы можете отказаться от использования определенных функций с отслеживанием состояния для приложений HTTP/2 без отслеживания состояния, используя только подмножество функций HTTP/2.
Файлы cookie и некоторые другие механизмы с отслеживанием состояния или менее очевидные механизмы с отслеживанием состояния являются более поздними дополнениями HTTP. Говорят, что HTTP 1 не имеет состояния, хотя на практике мы используем стандартизированные механизмы с отслеживанием состояния, такие как файлы cookie, TLS и кеширование. В отличие от HTTP/1, HTTP/2 с самого начала определяет компоненты с отслеживанием состояния в своем стандарте. Конкретное приложение HTTP/2 может использовать подмножество функций HTTP/2 для поддержания безгражданства, но сам протокол предполагает, что состояние будет нормой, а не исключением.
Существующие приложения, даже приложения HTTP 1, нуждающиеся в состоянии, выйдут из строя при попытке использовать их без сохранения состояния. Если файлы cookie отключены, может быть невозможно войти на некоторые веб-сайты HTTP/1.1, что нарушит работу приложения. Возможно, небезопасно предполагать, что конкретное приложение HTTP 1 не использует состояние. Для HTTP/2 это не исключение.
Скажи это со мной в последний раз:
HTTP/2 - это протокол с отслеживанием состояния.
HTTP не имеет состояния. TCP с состоянием. Нет так называемого "HTTP-соединения", но есть только "HTTP-запрос" и "HTTP-ответ". Нам не нужно ничего обслуживать, чтобы сделать еще один "HTTP-запрос". Заголовок соединения "keep-alive" означает, что TCP будет повторно использоваться последующими HTTP-запросами и ответами, вместо того, чтобы постоянно отключать и заново устанавливать TCP-соединение.
Если протокол HTTP задан как State full protocol, окно браузера использует одно соединение для связи с веб-сервером для многократного запроса к веб-приложению. Это дает возможность окну браузера на длительное время устанавливать соединения между окном браузера и веб-серверами и сохранять они находятся в состоянии ожидания в течение длительного времени. Это может создать ситуацию достижения максимальных подключений веб-сервера, даже если большинство подключений в клиентах не используются.
HTTP является без установления соединения, и это является прямым результатом того, что HTTP является протоколом без сохранения состояния. Сервер и клиент узнают друг друга только во время текущего запроса. После этого они оба забывают друг о друге. Из-за этой природы протокола ни клиент, ни браузер не могут сохранять информацию между различными запросами на веб-страницах.
Я думаю, что кто-то выбрал очень неудачное название для концепции БЕЗГРАЖДАННОСТИ, и поэтому возникло все недоразумение. Речь идет не о хранении каких-либо ресурсов, а о взаимоотношениях между клиентом и сервером.
Клиент: Я оставляю все ресурсы на своей стороне и отправляю вам "список" всех важных элементов, которые необходимо обработать. Делай свою работу.
Сервер: Хорошо... позвольте мне взять на себя ответственность за фильтрацию того, что важно, чтобы дать вам правильный ответ.
Это означает, что сервер является "рабом" клиента и должен забывать о своем "хозяине" после каждого запроса. На самом деле, БЕЗ ГОСУДАРСТВА относится только к состоянию сервера.
https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
Что такое безгражданство??
После того, как запрос сделан и ответ будет возвращен клиенту, соединение будет разорвано или прервано. Сервер забудет о запрашивающей стороне.
Почему без гражданства??
Интернет предпочитает протокол без сохранения состояния. Это был гениальный выбор, потому что первоначальная цель Интернета заключалась в том, чтобы позволить документам (веб-страницам) обслуживаться в очень большом количестве. людей, использующих очень простое оборудование для сервера.
Поддержание длительного соединения было бы чрезвычайно ресурсоемким.
Если бы Интернет был выбран протоколом с отслеживанием состояния, тогда нагрузка на сервер была бы увеличена, чтобы поддерживать соединение посетителя.
Отсутствие состояния говорит о том, что возможные состояния сервера также являются ресурсами, и им должны быть предоставлены свои собственные URI. Клиент не должен вводить сервер в определенное состояние, чтобы сделать его восприимчивым к определенному запросу.
Это не без гражданства. HTTP (обычно) построен поверх TCP, который является состоянием. Он поддерживает информацию о соединении, по крайней мере. Если бы он был построен на UDP, все было бы иначе.
Сказать, что HTTP не имеет состояния, это все равно, что сказать, что компьютерные программы не содержат электронов, потому что компьютеры, на которых они размещаются, используют электроны. Это чепуха. Точно так же вы не можете полностью отделить HTTP от TCP.