¿El kernel de Linux asigna un puerto TCP libre según la dirección IP?

¿El kernel de Linux asigna un puerto TCP libre según la dirección IP?

Esta es una pregunta hipotética, sólo para ayudarme a comprender mejor cómo funcionan los puertos TCP.

Supongamos que tengo varias tarjetas Ethernet en mi máquina y están conectadas a diferentes subredes. Ahora, si quiero conectarme a una máquina remota a través de TCP, sin vincular la dirección/puerto local, el kernel determinará la dirección IP y el puerto por mí.

Según tengo entendido, el kernel elegirá la dirección IP en función de la IP principal de la interfaz, donde la interfaz se elige de acuerdo con la tabla de enrutamiento.

Para la parte del puerto TCP, el kernel encontrará un puerto no utilizado (efímero). La pregunta es: ¿el kernel mantiene los puertos TCP usados ​​por dirección IP o NO? Es decir, si he usado el puerto a.b.c.d:12345(supongamos que es la IP de la interfaz A) y ahora se supone que debe salir un paquete desde la interfaz B, ¿puedo usarlo e.f.g.h:12345(supongamos que es la IP de la interfaz B)?

Puedo pensar en argumentos para cualquier cosa. Dado que una conexión TCP establecida se identifica mediante la tupla 4 de IP/puerto local/remota, parece que la respuesta es yes: puedo usar el puerto 12345nuevamente. Sin embargo, el kernel no conoce la información de enrutamiento (de ahí la interfaz, de ahí la IP de origen) cuando prepara la capa TCP, por lo que sería imposible para el kernel asignar un puerto TCP libre dependiente de IP en la capa TCP, antes de continuar. hasta la capa IP.

La función del núcleoinet_csk_get_portescanea la hinfo->bhashtabla, que solo usa el número de puerto para las claves hash. ¿Eso significa que los puertos efímeros son únicos a nivel mundial? Si eso es cierto, suena como (un poco) desperdicio de recursos, para máquinas con múltiples tarjetas de red conectadas. ¿Me perdí algunos datos importantes aquí? Espero que alguien pueda ayudarme a aclarar esto. ¡Gracias!

información relacionada