#apache #http #webserver
#apache #http #веб-сервер
Вопрос:
Если веб-сервер обрабатывает трафик на порту 80, каждый клиент должен установить соединение между собой и сервером на этом порту. Предполагая, что клиент поддерживает соединение, как сервер может параллельно обслуживать других клиентов?
Сервер немедленно прерывает соединение с клиентом после запроса? Или веб-серверы динамически генерируют новые порты для использования клиентами, чтобы порт 80 был свободен для новых подключений?
Ответ №1:
Порт — это один конец канала связи.
Инициалы сервера настраивают прослушивающий порт (80 в случае HTTPS-сервера). Клиент создает порт (операционная система назначит ему случайный доступный номер порта) и подключается к прослушивающему порту. В этот момент канал связи однозначно описывается IP-адресом сервера, портом 80 на сервере и IP-адресом клиента вместе с номером порта клиента. Если вы посмотрите на вывод netstat
, вы увидите множество сокетов / портов на разных этапах подключения:
symcbean@skynet ~ $ netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.202:47206 stackoverflow.com:https ESTABLISHED
tcp 0 1 192.168.1.202:50894 aba1c1ff9d2ec5376.:smtp SYN_SENT
tcp 0 0 192.168.1.202:47210 stackoverflow.com:https ESTABLISHED
tcp 0 0 192.168.1.202:60806 ec2-34-213-90-136:https ESTABLISHED
tcp 0 0 192.168.1.202:51124 151.101.1.69:https ESTABLISHED
tcp 0 0 192.168.1.202:34784 i0.wp.com:https ESTABLISHED
tcp 0 0 192.168.1.202:54082 lhr25s14-in-f10.1:https ESTABLISHED
tcp 0 0 192.168.1.202:38412 172-155-250-212.s:https ESTABLISHED
То, как сервер обрабатывает одновременное взаимодействие по нескольким каналам, варьируется. Я никогда не сталкивался с сервером, который одновременно обрабатывает только одно соединение.
На (предварительном) веб-сервере Apache процесс, открывший прослушивающий сокет, отключает соединение с уже существующим дочерним процессом для обработки. Некоторые серверы выполняются как единый процесс, но с несколькими потоками выполнения. Некоторые (такие как nginx и lighthttpd) выполняются как единый поток и сначала обращают внимание на канал, отправляющий данные.