Как сервер может обрабатывать много соединений порта 80
По общему признанию, это простой вопрос, но 20 минут поиска в Google, и я просто не могу найти ответ... Я приведу свой вопрос в качестве примера.
скажем, у меня есть www.reallypopular.com, и мой сайт видит 100 запросов GET в секунду. Также предположим, что среднее время ответа моего сервера на этот запрос GET составляет 1 секунду (для примера просто предположим некоторую обработку на стороне сервера). Мое понимание портов будет означать, что первый клиент, который будет связываться с моим сервером, затем заблокирует кто-нибудь еще от подключения к порту 80 в течение 1 секунды. Следуя этой логике, фактически только 1% всех пользователей будут фактически отвечать, а остальные получат "Порт занят" или "Не отвечает" или какую-то подобную ошибку.
Очевидно, что я что-то упускаю, потому что это явно не то, что происходит, поэтому вместо того, чтобы предлагать свои теории относительно того, почему я хотел бы это сделать, если бы кто-то мог указать мне прямо здесь или указать на то, что я мог бы прочитать, чтобы прояснить это. Большое спасибо.
3 ответа
Ответ можно найти в этой статье в Википедии:
Приложения, реализующие общие службы, часто используют специально зарезервированные, хорошо известные номера портов для получения запросов на обслуживание от клиентских хостов. Этот процесс называется прослушиванием и включает в себя получение запроса по общеизвестному порту и восстановление связи один-к-одному между сервером и клиентом по другому частному порту, чтобы другие клиенты могли также связаться с общеизвестным портом обслуживания.
Кроме того, из этой статьи о сокетах Беркли в Википедии.
Когда приложение ожидает потоковые соединения от других хостов, оно уведомляется о таких событиях (см. Функцию select()) и должно инициализировать соединение с помощью функции accept(). Accept() создает новый сокет для каждого соединения и удаляет соединение из очереди прослушивания.
Когда клиент подключается и TCP-сервер принимает подключение, на сервере создается новый сокет для связи с этим клиентом. Исходный прослушивающий сокет продолжает прослушивать новые запросы, а новый сокет используется для отправки и получения от определенного клиента. Обратите внимание, что TCP-сервер с N активными клиентами будет иметь N сокетов для чтения / записи для каждого клиента, в дополнение к основному сокету прослушивания. Предполагается, что все эти сокеты N+1 находятся на одном и том же номере порта (общеизвестный номер порта сервера), но они имеют разные дескрипторы файлов сокетов внутри кода сервера.
TCP не работает таким образом. Подключение к порту из другой системы не означает, что порт не может принимать другие подключения. Из статьи в Википедии по TCP:
Поступающие TCP-пакеты данных идентифицируются как принадлежащие определенному TCP-соединению по его сокетам, то есть по комбинации адреса узла источника, порта источника, адреса узла назначения и порта назначения.