Выделяет ли ядро ​​Linux свободный TCP-порт на основе IP-адреса?

Выделяет ли ядро ​​Linux свободный TCP-порт на основе IP-адреса?

Это гипотетический вопрос, призванный помочь мне лучше понять, как работают порты TCP.

Предположим, у меня на машине несколько карт Ethernet, и они подключены к разным подсетям. Теперь, если я хочу подключиться к удаленной машине по TCP, без привязки локального адреса/порта, ядро ​​определит IP-адрес и порт для меня.

Насколько я понимаю, ядро ​​выберет IP-адрес на основе основного IP-адреса интерфейса, а интерфейс выбирается в соответствии с таблицей маршрутизации.

Для части TCP-порта ядро ​​найдет для меня неиспользуемый (эфемерный) порт. Вопрос в том, сохраняет ли ядро ​​используемые TCP-порты по IP-адресу или НЕТ? То есть, если я использовал порт a.b.c.d:12345(предположим, что это IP-адрес интерфейса A), и теперь пакет должен выйти из интерфейса B, могу ли я использовать e.f.g.h:12345(предположим, что это IP-адрес интерфейса B)?

Я могу придумать аргументы в пользу любого из этих вариантов. Поскольку установленное TCP-соединение идентифицируется локальным/удалённым IP/портом 4-кортежа, кажется, ответ таков yes: я могу снова использовать порт 12345. Однако ядро ​​не знает информацию о маршрутизации (следовательно, интерфейс, следовательно, исходный IP) при подготовке уровня TCP, поэтому для ядра было бы невозможно назначить зависящий от IP свободный порт TCP на уровне TCP, прежде чем перейти на уровень IP.

Функция ядраinet_csk_get_portсканирует hinfo->bhashтаблицу, которая использует только номер порта для хэш-ключей. Означает ли это, что эфемерные порты глобально уникальны, и если это правда, то это звучит как (немного) пустая трата ресурсов для машин с несколькими сетевыми картами на . Я пропустил какие-то важные факты? Надеюсь, кто-нибудь поможет мне прояснить это. Спасибо!

Связанный контент