TCP-сокеты спроектированы с учетом состояния, поэтому в целом они используются для идентификации сеансов. Протоколы вроде SSH и ftp делают именно это.
HTTP разработан так, что он не имеет состояния, и каждое соединение связано только с ресурсом, который нужно загрузить. После загрузки ресурса сокет TCP, на котором работает HTTP-запрос, закрывается. Первоначальной причиной этого была простота. Но побочным эффектом является то, что HTTP-серверы, на которых работают современные веб-сайты, могут обрабатывать гораздо больше пользователей, чем серверы на основе сокетов, такие как SSH или ftp.
Поэтому сокеты не могут быть использованы, потому что HTTP закроет сокет после загрузки веб-страницы.
Конечно, говорить, что HTTP закроет сокет для каждого ресурса, слишком упрощенно, потому что в HTTP есть такие функции, как конвейерная передача и постоянные соединения, которые могут загружать несколько ресурсов на сокет. Но это только оптимизация. После того, как все загрузится, ваш браузер закроет сокет через некоторое время.
Первоначально HTTP был разработан как простой протокол для загрузки файлов HTML. Старые браузеры также могут загружать HTML-файлы из других протоколов, таких как Gopher и ftp. Таким образом, не было никаких причин делать HTTP сохраняющим состояние, потому что HTML-файлы - это просто текстовые файлы.
Как только веб-формы были введены и HTML-страницы могут отправлять данные обратно на сервер, веб-страницы начали нуждаться в сеансах. Таким образом, файлы cookie были созданы для повторного введения состояния в протокол без сохранения состояния, который передается через уровень передачи с отслеживанием состояния, который передается через сетевой уровень без сохранения состояния. Итак, полные прикладные уровни:
- Ethernet, Wifi и т. Д. = Без сохранения состояния
- IP = без гражданства
- TCP = с состоянием
- HTTP = без состояния
- HTTP + куки = с состоянием
В наши дни у нас есть веб-сокеты, которые могут хранить один открытый сокет от вашей веб-страницы до сервера. Таким образом, с веб-сокетами вы снова можете использовать сокеты для идентификации пользователя, потому что веб-сокет сам по себе является состоянием. Но в большинстве случаев вам все равно понадобится файл cookie для главной html-страницы, которая загружает JavaScript, запускающий веб-сокет.