Как веб-сервер может обрабатывать сразу несколько входящих запросов пользователя на одном порту (80)? - программирование
Подтвердить что ты не робот

Как веб-сервер может обрабатывать сразу несколько входящих запросов пользователя на одном порту (80)?

Как веб-сервер обрабатывает несколько входящих запросов одновременно на одном порту (80)?

Пример: В то же время пользователи 300k хотят увидеть изображение с сайта www.abcdef.com, которому присвоен IP 10.10.100.100 и порт 80. Так как же www.abcdef.com справится с загрузкой входящих пользователей?

Может ли один сервер (который назначен IP 10.10.100.100) обрабатывать огромное количество входящих пользователей? Если нет, то как один IP-адрес может быть назначен нескольким серверам для обработки этой нагрузки?

4b9b3361

Ответ 1

Из tcpipguide

Это идентификация соединений с использованием как клиентских, так и серверных сокетов - это то, что обеспечивает гибкость в разрешении нескольких соединений между устройствами, которые мы считаем само собой разумеющимися в Интернете. Например, занятые серверные процессы приложений (например, веб-серверы) должны иметь возможность обрабатывать соединения от нескольких клиентов, или World Wide Web будет в значительной степени непригодным для использования. Поскольку соединение идентифицируется с использованием клиентского сокета, а также сервера, это не проблема. В то же время, когда веб-сервер поддерживает упомянутое выше соединение, он может легко иметь другое соединение, например, порт 2,199 по IP-адресу 219.31.0.44. Это представлено идентификатором соединения:

(41.199.222.3:80, 219.31.0.44:2199). 

Фактически, мы можем иметь несколько соединений от одного и того же клиента к одному и тому же серверу. Каждому процессу клиента будет присвоен другой номер эфемерного порта, поэтому даже если все они попытаются получить доступ к одному и тому же серверному процессу (например, к процессу веб-сервера по 41.199.222.3:80), все они будут иметь другое клиентское сокет и будут представлять уникальные соединения. Это позволяет вам делать несколько одновременных запросов на одном и том же веб-сайте с вашего компьютера.

Опять же, TCP отслеживает каждое из этих подключений независимо друг от друга, поэтому каждое соединение не знает других. TCP может обрабатывать сотни или даже тысячи одновременных подключений. Единственным ограничением является пропускная способность компьютера, на котором запущен TCP, и пропускная способность физических подключений к нему - чем больше подключений работает сразу, тем больше каждому приходится делиться ограниченными ресурсами.

Ответ 2

Порт - это просто волшебное число. Это не соответствует аппаратной части. Сервер открывает сокет, который "прослушивает" порт 80 и "принимает" новые соединения из этого сокета. Каждое новое соединение представлено новым сокетом, локальный порт которого также является портом 80, но чей удаленный ip: порт соответствует клиенту, который подключился. Поэтому их не путают. Поэтому вам не нужно несколько IP-адресов или даже несколько портов на сервере.

Ответ 3

TCP берет на себя идентификацию клиента
Как сказано в сообщении, TCP заботится о идентификации клиента, а сервер видит только "сокет" для каждого клиента.
Скажем, сервер на 10.10.100.100 прослушивает порт 80 для входящих TCP-соединений (HTTP построен поверх TCP). Клиентский браузер (в 10.9.8.7) подключается к серверу с помощью клиентского порта 27143. Сервер видит: "клиент 10.9.8.7:27143 хочет подключиться, вы принимаете?". Серверное приложение принимает и получает "дескриптор" (сокет) для управления всей связью с этим клиентом, и дескриптор всегда отправляет пакеты в 10.9.8.7:27143 с соответствующими заголовками TCP.

Пакеты никогда не выполняются одновременно
Теперь физически обычно есть только одно (или два) соединения, связывающие сервер с Интернетом, поэтому пакеты могут поступать только в последовательном порядке. Возникает вопрос: какова максимальная пропускная способность через волокно и сколько ответов сервер может вычислить и отправить в ответ. Помимо затрат времени на процессор или нехватки памяти при ответе на запросы, сервер также должен поддерживать некоторые ресурсы (по крайней мере, 1 активный сокет на одного клиента) до тех пор, пока связь не закончится и, следовательно, не будет потреблять ОЗУ. Пропускная способность достигается с помощью некоторых оптимизаций (не взаимоисключающих): неблокирующие сокеты (во избежание задержек конвейеризации/сокетов), многопоточность (для использования большего количества ядер или потоков ЦП).

Улучшение производительности запросов: балансировка нагрузки
И, наконец, сервер на "лицевой стороне" веб-сайтов, как правило, не выполняет всю работу самостоятельно (особенно более сложные вещи, такие как запросы к базе данных, вычисления и т.д.) И откладывает задачи или даже перенаправляет HTTP-запросы на распределенные серверы, в то время как они продолжают обрабатывать тривиально (например, переадресацию) столько запросов в секунду, сколько могут. Распределение работы над несколькими серверами называется балансировкой нагрузки.

Ответ 4

Ответ: виртуальные хосты, в заголовке HTTP это имя домена, поэтому веб-сервер знает, какие файлы запускать или отправлять клиенту

Ответ 5

1) Как веб-сервер обрабатывает несколько входящих запросов одновременно на одном порту (80)
 ==> a) один экземпляр веб-службы (пример: микропроцессор с весенней загрузкой) запускается/прослушивает сервер на компьютере с портом 80.
   б) Для этого веб-сервиса (Spring boot app) нужен контейнер сервлетов, такой как в основном tomcat.
      В этом контейнере будет настроен пул потоков.
   c) когда запрос поступит от разных пользователей одновременно, этот контейнер будет
      назначьте каждый поток из пула для каждого из входящих запросов.
   d) Поскольку код веб-службы на стороне сервера будет содержать bean-компоненты (в случае java) в основном
      singleton, каждый поток, связанный с каждым запросом, будет вызывать API Singleton
      и если есть необходимость в доступе к базе данных, то синхронизация этих
      нужны потоки, что делается через аннотацию @transactional. Это
      аннотация синхронизирует работу базы данных.

       2) Может ли один сервер (которому назначен IP 10.10.100.100) обрабатывать это огромное количество входящих пользователей?
Если нет, то как можно назначить один IP-адрес более чем одному серверу для обработки этой нагрузки?
==> Об этом позаботится loadbalancer вместе с маршрутизацией