
Я знаю о таблице NAT. Я просто хочу узнать, что произойдет, если два клиента в частной локальной сети захотят загрузить абсолютно один и тот же ресурс на один и тот же порт? Другими словами, когда пакет приходит с сервера, как маршрутизатор может решить, какой клиент должен получить этот пакет?
Если я не ошибаюсь, входящий пакет с сервера имеет IP-адрес назначения маршрутизатора, который является публичным и одинаковым для обоих, а также номер порта назначения, который в данном случае также совпадает.
Есть ли какой-либо механизм в маршрутизаторе или сервере, чтобы обнаружить это? Или такое поведение вообще возможно?
Я искал такие вопросы, какэтот, что вполне логично, так как ошибка возникает из-за того, что порт занят, но я спрашиваю о двух отдельных системах.
Обновлять :Из комментариев я понял, что выразился недостаточно ясно, поэтому позвольте мне повторить это еще раз на примере:
Меня интересует только "исходный" порт устройств. Предположим, у меня есть два ноутбука ( 192.168.2.10
и 192.168.2.11
), оба загружают один и тот же файл с одного и того же сервера где-то в Интернете. На каждом из них установлена операционная система, которая генерирует случайный порт, поэтому исходный IP и исходный порт будут примерно такими: 192.168.2.10:6321
и 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
и 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
соответственно.
решение1
TCP-соединение (лежащее в основе HTTP и многих других протоколов) однозначно (в данный момент времени) определяется четырьмя параметрами:
- Локальный IP-адрес
- Местный порт
- Удаленный IP
- Удаленный порт
Даже если вы сделаете один и тот же запрос дважды одновременно с одного и того же компьютера, даже если оба IP-адреса и порт назначения идентичны, порт источника будет отличаться.
Аналогично, если у вас есть два запроса от двух устройств, проходящих через одно и то же устройство NAT, устройство NAT будет использовать разные исходные порты. В зависимости от устройства, оно может либо сохранить исходные порты (и изменить только один, если есть конфликт), либо всегда назначать новый исходный порт независимо от исходного порта.
Затем устройство NAT будет сохранять для каждого соединения сопоставление в своей таблице трансляции, в которой указано, что внешнее соединение (внешний IP-адрес, внешний исходный порт, IP-адрес назначения, порт назначения) сопоставляется с внутренним соединением (внутренний IP-адрес хоста, внутренний исходный порт хоста, IP-адрес назначения, порт назначения).
решение2
Таблица NAT знает, что исходный порт на каждом клиенте отличается, поэтому она не отправит случайно неправильный пакет неправильному внутреннему клиенту. Устройство NAT также назначает разные исходящие порты, и они НЕ одинаковы между разными внутренними клиентами.
решение3
Когда вы ссылаетесь на, NAT
вы, вероятно, на самом деле ссылаетесь наNAPT
. Который изменяет исходный порт (по крайней мере, если необходимо) в устройстве NAT. Таким образом, исходный порт изменится.
Напримерiptables
MASQUERADE
При использовании NAT в этом случае также необходимо «отслеживание соединения», которое просто отслеживает, какой «внешний порт» относится к какому «внутреннему клиенту и порту». В iptables вы часто увидите правило, RELATED,ESTABLISHED
которое использует. Вы также обнаружите, что если маршрутизатор, который использует NAPT, перезапускается, он разрывает все соединения. В то время как маршрутизатор без NAT обычно просто возобновляет все соединения. (предполагая, что он завершает перезагрузку до истечения времени ожидания клиента)
решение4
Маршрутизатор не использует тот же номер исходного порта, который генерируют ноутбуки в своих исходящих запросах в WAN, он генерирует свои собственные уникальные исходные порты. Таблица NAT в маршрутизаторе преобразует laptop1:6000 в publicip:N и laptop2:6000 в publicip:M. Затем он знает, куда направлять входящие пакеты, по какому порту трафик поступает из Интернета.