Как HTTP становится без сохранения состояния?

26

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

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

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

муравьев
источник
6
Как это не повторяется через 5 лет после запуска Super User?
Питер Мортенсен
Потому что большинство дупов на StackOverflow? Я просто догадываюсь.
trysis
8
Тот факт, что он проходит через кабели (помимо прочего), также не делает его электрическим протоколом
Хаген фон Айцен

Ответы:

42

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

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

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

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

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

LawrenceC
источник
1
Маршрутизация происходит на уровне TCP / IP.
Fiasco Labs
3
Это изображение объясняет это красиво. vichargrave.com/wp-content/uploads/2013/01/…
JakeGould
2
По совпадению, тот факт, что HTTP игнорирует состояние основного соединения (которое почти всегда будет TCP), является одним из основных недостатков производительности, которые пытаются устранить различные подходы HTTP2 .
Сколима
2
@ Fiasco: Строго говоря, маршрутизация происходит на уровне IP. Маршрутизация основана на интернет-адресах, информация из уровня TCP не используется в базовой маршрутизации.
RedGrittyBrick
1
@skolima: с другой стороны, безгражданство является причиной, по которой HTTP является наиболее масштабируемым и надежным протоколом в широком использовании. HTTP всегда был специально разработан для масштабируемости, а не производительности (да, это разные вещи), поэтому, если вы считаете, что вам нужна жесткая низкая задержка, вы либо используете неправильный протокол, либо используете протокол неправильно. В то время как HTTP2 намеревается улучшить производительность, он делает это таким образом, который остается верным безгражданству. При использовании для того, для чего он предназначен, я никогда не видел, чтобы безгражданство являлось узким местом хорошо разработанного HTTP-приложения.
Ли Райан
10

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

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

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

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

Ян Худек
источник
can also easily be handled by different server and the client will never knowХотя это технически верно, это вводит в заблуждение, поскольку многие веб-приложения используют липкие сеансы, требуя балансировщика нагрузки для маршрутизации будущих запросов из того же сеанса просмотра на тот же сервер. С точки зрения HTTP, сеансы не имеют значения, но ваше последнее предложение как бы подразумевает, что взаимодействие с конечным пользователем не будет затронуто, что было бы неверно для липких сеансов.
Брэндон
1
@Brandon: Такие приложения создают протокол с отслеживанием состояния поверх HTTP, и это их наказание за это!
Ян Худек
@Brandon: множество серверов с балансировкой нагрузки, таких как gmail, не отправляют запросы обратно на один и тот же сервер. Вместо этого сеанс хранится в общей базе данных, к которой могут получить доступ все серверы кластера. Таким образом, состояние обрабатывается не сервером, а базой данных.
Slebetman
@ Slebetman: Да, что угодно. Сам по себе HTTP не имеет такого состояния, поэтому для HTTP это просто. Если приложение добавляет свое собственное состояние, это его борьба.
Ян Худек
Хорошо, я не сказал все. Я сказал некоторые. Лично я предпочитаю избегать липких сессий и, если возможно, вообще избегать сессий. Тем не менее, существует программное обеспечение, которое не соответствует идеалу каждого.
Брэндон
2

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

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

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

Саймон Рихтер
источник
1

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

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

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

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

runlevel0
источник
1
Проблема с моделью OSI состоит в том, что она теперь теоретическая (были реальные попытки реализовать ее, но они потерпели неудачу на рынке из-за их сложности). В действительности между TCP и HTTP нет никаких слоев. Кроме того, уровень представления будет HTML, а не HTTP.
MSalters
В модели TCP / IP TCP не живет на сетевом уровне. Он живет на транспортном уровне поверх IP, который позже будет в сети. Первый хит Google для «модели TCP» демонстрирует это: technet.microsoft.com/en-us/library/cc786900(v=ws.10).aspx
Брэндон
@MSalters: TLS - это не слой?
благодарность
1
@MSalters: Вы понимаете, что HTTPS - это просто имя, данное HTTP, который транслируется по TLS? Таким образом, TLS представляет собой слой под HTTP, а поверх TCP и TLS / SSL + HTTP комбинированный компонент называется HTTPS.
Slebetman
1
Также есть еще одно новое имя для TLS / HTTP. Если TLS, который переносит трафик HTTP, реализует виртуальное мультиплексирование сокетов / потоков, это называется SPDY (но URL-адрес в вашем браузере по-прежнему HTTPS).
Slebetman