HTTP называется без сохранения состояния. Это означает, что для передачи данных не нужно хранить информацию.
Но HTTP использует TCP, который ориентирован на состояние.
Если это так, как HTTP становится без сохранения состояния?
HTTP называется без сохранения состояния. Это означает, что для передачи данных не нужно хранить информацию.
Но HTTP использует TCP, который ориентирован на состояние.
Если это так, как HTTP становится без сохранения состояния?
Ответы:
HTTP не заботится и не зависит ни от каких протоколов более низкого уровня, используемых для транспортировки самого себя, даже если сам он не имеет состояния.
Транспортной технологией может быть TCP, или старый SPX Novell, или SCTP, или что-то еще, что вы можете придумать, и HTTP все равно будет работать так же. HTTP требует потокового или ориентированного на соединение протокола - и зависит от разрешаемых URL-адресов - но ему все равно, как это сделать.
Это одна из причин, по которой существует многоуровневая модель или сетевой стек: прикладному уровню не нужно заниматься нижними уровнями.
Тот факт, что протокол нижнего уровня является состоящим из состояния, не означает, что что-либо поверх него автоматически становится состоящим или требует наличия состояния.
Сам HTTP не имеет состояния. Это означает, что приложения должны реализовать другой уровень поверх HTTP для установления состояния. Обычно это делается с помощью файлов cookie сеанса.
«HTTP не имеет состояния» означает, что каждая транзакция HTTP (пара запрос-ответ) может обрабатываться независимо от любого состояния из предыдущей пары запрос-ответ.
Чтобы транспортировать конкретную пару запрос-ответ, вам нужен протокол, который может переносить туда как угодно большой блок, так и произвольно большой блок, и для этого на уровне с ограниченным размером пакета протокол TCP должен быть с состоянием.
Но за границей транзакции нет государства. Клиент может сбросить соединение и установить новое для следующего запроса. Фактически это был единственный вариант в ранних версиях, и он все еще работает так, если клиент не включает Connection: keep-alive
заголовок.
Следующий запрос также может быть легко обработан другим сервером, и клиент никогда не узнает, потому что серверу не нужно поддерживать какое-либо состояние (если только приложение не добавляет свое собственное состояние поверх HTTP, обычно в форме сеанса; последующие осложнения в распределении нагрузки это наказание за создание протокола HTTP с отслеживанием состояния). Это используется для балансировки нагрузки на занятых серверах.
can also easily be handled by different server and the client will never know
Хотя это технически верно, это вводит в заблуждение, поскольку многие веб-приложения используют липкие сеансы, требуя балансировщика нагрузки для маршрутизации будущих запросов из того же сеанса просмотра на тот же сервер. С точки зрения HTTP, сеансы не имеют значения, но ваше последнее предложение как бы подразумевает, что взаимодействие с конечным пользователем не будет затронуто, что было бы неверно для липких сеансов.
Природа HTTP без состояния означает, что на этом уровне информация о состоянии не создается и не используется.
Вы можете увидеть это в нескольких случаях, например, в HTTP-аутентификации, учетные данные отправляются с каждым запросом, а постоянные соединения - это просто оптимизация (т. Е. Если я отправляю учетные данные, сервер забывает их после запроса, даже если он выходит соединение открыто).
В отличие от этого, механизмы входа в систему на основе файлов cookie сохраняют состояние, но не являются частью HTTP.
Вы должны понимать это как набор русских кукол (или коробок, если хотите), каждая из которых несет в себе еще одну, вот в общем-то, как это работает: TCP переносит HTTP «внутрь», но его это не волнует или его особенности.
Чтобы получить полную картину, я рекомендую прочесть о модели OSI, поскольку она более понятна.
TCP находится на несколько уровней ниже HTTP в модели OSI, фактически каждый уровень соответствует своему протоколу.
В нашем случае HTTP находится на уровне представления и приложения, а TCP - на транспортном уровне. Или, если вы используете модель TCP / IP, протоколы TCP и IP располагаются на уровне сетевого соединения, а HTTP - на уровне приложений и представления.