Ответ 1
HTTP - фактический транспортный протокол между сервером и клиентом - является "без гражданства", потому что он ничего не помнит между вызовами. КАЖДЫЙ ресурс, доступ к которому осуществляется через HTTP, представляет собой один запрос без поточного соединения между ними. Если вы загружаете веб-страницу с HTML файлом, который внутри него содержит три тега <img>
, попадающих на один и тот же сервер, будет установлено и открыто четыре TCP-соединения, четыре передачи данных, четыре соединения закрыты. На сервере нет уровня на уровне протокола, на котором сервер будет знать что-либо о вас, когда вы входите.
(Ну, это правда для HTTP до 1.0 во всяком случае. HTTP 1.1 добавляет постоянные механизмы соединения разного рода из-за неизбежных проблем с производительностью, которые порождает подлинный протокол без гражданства. 't действительно делают HTTP stateful, они просто делают его грязным-без гражданства, а не чистым-без гражданства.)
Чтобы помочь вам понять разницу, представьте, что протокол, такой как Telnet или SSH, был апатридом. Если вы хотите получить список каталогов удаленного файла, вам нужно как одну атомную операцию подключиться, войти в систему, перейти в каталог и выдать команду ls
. Когда команда ls
завершила отображение содержимого каталога, соединение закроется. Если вам нужно отобразить содержимое определенного файла, вам нужно будет снова подключиться, войти в систему, перейти в каталог и теперь выпустить команду cat
. Когда команда, отображающая файл, завершится, соединение снова закроется.
Когда вы смотрите на это так, хотя объектив Telnet/SSH звучит довольно глупо, не так ли? Ну, в некотором смысле это так и в некотором роде это не так. Когда протокол не имеет статуса, сервер может сделать некоторые довольно хорошие оптимизации, и данные могут быть легко распространены. Серверы, использующие протоколы без учета состояния, могут масштабироваться очень эффективно, поэтому, в то время как фактическая передача отдельных данных может быть очень медленной (открытие и закрытие TCP-соединений НЕ дешево!), Общая система может быть очень, очень эффективной и масштабироваться для любого числа пользователей.
Но...
Почти все, что вы хотите сделать, кроме просмотра статических веб-страниц, будет включать сеансы и состояния. Когда HTTP используется для своей первоначальной цели (обмена статической информацией, такой как научные статьи), протокол без сохранения состояния имеет большой смысл. Когда вы начинаете использовать его для таких вещей, как веб-приложения, интернет-магазины и т.д., Тогда безгражданство начинает беспокоиться, потому что это по сути своей действия, связанные с состоянием. В результате люди очень быстро придумали способы наложения состояния поверх протокола без гражданства. Эти механизмы включают в себя такие вещи, как куки файлы, такие как состояние кодирования в URL-адресах, и что сервер динамически запускает данные на основе таких, как скрытые запросы штата, например... ну, как и вся куча вещей вплоть до более современных такие вещи, как веб-сокеты.
Вот несколько ссылок, которые вы можете использовать, чтобы получить более глубокое понимание понятий: