LINUX.ORG.RU

соединение р2р, как правильно

 , , ,


0

2

Допустим, есть несколько клиентов, которых надо соединить напрямую, минуя сервер (клиенты на андроид, но это, наверное, неважно).

Я так понимаю, что первый клиент должен сначала отправить запрос некоему серверу (где оба клиента уже зарегистрированы), чтобы узнать ip адрес второго клиента по известному символьному имени. А потом уже «общаться» со вторым клиентом напрямую

Но адрес может быть не выделенным, клиенты могут иметь один и тот же адрес, если, например используют одну и ту же wifi точку.

Как правильно организовать соединение в таком случае? Может быть, есть готовые решения?


Ха-ха-ха! Это целая наука! «С кондачка» ты проблемы не решишь :)

В локальной сети можно обнаруживать друг друга широковещательными оповещениями (раз в 5 минут или только при запуске программы). К примеру, моя Pandora (на ruby) при запуске рассылает широковещательное hello-сообщение в сеть по UDP:5577, а другие локальные соседи, получив запрос, сразу пытаются подключиться в ответ на TCP:5577.

А вот чтобы внешние NATы «дырявить», тут целый комплекс решений и технологий. Начинать с википедии, постепенно погружаясь в тему:
https://en.wikipedia.org/wiki/Hole_punching_(networking)
https://en.wikipedia.org/wiki/TCP_hole_punching
https://en.wikipedia.org/wiki/UDP_hole_punching

Слова для гугления: NAT, pounching, UPnP (IGD), NAT-PMP, STUN, SOCKS, NAT-T (in IKE), TURN, RSIP, MIDCOM, ICE, Teredo (miredo), SBC, SYN-TCP, UDP-pounching, ALG, Skype UDP pounching.

В двух словах: для обнаружения использовать какой-то заранее известный постоянный список узлов, и уже через эти узлы обнаруживать друг друга, общаться, и при возможности, дырявить друг другу NATы. В Пандоре для этого написаны две дополнительные утилиты - PanGate (python) и PanReg (php).

Для андроидов обнаружение друг друга можно дополнительно делать на уровне радио-сетей, слова для гугления: wi-fi mesh-network, B.A.T.M.A.N. mesh, Ячеистая топология, Mesh-сети, ad-hoc-сети, Bluetooth.

Novator ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.