То, что вы хотите сделать, является обычной задачей с общей проблемой (но также и с общим решением). Вы хотите отправить данные с одного устройства (компьютер / телефон / и т. Д.) На другое. Вот как это работает за кулисами:
В мире много компьютеров. Каждому компьютеру присваивается идентификационная информация - имя, если хотите, которое называется IP-адресом компьютера. Существует много версий / стандартов IP-адреса, и текущий стандарт называет IP-адрес следующим образом: «111.222.333.444». Существует только так много перестановок с 12 цифрами чисел, и все диапазоны IP-адресов зарезервированы. Другими словами, для компьютеров недостаточно IP-адресов.
Теперь для решения этой проблемы были изобретены маршрутизаторы. Маршрутизаторы присваивают всем компьютерам в своей локальной сети (LAN) один публичный (WAN) IP-адрес. При среднем числе одного маршрутизатора на домохозяйство это экономит много IP-адресов. К сожалению, это также нарушает прямую связь между компьютерами, потому что как можно общаться с тремя компьютерами, использующими одно и то же имя? Как идентифицировать компьютер A с компьютера B с компьютера C, если все они используют один и тот же IP-адрес в глобальной сети?
Во-первых, давайте проясним это - как есть несколько версий и стандартов IP-адресов, так и есть несколько типов маршрутизаторов. Кстати, в проблемах прямой связи между компьютерами виноват не маршрутизатор, а технология, лежащая в основе преобразования сетевых адресов (NAT). В любом случае, существует несколько типов NAT, и, хотя в Интернете относительно мало информации об этих типах, вы все равно можете прочитать ее в Википедии и прочитать несколько научных исследований в университетах. Типы: Full Cone NAT, Restricted NAT, Port Restricted NAT и Symmetric NAT.
Таким образом, компьютеры в локальной сети используют один и тот же WAN IP. Это проблема. Какое решение? Что если мы дадим команду маршрутизатору направлять весь входящий трафик, направляемый на определенный порт, на определенный компьютер в нашей локальной сети? Например, если три компьютера локальной сети совместно используют IP-адрес WAN версии 1.1.1.1, мы можем настроить процедуру, называемую переадресацией портов, чтобы дать маршрутизатору команду направлять все пакеты, поступающие на порт 6000, на 192.168.1.101:3500.
uPnP - это просто причудливая технология (не всегда присутствующая в маршрутизаторах - или, что более важно, едва ли когда-либо включаемая по умолчанию), которая позволяет переносить данные с помощью кода.
Если мы не можем использовать uPnP для переноса вперед, поскольку не на всех устройствах он включен, должно быть другое решение - и есть пробивание дырок.
Перфорирование отверстий происходит в двух вариантах: UDP и TCP, хотя перфорирование дырок TCP немного сложнее, потому что TCP изначально является протоколом, ориентированным на соединение. Пробивать дыры в UDP проще, потому что вы можете отправлять пакеты без соединения (на самом деле, существует ли такая вещь, как соединение?)
Вы можете ознакомиться с процедурой пробивания отверстий UDP в Википедии и на других сайтах. Концепция работает так же. Любой компьютер, отправляющий исходящий пакет, будет ожидать ответа, то есть маршрутизатор разрешит ответ входящего пакета. Сначала два компьютера не будут ожидать ответа друг от друга, поэтому первый пакет, отправленный каждым компьютером, будет отклонен маршрутизатором. Однако, если мы продолжим отправку пакетов, маршрутизатор пропустит остальные пакеты, поскольку от каждого компьютера ожидается ответ. Пока это перфорированное соединение поддерживается активным из-за периодических пакетов поддержки активности, оно будет оставаться живым. К сожалению, этот метод пробивания дырок в UDP неэффективен для симметричных NAT (объяснение приведено в ссылках ниже). Вот почему конечное решение - просто прокси-соединение и трафик через ваш собственный сервер. Это требует фермы компьютеров, так что это довольно дорого. Но это конечное решение называется TURN. STUN - это веб-служба, которую вы можете запросить, чтобы определить ваш тип NAT и публичный IP (в отличие от анализа cmyip.com). Просто некоторые термины, с которыми вы столкнетесь в своем личном исследовании.
Игра с этими понятиями помогает. Вот несколько ресурсов для начала:
Типы NAT: http://think -like-a-computer.com / 2011/09/16 / types-nat /
Метод симметричного обхода NAT (в основном путем рассылки спама гораздо большего количества пакетов на гораздо большее количество портов): http://www.goto.info.waseda.ac.jp/~wei/file/wei-apan-v10.pdf
Сетевая библиотека Лидгрена (со встроенным обходом NAT, это библиотека C #): http://code.google.com/p/lidgren-network-gen3/w/list