Я знаю о таблице NAT. Я просто хочу знать, что произойдет, если два клиента в частной локальной сети захотят загрузить один и тот же ресурс через один и тот же порт? Другими словами, когда пакет приходит с сервера, как маршрутизатор может решить, какой клиент должен получить этот пакет?
Если я не ошибаюсь, входящий пакет с сервера имеет IP-адрес назначения маршрутизатора, который является публичным и одинаковым для обоих, а также номер порта назначения, который в данном случае тоже одинаковый.
Есть ли какой-нибудь механизм в маршрутизаторе или сервере, чтобы обнаружить это? Или возможно ли такое поведение вообще?
Я искал вопросы вроде этого, который имеет смысл, что ошибка возникает, потому что порт занят, но я спрашиваю о двух разных системах.
Обновление : Из комментариев я понял, что был недостаточно ясен, поэтому позвольте мне повторить это на примере:
Меня интересует только порт "источника" устройств. Предположим, у меня есть два ноутбука (192.168.2.10
и 192.168.2.11
), оба они скачивают один и тот же файл с одного и того же сервера где-то в интернете. Каждая из них имеет операционную систему, которая генерирует случайный порт, поэтому IP-адрес источника и порт источника будут выглядеть следующим образом: 192.168.2.10:6321
and 192.168.2.11:7132
. Я думал, что в NAT, маршрутизатор будет устанавливать свой (публичный) IP адрес вместе с портами ноутбуков, так что если публичный IP адрес домашнего маршрутизатора будет 65.82.23.32
, эти два пакета получат эти IP и порт источника соответственно: 65.82.23.32:6321
и 65.82.23.32:7132
.
Теперь, когда ответ получен, маршрутизатор может определить, какой пакет предназначен для какого ноутбука по номерам портов, верно? Пока все хорошо. Но что произойдет, если случайно или намеренно два ноутбука генерируют один и тот же порт источника? Например: 192.168.2.10:6000
и 192.168.2.11:6000
. Теперь маршрутизатор будет устанавливать свой публичный IP-адрес в качестве IP-адреса источника, как и раньше, но теперь, если он попытается использовать эти номера портов, эти пакеты будут иметь точно такой же IP-адрес источника и номер порта источника, как : 65.82.23.32:6000
and 65.82.23.32:6000
.
Здесь я запутался, что когда ответ приходит обратно, как маршрутизатор может решить, какой пакет предназначен для какого ноутбука?
После ответа @mfinni, я заметил, что PAT работает не так! NAT устройство (здесь маршрутизатор) назначает уникальные порты каждому отдельному ноутбуку (частный IP адрес), затем пакеты посылаются с этими уникальными портами (например 7777
и 7778
). Таким образом, когда ответ приходит обратно, становится ясно, какой пакет предназначен для какого ноутбука, исходя из портов, тогда маршрутизатор преобразует эти 65.82.23.32:7777
, 65.82.23.32:7778
в --> 192.168.2.10:6000
, 192.168.2.11:6000
соответственно.
TCP-соединение (которое лежит в основе HTTP и многих других протоколов) однозначно (в данный момент времени) определяется 4 параметрами:
Даже если вы делаете один и тот же запрос дважды одновременно с одного и того же компьютера, даже если два идентичных IP-адреса и порт назначения идентичны, исходный порт будет другим.
Аналогичным образом, если два запроса от двух устройств проходят через одно и то же устройство NAT, устройство NAT будет использовать разные исходные порты. В зависимости от устройства оно может либо сохранить исходные порты источника (и изменить только один в случае конфликта), либо всегда назначать новый исходный порт независимо от исходного исходного порта.
После этого устройство NAT будет сохранять сопоставление для каждого соединения в своей таблице преобразования, в которой указано, что внешнее соединение (внешний IP-адрес, внешний исходный порт, целевой IP-адрес, целевой порт) сопоставляется с внутренним соединением (внутренний IP-адрес хоста, внутренний хост-источник). порт, IP-адрес назначения, порт назначения).
Таблица NAT знает, что исходный порт на каждом клиенте отличается, поэтому она не может случайно отправить неправильный пакет не тому внутреннему клиенту. Устройство NAT также назначает разные исходящие порты, и они НЕ совпадают между разными внутренними клиентами.
Когда вы говорите о NAT
, вы, вероятно, имеете в виду NAPT
.
Что изменяет исходный порт (по крайней мере, если это необходимо) в устройстве NAT.
Таким образом, исходный порт изменится.
Например, iptables
MASQUERADE
При выполнении NAT в этом случае также необходимо «отслеживание соединения», которое просто отслеживает, какой «внешний порт» относится к какому «внутреннему клиенту и порту». ". В iptables вы часто будете видеть правило RELATED,ESTABLISHED
, которое использует. Вы также обнаружите, что если маршрутизатор, поддерживающий NAPT, будет перезапущен, все соединения будут разорваны. В то время как маршрутизатор без NAT обычно просто возобновляет любые соединения. (при условии, что перезапуск завершается до истечения времени ожидания клиента)
Маршрутизатор не использует тот же номер исходного порта, который ноутбуки генерируют в своих исходящих запросах к ГЛОБАЛЬНОЙ сети, он генерирует свои собственные уникальные исходные порты. Таблица NAT в маршрутизаторе преобразует laptop1:6000 в publicip:N и laptop2:6000 в publicip:M. Затем он знает, куда направлять входящие пакеты, через какой порт поступает трафик из Интернета.