Для любого соединения TCP или UDP существует четыре компонента, которые составляют адресацию пакета. IP-адрес источника, IP-адрес назначения, порт источника и порт назначения.
IP-адрес назначения - это сервер, к которому вы подключаетесь, а порт назначения - это порт, к которому вы подключаетесь, например, TCP-порт 80 для подключения http. Порт источника является "эфемерным", что означает, что он выбран из диапазона и не имеет конкретного значения. Диапазон между 1024-65535. Выбор порта зависит от ОС, но не имеет большого значения, какой порт выбран.
IP-адрес источника - это компьютер, с которого осуществляется соединение. Итак, предположим, что соединение 222.222.222.222:80, и у нас есть два ПК, подключенных к этому IP-адресу, 10.1.1.1 и 10.1.1.2.
Таким образом, по мере появления пакетов они могут быть адресованы следующим образом:
10.1.1.1:3434 -> 222.222.222.222:80
10.1.1.2:5455 -> 222.222.222.222:80
Ответные пакеты меняются местами, например так:
222.222.222.222:80 -> 10.1.1.1:3434
222.222.222.222:80 -> 10.1.1.2:5455
Таким образом, мы можем видеть, что порт источника - это то, что позволяет возвращаемому пакету добраться до источника.
Когда мы проходим через маршрутизатор NAT, IP-адрес источника изменяется на IP-адрес маршрутизатора - в данном случае 111.111.111.111. Итак, пакеты выглядят так:
111.111.111.111:3434 -> 222.222.222.222:80
111.111.111.111:5455 -> 222.222.222.222:80
Таким образом, при условии, что маршрутизатор отслеживает порт источника соединения, он знает, что ответные пакеты на порт 3434 должны быть отправлены на 10.1.1.1. Это таблица трансляции NAT.
Но что, если оба наших компьютера выбрали один и тот же порт источника?
10.1.1.1:3434 -> 222.222.222.222:80
10.1.1.2:3434 -> 222.222.222.222:80
NAT-пакеты будут выглядеть так:
111.111.111.111:3434 -> 222.222.222.222:80
111.111.111.111:3434 -> 222.222.222.222:80
Таким образом, ответный пакет на 3434, предназначенный для 10.1.1.1, неотличим от пакета, предназначенного для 10.1.1.2.
Чтобы обойти это, маршрутизатор будет изменять не только IP-адрес источника, но и порт источника. Затем маршрутизатор может гарантировать, что каждое исходящее соединение имеет уникальный исходный порт, и сохраняет таблицу трансляции, чтобы изменить как IP-адрес, так и порт ответных пакетов, чтобы они отправлялись правильному отправителю.
Чтобы ответить на ваш секретный вопрос, реально, маршрутизатору нужно только изменить порт источника в случае коллизии, однако большинство из них будет изменять порт источника в каждом случае и выбирать случайный порт источника. Это затрудняет прогнозирование того, каким может быть следующий выбранный исходный порт, и злоумышленнику становится труднее вводить пакеты в последовательность.