2011-02-06 3 views
31

Я изучаю java для Интернета, и он упоминает, что http не имеет гражданства. Что это значит и как это влияет на программированиеЧто это значит, когда говорят, что HTTP не имеет статуса

Я также изучал структуру весны, и там упоминается, что некоторые бобы должны объявляться как внутренние бобы по мере их изменения состояния. Что это значит?

+4

Дайте нам ссылку на бронирование/бумаги, вы изучаете. Я не понимаю, почему вы объединяете состояние сетевого протокола с состоянием объекта в одном вопросе? Где мы можем найти эту информацию о весенних бобах, о которой вы упомянули? – Ritesh

ответ

56

HTTP - это фактический транспортный протокол между сервером и клиентом - это «без гражданства», потому что он ничего не помнит между сеансами. КАЖДЫЙ Ресурс, доступ к которому осуществляется через HTTP, представляет собой единый запрос без поточного соединения между ними.Если вы загружаете веб-страницу с HTML-файлом, который внутри него содержит три тега <img>, попадающих на один и тот же сервер, будет установлено и открыто четыре TCP-соединения, четыре передачи данных, четыре соединения закрыты. Существует просто ни одно государство не хранится на сервере в протоколе уровень, который будет иметь сервер ничего знать о вас, как вы вошли.

(Ну, это верно для HTTP до 1,0 при любой скорости. HTTP 1.1 добавляет постоянные механизмы соединения разного рода из-за неизбежных проблем с производительностью, которые порождают поистине безгосударственный протокол. Мы будем игнорировать это на данный момент, потому что они на самом деле не делают HTTP stateful, они просто делают его грязным-без гражданства, stateless.)

Чтобы помочь вам разобраться в различии, представьте, что протокол, такой как Telnet или SSH, был апатридом. Если вы хотите получить список каталогов удаленного файла, вам нужно как одну операцию атома подключиться, войти в систему, перейти в каталог и выдать команду ls. Когда команда ls закончила отображение содержимого каталога, соединение закроется. Если вам нужно отобразить содержимое определенного файла, вам нужно будет снова подключиться, войти в систему, перейти в каталог и теперь выпустить команду cat. Когда команда, отображающая файл, будет завершена, соединение снова закроется.

Когда вы смотрите на него таким образом, хотя объектив Telnet/SSH звучит довольно глупо, не так ли? Ну, в некотором смысле это так и в некотором роде это не так. Когда протокол не имеет статуса, сервер может сделать некоторые довольно хорошие оптимизации, и данные могут быть легко распространены. Серверы, использующие протоколы без сохранения состояния, могут масштабироваться очень эффективно, поэтому, в то время как фактическая передача отдельных данных может быть очень медленной (открытие и закрытие TCP-соединений НЕ дешево!), Общая система может быть очень, очень эффективной и масштабироваться для любого числа пользователей.

Но ...

Почти все, что вы хотите сделать, кроме просмотра статических веб-страниц будет включать в себя сессии и государства. Когда HTTP используется для своей первоначальной цели (обмена статической информацией, такой как научные статьи), протокол без сохранения состояния имеет большой смысл. Когда вы начинаете использовать его для таких вещей, как веб-приложения, интернет-магазины и т. Д., Тогда безгражданство начинает беспокоиться, потому что это по сути своей действия, связанные с состоянием. В результате люди очень быстро придумали способы наложения состояния поверх протокола без гражданства. Эти механизмы включают в себя такие вещи, как куки-файлы, такие как состояние кодирования в URL-адресах, и что сервер динамически запускает данные на основе таких, как скрытые запросы штата, например ... ну, как и вся куча вещей вплоть до более современных таких как веб-сокеты.

Вот несколько ссылок, вы можете следовать, чтобы получить более глубокое понимание понятий:

+0

спасибо за полезные вещи, но предположим, что если http2.1 становится работоспособным, то как текущий сценарий chnage относительно отображения веб-страницы. я имею в виду, я хочу видеть diff сейчас, а затем –

+0

1.1, а не 2.1. ;) И, как я уже сказал, HTTP 1.1 на самом деле не годится. У этого есть несколько оптимизирующих трюков, которые позволяют повторно использовать подключения и т. Д. С точки зрения веб-браузера это означает, что ваши веб-сайты загружаются быстрее, потому что вам нужно только один раз согласовать TCP-соединение для этих файлов HTML + 3 изображения (чтобы использовать мои пример) вместо 4 раза. –

+1

почему они не могут сделать это сдержанным. есть ли какие-либо проблемы с программированием или это невозможно? –

4

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

Этот недостаток HTTP адресуется в ряде новых технологий, включая cookies.

+0

ActiveX, Java и Javascript не учитывают тот факт, что http не имеет гражданства, они используют файлы cookie, переписывают url и т. Д., Чтобы поддерживать состояние – Luis

10

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

Как правило, для сохранения состояния в веб-приложении используются файлы cookie.

+1

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

+1

@Name - [TCP] (http://en.wikipedia.org/wiki/Transmission_Control_Protocol) - это протокол, который сохраняет определенное состояние. – Oded

+1

Хотя не предназначенная сеть использует семейство протоколов XYZModem (XModem, YModem и т. Д.), Имеет статус stateful – alvaroc

3

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

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

На практике это fixed некоторыми серверами (большинство из них) с использованием файла отслеживания в запросе, чтобы соответствовать определенному состоянию на сервере с конкретным клиентом. Это работает, потому что способ работы cookie (они отправляются на сервер при каждом последующем запросе, как только они были установлены на клиенте).

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

Есть несколько других решений для отслеживания состояния (см. Файл с зашифрованным файлом в рельсах), но в основном, если вы хотите расти, вам нужно понять способ избежать отслеживания состояния на сервере :).

5

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

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

here

Смежные вопросы