Я заметил, просматривая сайт ipchicken (http://www.ipchicken.com/), что когда я захожу туда со своего рабочего стола или с моего телефона или с университетского wifi, он дает мне "Удаленный порт". Существует диапазон номеров портов (кажется, что он никогда не превышает 65 000 или около того). Но что, если я напишу программу, которая прослушивает каждый порт? Маршрутизатор исчерпает порты? Будет ли это заблокировать новые люди от подключения? Что происходит, когда у маршрутизатора заканчиваются номера внутренних портов?
3 ответа
Порты в протоколах TCP или UDP хранятся в 16-битном целом числе, поэтому можно использовать только 65535 портов.
Если вы используете каждый порт на вашем компьютере, то у любого приложения, которому требуется сокет (соединение), его не будет. Такие функции, как listen () или connect (), будут приводить к ошибке до тех пор, пока не будет свободного порта для использования.
Если вы используете каждый порт в маршрутизаторе (с NAT), то каждое новое соединение будет буферизовано или сброшено. Если маршрутизатор - это просто маршрутизатор, а не шлюз с NAT, проблемы с портами не будет, потому что транспортный уровень (4-й уровень в модели ISO/OSI) не анализируется.
«Если нет доступных портов, пакет отбрасывается». http://www.cisco.com/c/en/us/support/docs/ip/network-address-translation-nat/26704-nat-faq-00.html
TCP/IP работает следующим образом:
Когда вы создаете соединение между клиентом и сервером, оно подключается к порту на основе порта и IP-адреса.
Ваш IP-адрес - это IP-адрес, данный сервером, а порт - это все, что указано стороной, инициирующей соединение. Например, FTP-сервер будет подключаться к порту 21, если только сервер специально не укажет использовать другой порт.
Настроить соединение можно двумя способами.
Во-первых, сервер прослушивает на общем порте любые соединения, чтобы инициировать соединение, которое будет сделано. Затем происходит одна из следующих двух вещей:
- Сервер создает новый сокет, используя другой порт, и отвечает: пожалуйста, подключитесь к этому порту.
- Сервер спрашивает, к какому порту на вашей стороне он может подключиться, и подключается к нему.
Разница здесь в том, что с первым все соединения исходят со стороны клиента, поэтому не нужно переадресовывать порты на маршрутизаторе. Тогда как второй элемент использует входящий порт, который необходимо настроить.
Разница в технике в основном зависит от пропускной способности от открытия портов на стороне клиента.
Теперь, когда извне устанавливается соединение с вашим общедоступным IP-адресом, на любом данном порту ваш маршрутизатор примет этот порт и с помощью внутренних правил (маршрутизации) перенаправит связь клиентскому IP-адресу в локальной сети. , Если вы размещаете сервер, соединение будет закрыто и возобновлено на новом порту, освобождая публичный порт.
Пока порт остается открытым, новое соединение не может быть установлено, и, таким образом, источник будет продолжать попытки в зависимости от настроек времени ожидания, пока в конце концов он не сработает и не произойдет время ожидания.
Итак, в основном вы хотите создать правила для всех портов вашего маршрутизатора, чтобы перенаправлять данные в вашу программу, и позволить вашей программе открывать соединение и перенаправлять его на новый ip. В основном это означает, что вы сами создаете роутер. В результате ваша скорость будет снижаться, и, если не все сделано правильно, соединения могут не прерваться должным образом и т.д.
По сути, вы создаете программу, которая, скорее всего, может также применяться правилами брандмауэра / перенаправления портов на вашем маршрутизаторе.