Назад | Перейти на главную страницу

Общие вопросы о веб-сервере

Я никогда не задумывался об этом, но теперь меня интересуют несколько основных вещей за кулисами. 1) Закрывает ли веб-сервер соединение после каждого запроса? 2) Когда у меня открыто больше окон браузера и все данные запроса с какого-то веб-сервера, использует ли веб-сервер какой-то стандартный обмен данными через сокеты, чтобы распознать, какое соединение что запрашивало? 3) Что делать, если пользователей больше, чем свободных портов (скажем, 66k что-то запрашивают одновременно)

Спасибо :)

  1. Зависит от того, какую версию HTTP использует запрос. Соединения HTTP 1.0 закрываются немедленно, когда сервер завершает отправку ответа обратно пользовательскому агенту. HTTP1.1 добавил поддержку сообщений keepalive, которая позволяет соединению сокета оставаться открытым после того, как ответ был возвращен пользовательскому агенту. В этом случае HTTP-заголовок Connection: Keep-Alive отправляется пользовательским агентом, указывая на то, что он хочет поддерживать открытое соединение, подразумевая, что он будет отправлять больше запросов через.
  2. Да. Это базовая функциональность сокета. Клиент открывает сокет на (обычно высоком) неиспользуемом локальном порте и пытается открыть соединение с определенным портом назначения (например, 80 для HTTP) на удаленном хосте. Каждое другое соединение, создаваемое клиентом, открывает локальный сокет на другом порту, но все же может попытаться установить соединение на том же порту на удаленном узле.
  3. Процесс слушателя на сервере порождает рабочие процессы для обработки нескольких входящих запросов, оставляя слушателя свободным для обработки входящих запросов. Большинство HTTP-серверов имеют параметр конфигурации, позволяющий управлять количеством одновременных запросов для обработки.

1) Обычно каждый запрос страницы ограничивается одним открытым и закрытым соединением.

2) Ваш компьютер меняет исходный порт для каждого запроса. Сервер использует комбинацию IP / порта источника, чтобы отслеживать, какие запросы пришли с каких хостов.

3) Сервер отвечает на все HTTP-запросы через порт 80. Но что касается клиентов, если вы можете сгенерировать 66K запросов от одного клиента одновременно, у вас могут возникнуть проблемы, я не уверен в этом.

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).

http://en.wikipedia.org/wiki/File_descriptors