Qualquer conexão TCP é identificada pela tupla de 4 números:
source_ip, source_port, target_ip, target_port
É necessário apenas que a combinação dos 4 números seja única. Para o servidor da web em nosso exemplo, target_ip
seria o endereço IP público desse servidor e target_port
seria 80
(ou 443
para HTTPS).
Para responder à sua pergunta: o servidor NÃO escolhe uma nova porta ao responder a uma conexão - ela está sempre ouvindo na porta 80
, mas o cliente seleciona a porta no lado do cliente!
Por exemplo, suponha que tenhamos um servidor Web com endereço IP público 10.0.0.1
e clientes 192.168.1.1
, 192.168.1.2
e 192.168.1.3
. Se a conexão do cliente para o servidor ainda estiver ativa, netstat -4n
imprimiria algo assim:
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
Como você pode ver, é bem possível que 2 clientes diferentes tenham o mesmo número de porta ( 49166
) do lado deles - não há nada de errado com isso.
Em outras palavras, o servidor da Web continua falando sobre a conexão TCP original à qual o cliente se conectou (porta 80
) até que a conversa seja concluída e a conexão seja fechada. Todos os pacotes de resposta do servidor da web são enviados de volta usando tupla (source_ip, source_port)
como endereço de destino e (target_ip, target_port)
como endereço de origem.