Отправка данных с использованием Tcp / Udp - PullRequest
2 голосов
/ 24 февраля 2012

Вот мой сценарий.

У меня есть устройство (телефон Android). И я знаю IP-адрес другого устройства (которое является некоторым удаленным устройством в Интернете)

Так как мне отправить данные на другое устройство? Я использую протоколы как Tcp или Udp?

РЕДАКТИРОВАТЬ: И я знаю, что есть публичные IP-адреса и частные IP-адреса (например, когда устройство подключается через WiFi). В таком случае возможно ли вообще использовать Tcp или Udp ???

Ответы [ 2 ]

5 голосов
/ 24 февраля 2012

То, что вы хотите сделать, является обычной задачей с общей проблемой (но также и с общим решением). Вы хотите отправить данные с одного устройства (компьютер / телефон / и т. Д.) На другое. Вот как это работает за кулисами:

В мире много компьютеров. Каждому компьютеру присваивается идентификационная информация - имя, если хотите, которое называется 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

0 голосов
/ 24 февраля 2012

В большинстве реальных случаев вы отправляете данные на другое устройство, отправляя данные на промежуточное устройство, с которого их забирает другой телефон. Может использовать протоколы, такие как TCP или UDP, напрямую между двумя устройствами, и это может или не может работать в зависимости от протоколов и того, как устройства получают доступ в Интернет.

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

...