O kernel do Linux aloca porta TCP gratuita com base no endereço IP?

O kernel do Linux aloca porta TCP gratuita com base no endereço IP?

Esta é uma questão hipotética, apenas para me ajudar a entender mais sobre como funcionam as portas TCP.

Suponha que eu tenha várias placas Ethernet em minha máquina e elas estejam conectadas a diferentes sub-redes. Agora, se eu quiser me conectar a uma máquina remota via TCP, sem vincular o endereço/porta local, o kernel determinará o endereço IP e a porta para mim.

Meu entendimento é que o kernel escolherá o endereço IP com base no IP primário da interface, onde a interface é escolhida de acordo com a tabela de roteamento.

Para a parte da porta TCP, o kernel encontrará uma porta não utilizada (efêmera) para mim. A questão é: o kernel mantém as portas TCP usadas por endereço IP ou NÃO? Ou seja, se eu usei a porta a.b.c.d:12345(suponha que seja o IP da interface A) e agora um pacote deva sair da interface B, posso usar e.f.g.h:12345(suponha que seja o IP da interface B)?

Posso pensar em argumentos para qualquer um dos lados. Como uma conexão TCP estabelecida é identificada pela tupla IP/porta 4 local/remota, parece que a resposta é yes: posso usar a porta 12345novamente. No entanto, o kernel não conhece as informações de roteamento (daí a interface, daí o IP de origem) ao preparar a camada TCP, então seria impossível para o kernel atribuir uma porta TCP livre dependente de IP na camada TCP, antes de ir até a camada IP.

A função do núcleoinet_csk_get_portverifica a hinfo->bhashtabela, que usa apenas o número da porta para chaves hash. Isso significa que as portas efêmeras são globalmente únicas e, se isso for verdade, parece um (um pouco) desperdício de recursos, para máquinas com várias placas de rede no . Perdi alguns fatos importantes aqui? Espero que alguém possa me ajudar a esclarecer isso. Obrigado!

informação relacionada