С переадресацией портов любой может превратить компьютер в сервер и использовать его для принятия прямых подключений от любых других компьютеров в Интернете (конечно, работает некоторый код на стороне сервера). Это замечательно, но что делать, когда у кого-то нет доступа к физическому маршрутизатору (как это имеет место для многих людей в квартирах), или, возможно, его нет (появилось много новых видов интернет-соединений, таких как сотовые телефонные данные, которые работают по-разному)... Думаю, им не повезло?
Однако есть одна простая ситуация, которую я до сих пор считаю очень полезной, для которой что-то может быть сделано: устанавливается соединение между двумя сторонами, которые знают друг друга и уже обменялись IP-адресами. Конечно, эти IP-адреса могут время от времени меняться, но я не считаю это большим препятствием, и в случае необходимости доступно множество бесплатных услуг DDNS. Они также договорились о номерах портов или методе прохождения номеров портов, пока не найдут тот, который работает. Ни у одной из сторон нет переадресации портов.
Но посмотрите, маршрутизатор или все, что предоставляет интернет-сервис, должен быть способен пересылать данные, отправленные с адреса соединения, на любой локальный компьютер, на котором установлено это соединение, как это происходит при обычном использовании интернета. Допустим, происходит следующая процедура:
- Один пользователь говорит, что он установил соединение с адресом другого пользователя, указав для использования как локальные, так и внешние порты, и поэтому маршрутизатор (или что бы то ни было) делает соответствующее действие для направления данных, поступающих от этого другого пользователя, к этому. Однако, как знает первый пользователь (но не маршрутизатор), он на самом деле не подключался, а вместо этого он ожидает и ожидает запроса от другого пользователя.
- Между тем, другой пользователь просто пытается подключиться к первому, так как любой клиент подключится к серверу, используя те же порты (хотя и поменяемые местами), которые выбрал первый пользователь.
- Когда первый получает запрос на установление фактического соединения, он отправляет соответствующий ответ, чтобы запрос второго пользователя на соединение был принят.
Вполне возможно, что реальный код мог бы вести себя нормально, с первым пользователем в качестве сервера и вторым в качестве клиента, но с важной частью является то, что маршрутизатор первого пользователя (или что-то еще выполняет эти обязанности) думает, что первый пользователь является клиент, который первым установил соединение с другим пользователем.
Я не вижу ничего, что делает это невозможным, но я также не вижу, как это будет сделано. Во-первых, тот факт, что первоначальная попытка подключения была отклонена, должен был как-то игнорироваться (по крайней мере, маршрутизатором). Во-вторых, попытка использовать этот порт снова для прослушивания и принятия истинного соединения должна быть разрешена (как-то не уведомлять маршрутизатор о том, что эти шаги происходят).
Если бы это можно было сделать, это означало бы, что любое подключенное к Интернету устройство (а не только домашние компьютеры) могло бы подключаться напрямую к любому другому включенному устройству без необходимости использования каких-либо сторонних серверов. Эти соединения могут быть использованы для прямой передачи файлов произвольного размера, например, опять же, без использования сторонних серверов. И соединение может делать что-либо еще, как и обычное соединение.
Поэтому я здесь, чтобы спросить, кто-нибудь знает, как это можно сделать?