Я никогда об этом не думал, но теперь мне интересно узнать о нескольких основных вещах, которые лежат за кулисами. 1) Закрывает ли веб-сервер соединение после каждого запроса? 2) Когда у меня открыто несколько окон браузера и все они запрашивают данные с какого-то веб-сервера, использует ли веб-сервер какой-то стандартный сокет-коммуникационный интерфейс, чтобы распознать, какое соединение что запрашивало? 3) Что делать, если пользователей больше, чем свободных портов (скажем, 66 тыс. одновременно запрашивают что-то)
Спасибо :)
решение1
- Зависит от того, какую версию HTTP использует запрос. Соединения HTTP 1.0 закрываются немедленно, когда сервер заканчивает отправлять ответ обратно пользовательскому агенту. В HTTP1.1 добавлена поддержка keepalives, которая позволяет сокетному соединению оставаться открытым после того, как ответ был возвращен пользовательскому агенту. В этом случае заголовок HTTP Connection: Keep-Alive отправляется пользовательским агентом, указывая, что он хочет сохранить открытое соединение, подразумевая, что он собирается отправлять больше запросов.
- Да. Это базовая функциональность сокета. Клиент открывает сокет на (обычно высоком) неиспользуемом локальном порту и пытается открыть соединение с определенным портом назначения (например, 80 для HTTP) на удаленном хосте. Каждое другое соединение, создаваемое клиентом, открывает локальный сокет на другом порту, но все равно может попытаться установить соединение на том же порту на удаленном хосте.
- Процесс прослушивателя на сервере будет порождать рабочие процессы для обработки нескольких входящих запросов, оставляя прослушивателю возможность обрабатывать входящие запросы. Большинство http-серверов будут иметь опцию конфигурации для управления количеством одновременных запросов для обработки.
решение2
1) Обычно каждый запрос страницы ограничивается одним открытым и закрытым соединением.
2) Ваш компьютер меняет свой исходный порт для каждого запроса, который он делает. Сервер использует комбинацию IP/исходного порта, чтобы отслеживать, какие запросы пришли с каких хостов
3) Ну, сервер отвечает на все HTTP-запросы на порту 80. Но что касается клиентов, если вы можете сгенерировать 66 тыс. запросов от одного клиента одновременно, у вас могут возникнуть проблемы, в этом я не уверен.
решение3
1) Keepalive поддерживается большинством современных веб-серверов, поэтому, если браузер его поддерживает, веб-сервер будет обрабатывать более одного запроса на соединение.
http://en.wikipedia.org/wiki/HTTP_persistent_connection
2) Да, каждое соединение получает свой собственный сокет, представляющий собой пару IP:PORT.
http://en.wikipedia.org/wiki/TCP_sockets
3) Если у вас есть 65 535 человек, одновременно запрашивающих один сервер, вам нужно сделать шаг назад и подумать, что вы делаете! :) Серьезно, если вам не очень повезет, вы почувствуете необходимость в балансировке нагрузки до того, как столкнетесь с этой проблемой. Проблема, с которой вы можете столкнуться раньше, — это исчерпание дескрипторов файлов. Значение по умолчанию в bash — 1024 (см. «ulimit» на странице руководства bash).