Скажем, у меня процесс веб-сервера прослушивает порт 80. Когда клиент посещает этот сайт, сервер выберет новый порт для установления соединения для передачи данных или просто использует порт 80? Используйте настройки по умолчанию apache, lighttpd или nginx.
1 ответ
Любое TCP-соединение идентифицируется кортежем из 4 чисел:
source_ip, source_port, target_ip, target_port
Требуется только, чтобы комбинация всех 4 чисел была уникальной. Для веб-сервера в нашем примере target_ip
будет публичным IP-адресом этого сервера, а target_port
будет 80
(или 443
для HTTPS).
Чтобы ответить на ваш вопрос: сервер НЕ выбирает новый порт при ответе на соединение - он всегда прослушивает порт 80
, но клиент делает выбор порта на стороне клиента!
Например, предположим, что у нас есть веб-сервер с публичным IP-адресом 10.0.0.1
и клиенты 192.168.1.1
, 192.168.1.2
и 192.168.1.3
. Если соединение от клиента к серверу все еще активно, netstat -4n
напечатает что-то вроде этого:
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.0.0.1:80 192.168.1.1:65510 ESTABLISHED
tcp 0 0 10.0.0.1:80 192.168.1.2:49166 ESTABLISHED
tcp 0 0 10.0.0.1:80 192.168.1.3:49166 ESTABLISHED
Как видите, вполне возможно, что 2 разных клиента могут иметь одинаковый номер порта (49166
) на своей стороне - в этом нет ничего плохого.
Другими словами, веб-сервер продолжает говорить по исходному TCP-соединению, к которому подключен клиент (порт 80
), пока этот разговор не будет завершен и соединение не будет закрыто. Все ответные пакеты с веб-сервера отправляются обратно с использованием кортежа (source_ip, source_port)
качестве адреса назначения и (target_ip, target_port)
качестве адреса источника.