Рейтинг:11

Что произойдет, если две локальные системы загрузят один и тот же ресурс на один и тот же порт?

флаг cn
S.B

Я знаю о таблице 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 соответственно.

флаг se
Маршрутизатор распознает, что IP-адрес отличается. Помните.IP-пакет идентифицируется 4 частями данных, а не 3, не 2 и не 1: исходный IP, исходный порт, целевой IP, целевой порт
S.B avatar
флаг cn
S.B
@slebetman Я знаю, но когда один и тот же файл загружается с одного и того же URL-адреса (если мы подключаемся к одному и тому же веб-серверу), IP-адрес и порт назначения одинаковы для обоих пакетов. IP-адрес источника также одинаков, поскольку это IP-адрес маршрутизатора. Таким образом, последняя часть этих 4 данных является исходным «портом». Я прав ?
флаг se
Они не могут быть одинаковыми. Служба NAT в вашем маршрутизаторе должна убедиться, что они не совпадают. Исходный порт, исходящий от NAT, в любом случае является случайным, поэтому NAT просто должен убедиться, что он внутренне сопоставляет пакет с входящим исходным портом с правильным ПК.
флаг se
Если вы не напишете свой собственный NAT, но это будет считаться ошибкой в ​​​​вашей реализации NAT.
RonJohn avatar
флаг id
«Есть ли какой-либо механизм в маршрутизаторе или сервере для обнаружения этого?» Вы **ДОЛЖНЫ** знать, что кто-то еще думал об этом **некоторое время** за последние 22 года.
Рейтинг:44
флаг co

TCP-соединение (которое лежит в основе HTTP и многих других протоколов) однозначно (в данный момент времени) определяется 4 параметрами:

  • Локальный IP
  • Местный порт
  • Удаленный IP
  • Удаленный порт

Даже если вы делаете один и тот же запрос дважды одновременно с одного и того же компьютера, даже если два идентичных IP-адреса и порт назначения идентичны, исходный порт будет другим.

Аналогичным образом, если у вас есть два запроса от двух устройств, проходящих через одно и то же устройство NAT, устройство NAT будет использовать разные исходные порты.В зависимости от устройства оно может либо сохранить исходные порты источника (и изменить только один в случае конфликта), либо всегда назначать новый исходный порт независимо от исходного исходного порта.

Затем устройство NAT будет сохранять для каждого соединения сопоставление в своей таблице преобразования, в которой указано, что внешнее соединение (внешний IP-адрес, внешний исходный порт, целевой IP-адрес, целевой порт) сопоставляется с внутренним соединением (внутренний IP-адрес хоста, внутренний исходный порт хоста, конечный порт). IP, порт назначения).

S.B avatar
флаг cn
S.B
Хорошо объяснил. Я приму это как ответ. Он всеобъемлющий и простой для понимания.
флаг cn
Как бы это ни было просто и элементарно - новички (да и опытные программисты к тому же) регулярно упускают из виду тот факт, что для каждого клиентского соединения существует порт SOURCE. На самом деле у меня были люди, предполагающие, что исходный порт будет идентичен целевому порту, который, очевидно, вообще не работает (т. Е. Веб-сервер делает http-вызов другому веб-серверу). Основной факт TCP, хорошо объясненный.
флаг cn
@TomTom На самом деле есть несколько нишевых протоколов, которые используют один и тот же порт для источника и назначения. Они редкость и обычно разрабатываются программистами, которые на самом деле не разбирались в тонкостях работы с сетью.
флаг cn
@Tonny Они также не могут быть основными, потому что в противном случае им был бы назначен назначенный порт, который попадает в контролируемое пространство низких портов;) Можете ли вы назвать мне некоторых из этих нарушителей? На самом деле никогда о них не слышал - похоже, что программисты тупые.
флаг cn
@TomTom Они действительно нишевые. Я столкнулся с парой в приложениях управления промышленным оборудованием. Впрочем, ничего недавнего (как в «этом тысячелетии»). Я не могу вспомнить ни одного имени. Это было 2 десятилетия назад. И глупость - слишком мягкий термин для этого безумия...
jcaron avatar
флаг co
@HagenvonEitzen это противоречило бы всей парадигме TCP. TCP-соединение определяется 4-мя кортежами, а не любыми 3-мя. Также я не совсем уверен, что понимаю, о чем вы говорите. Если вы находитесь в ситуации аварийного переключения (без синхронизации таблиц NAT), то стандартным механизмом для TCP-пакета, который не может быть сопоставлен, является RST, а не недоступный ICMP.
Hagen von Eitzen avatar
флаг cn
@jcaron Извини, мой плохой.Кажется, я запутался, потому что высокоуровневые дисплеи ICMP unreachables, как правило, упоминают только адрес назначения и порт, когда они на самом деле *действительно* содержат полный интернет-заголовок, включая отправку ip плюс 64 бита дейтаграммы (и, следовательно, задействованные TCP-порты). ) пакета-нарушителя *точно*, чтобы можно было выяснить, какая попытка действительно не удалась.
Рейтинг:11
флаг cn

Таблица NAT знает, что исходный порт на каждом клиенте различен, поэтому она не отправит случайно неправильный пакет не тому внутреннему клиенту. Устройство NAT также назначает разные исходящие порты, и они НЕ совпадают между разными внутренними клиентами.

S.B avatar
флаг cn
S.B
О, спасибо, боюсь, вы имели в виду «ip» вместо «port» в первом предложении? потому что порты предполагаются одинаковыми.
mfinni avatar
флаг cn
Нет. Предполагается, что исходный порт клиента не совпадает. Когда клиент делает запрос, исходный порт для большинства протоколов будет случайным свободным портом в эфемерном диапазоне портов.
S.B avatar
флаг cn
S.B
Да, это правда, но я специально спрашиваю именно о той ситуации, когда исходные порты совпадают, например, я намеренно открываю один и тот же порт с помощью сокета python.
mfinni avatar
флаг cn
Что ж, вы делаете это глупо, но таблица NAT знает, что исходные IP-адреса разные, поэтому применимо то же самое. Исходящие порты NAT определенно будут другими, они будут поступать из эфемерного диапазона портов на устройстве NAT.
S.B avatar
флаг cn
S.B
Лол, это из-за любопытства. Спасибо за Вашу информацию
флаг se
@SorousHBakhtiary Ваша ОС не позволит вам дважды открыть один и тот же порт с ошибкой «используемый порт» (обычно EADDRINUSE в обычных реализациях IP). Что вы МОЖЕТЕ сделать, так это открыть один процесс ОДИН исходный порт и общаться с двумя другими процессами через каналы или общую память и т. Д., И два процесса проксируют свой запрос через первый процесс. Но в этом случае маршрутизация будет на 100% зависеть от вас, потому что теперь это выходит за рамки IP-протокола.
флаг se
@SorousHBakhtiary Похоже, у python даже нет API, где вы можете установить порт для клиента. Вы можете указать только порт сервера в методе `.connect()`. Порт клиента случайным образом назначается вашему сокету. Таким образом, вы не можете делать то, что планируете делать на питоне. Это можно сделать в C, вручную отредактировав структуру сокета (спуфинг), но это нестандартно.
S.B avatar
флаг cn
S.B
@slebetman Ты прав, это моя вина, что я недостаточно ясно выразился. Я обновил вопрос с примером. Пожалуйста, смотрите раздел «обновление».
user49822 avatar
флаг pl
@slebetman По крайней мере, в Linux вы можете установить исходный порт при подключении, вызвав метод `.bind()` перед `.connect()`
Рейтинг:6
флаг in

Когда вы обращаетесь к NAT вы, вероятно, на самом деле имеете в виду NAPT. Что изменяет исходный порт (по крайней мере, если это необходимо) в устройстве NAT. Таким образом, исходный порт изменится.

Например iptables МАСКАРАД

При выполнении NAT в этом случае также необходимо «отслеживание соединения», которое просто отслеживает, какой «внешний порт» относится к какому «внутреннему клиенту и порту». В iptables часто можно увидеть правило СВЯЗАННЫЕ, УСТАНОВЛЕННЫЕ который использует. Вы также обнаружите, что если маршрутизатор, поддерживающий NAPT, будет перезапущен, все соединения будут разорваны. В то время как маршрутизатор без NAT обычно просто возобновляет любые соединения. (при условии, что он завершает перезапуск до истечения времени ожидания клиента)

S.B avatar
флаг cn
S.B
Да, моя проблема заключалась в следующем: например, когда мы используем порт 6000 в нашем приложении, я думал, что порт будет помещен в пакет вместе с (общедоступным) IP-адресом маршрутизатора... но на самом деле это из-за PAT, другой порт, созданный устройством NAT (здесь маршрутизатор), назначается нашему частному IP-адресу. Вот как маршрутизатор может легко отличить, какой пакет для какого IP-адреса, даже если они изначально использовали одни и те же порты. Я прав ?
флаг se
@SorousHBakhtiary Когда вы говорите, порт 6000, вы имеете в виду на сервере или на клиенте? Вы понимаете, что каждый пакет в протоколе IP идентифицируется 4 битами информации, верно? Не только 2. порт клиента (источника), IP-адрес клиента (источника), порт назначения (сервер - я думаю, это то, что вы подразумеваете под 6000), IP-адрес назначения. Таким образом, даже если два клиента на одном ПК подключаются к (целевому) порту 6000, ваша ОС будет случайным образом назначать им разные исходные порты. Это то, что маршрутизаторы (и NAT) используют для определения маршрутизации — порт источника, IP-адрес источника, порт назначения, IP-адрес назначения.
Рейтинг:5
флаг ru

Маршрутизатор не использует тот же номер исходного порта, который ноутбуки генерируют в своих исходящих запросах к глобальной сети, он генерирует свои собственные уникальные исходные порты. Таблица NAT в маршрутизаторе преобразует Laptop1:6000 в publicip:N и Laptop2:6000 в publicip:M. Тогда он знает, куда направлять входящие пакеты, через какой порт поступает трафик из Интернета.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.