Как пробивать НАТ?

Имеем 2 приложения.
Приложения взаимодействуют между собой.
2 компьютера (смартфона и пр) на которых работают приложения могут быть в общем случае подключены к интернету как угодно.

Понятно, что в качестве резерва должен быть метод взаимодействия через внешний сервер.

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

Строго говоря интересуют названия технологий. Какие ключевые слова для Гугля
Дальше - сам.
Для универсального случая - любого НАТ.

Наверняка есть стандартные процедуры обхода/дружбы с НАТ.
  • Вопрос задан
  • 2785 просмотров
Решения вопроса 3
15432
@15432
Системный программист ^_^
TCP / UDP hole punching, статей куча
Ответ написан
Комментировать
jamakasi666
@jamakasi666
Просто IT'шник.
Универсального способа нет. Гуглить по фразам UPnP, stun, turn.
Для универсальности надо делать реализации всех способов разом, со стороны клиента перебирать каждый способ до достижения результата, если не один способ не помог то подключаться через промежуточный сервер.
Ответ написан
Комментировать
TrueBers
@TrueBers
Гуглю за еду
Стандартных методов нет, ибо провайдеры конфигурируют свои железки как им вздумается. А у довольно большого их количества используется симметричный НАТ, который пробить невозможно.

Есть несколько RFC на эту тему, сама процедура называется Interactive Connectivity Establishment. Самому писать реализацию крайне не советую, там столько тонкостей, что можно пару лет исследовать. Лучше взять что-то готовое.

Если нужно из коробки на винде, из пакетов на линуксе, и, вроде бы как, кто-то портировал на Андроид — используйте Teredo/Miredo. Там всё довольно просто, в современных версиях пробиваются все типы ната. В случае симметричного, трафик идёт через релей, реализации которого тоже есть в виде демона. Единственное, что может не устраивать из коробки — там IPv6, если нужен v4, придётся реализовывать маппинг.

Более тяжёлая артиллерия — это реализация от гугла. Сейчас она входит в кодовую базу Хромиум, в реализацию стандарта WebRTC. Там всё довольно сильно завязано на фреймворк хрома, очень тяжеловесно, довольно долго собирается, используется непривычная терминология из RFC. Зато эта библиотека самая действенная, огромный опыт гугла даёт о себе знать, демоны релеев (TURN) также есть, за вас написан reliable транспортный протокол, может взаимодействовать с браузерами через WebRTC Data Channel и прочие плюшки.

Есть ещё, конечно, много других библиотек, но они что-то у меня не взлетали, сильно глючили, не всегда правильно тип НАТа определяли и т. п.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Универсального нет. Выше вариант наводки дали, но это не всегда и не везде.
Посему наверное единственный универсальный вариант - наличие третьей стороны (сервера). Остальное - уже по вкусу:
- все взаимодействия через сервер (типа Hamachi, ammy и т.п.)
- сервер работает только сводником (торренты)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы