Конференция "Начинающим" » Помогите реализовать связь клиентов между собой из под NAT
 
  • Signal (30.12.16 07:09) [0]
    Вообщем делаю аудио-чат, сделал сервер на node.js (по TCP/IP) при помощи которого оба клиента соединяются между собой. оба клиента получают от сервера на node.js IP и внешний порт своего собеседника. вот как теперь зная эту информацию соединить их по UDP? ведь IP адрес понятно, будет внешний интернетовский, а ПОРТ ведь это порт подключения по TCP/IP?
    т.е. мне нажно UDP сервер клиента 1 и UDP клиент, клиента 2 соединить напрямую между собой. не могу въехать в реализацию, уже весь интернет перерыл (почти весь, помогите люди дорогие)
  • sniknik © (30.12.16 08:02) [1]
    по UDP не соединяются между собой, UDP это такой протокол по которому клиент кидает пакет по адресу/адресам, и надеется, что там его поймают.
  • Signal (30.12.16 08:50) [2]
    я понимаю, но ведь нужно знать куда слать этот UDP правильно?
    в локалке все просто, а вот интересует реализация из под НАТА
  • iop © (30.12.16 09:26) [3]
    я понимаю, но ведь нужно знать куда слать этот UDP правильно?
    логично. даже бумажное письмо надо знать куда слать.

    в локалке все просто, а вот интересует реализация из под НАТА

    в нелокалке тоже все просто как и в локалке.

    вместо x.x.x.x будет адрес y.y.y.y
    остальное будет все точно так же

    из под НАТА
    ну пробросить надо.
    всё входящее по удп на порт nnnn кидать внутрь на нужный ip/порт
  • Signal (30.12.16 09:37) [4]

    > ну пробросить надо.
    > всё входящее по удп на порт nnnn кидать внутрь на нужный
    > ip/порт

    т.е. на сервере я определил внешние IP и порты обоих клиентов и просто слать UDP на этот IP:порт? а в локале слушать на каком порту-то не въеду
  • iop © (30.12.16 09:40) [5]
    на сервере у тебя нет никаких внешних ип.
    твой сервер за натом.

    внешний ип у тебя на роутере.

    клиент шлет пакеты на адрес роутера.
    а роутер по правилу которое ты на нем создашь будет кидать эти пакеты на сервер
  • Signal (30.12.16 09:46) [6]

    > на сервере у тебя нет никаких внешних ип.
    > твой сервер за натом.

    ну мы просто не правильно поняли друг-друга, сервер для того, чтобы определить внешний IP клиентов, допустим я их получил скажем, Клиент1: 205.12.90.18 и Клиент2: 167.23.78.12
    так же можно получить соответсвенно порты (то это порты получаются созданные для tcp соединения, через которые клиенты подрубились к серверу)


    > а роутер по правилу которое ты на нем создашь будет кидать
    > эти пакеты на сервер

    создашь? руками в роутер лесть не вариант, т.е. нужна реализация как скажем ICQ передает файл минуя сервер самого ICQ или как теамвьювер или тотже скайп работает без передачи потока через их сервер
  • iop © (30.12.16 10:07) [7]
    руками в роутер лесть не вариант

    ну лезь ногами.
    или что там у тебя вместо рук рабочее....
  • iop © (30.12.16 10:14) [8]
    а вообще ты сядь, переведи дух и успокойся.

    а то сначала у тебя клиенты и сервер за натом.
    а потом появляется еще какой-то сервер, не за натом, через который "как в скайпе" все должно быть.

    ты посчитай сначала сколько у тебя ково есть, нарисуй на бумажке....
  • sniknik © (30.12.16 11:30) [9]
    > или тотже скайп работает
    на него не стоит ориентироваться, в нем куча всяких, в том числе "вирусных" технологий намешано, и пир ту пир, и левые сервера, и разные порты прослушиваемые в фоновом режиме, и х.з. что еще (а у тебя только UDP).
    у меня как то в локальной сети через которую у провайдера инет, ничего не было кроме провайдерской странички "нужно оплатить", и скайп... работал как ни в чем не бывало, что то админ провайдера забыл запретить, или сам скайп с сервера юзал, хз. как в общем просто факт, за раз "на коленке" так не сделать.
  • Signal (30.12.16 12:02) [10]

    > sniknik

    ну я скайп образно привел, а вообще реализация как передача файлов в ICQ или в тех же торрент клиентах
    вот нарисовал примерно схему, http://s56.radikal.ru/i154/1612/43/1e423ac35b00.jpg черными стрелками обозначены запросы при подключении клиентов к МОЕМУ серверу по TCP, он получает внешние адреса этих клиентов, получив их нужно реализовать прямую связь между ними (синие и зеленые стрелки) по UDP для передачи потокового аудио минуя мой сервер. (вроде как называется это UDP Hole Punching) вот тут я не понимаю, что в качестве портов указывать для UDP сервер-клиента?
  • iop © (30.12.16 12:31) [11]
    что в качестве портов указывать для UDP сервер-клиента?

    в качестве портов укажи номера портов.

    левый слушает порт 666 - скажи правому чтобы пулял на 666 порт
    правый слушает порт 777 - скажи левому чтобы пулял на порт 777

    оба на одном и том же слушают - скажи обоим на один и тот же порт пулять.
  • Signal (30.12.16 12:43) [12]
    это понятно, но в том то и дело, что я не пойму,
    допустим левый говорит правому что пулять на порт 777, т.е. на 203.12.67.12:777? тогда как именно будет этот проброс производится через NAT ведь там в данный момент нет такого условия в таблице? а есть только для 203.12.67.12:45728 -> 192.168.1.5:6778 созданный TCP соединением к моему серверу, или все таки чтобы он пулял на 203.12.67.12:45728 но по UDP? а слушать его в клиенте на порту 6778?
    я думаю, что так вроде должно быть
  • iop © (30.12.16 12:46) [13]
    это понятно, но в том то и дело, что я не пойму,

    тут ровно одна половина фразы лишняя.

    допустим левый говорит правому что пулять на порт 777,

    не левый говорит правому пулять в 777
    а ТЫ говоришь правому, чтобы правый пулял левому в 777
  • iop © (30.12.16 12:52) [14]
    тогда как именно будет этот проброс производится через NAT ведь там в данный момент нет такого условия в таблице?

    у тебя есть знакомая семья.
    живет по адресу ул ленина д1 кв 2
    в семье есть маша, вася и петя.

    напиши письмо положи в конверт, и напиши на нем:
    ленина д1 кв2 лично эмманулилу канту в руки.

    потом подумай, получит ли эмануил кант это письмо.

    не получит.
    потому что его по этому адресу нет.

    и твой правый клиент ничего не получит, потому что пакет до роутера дойдет, и "остановится"

    потому что роутер сам ничего на порту udp/777 не слушает,
    и понятия не имеет, что пакет предназначен для адреса в его лан сегменте.
  • Signal (30.12.16 13:24) [15]

    > потому что роутер сам ничего на порту udp/777 не слушает,
    >
    > и понятия не имеет, что пакет предназначен для адреса в
    > его лан сегменте.

    так вот за это я и спрашиваю!! как это сделать!
  • Signal (30.12.16 13:29) [16]
    а конкретнее UDP Hole Punching, ICQ это ведь делает!
  • iop © (30.12.16 13:29) [17]
    затрудняюсь ответить.

    сделать руками - не вариант.
    сделать ногами - уже было.

    ну взглядом попробуй.....
    хотя завтра же новый год и дед мороз.
    пиши ему письмо, завтра отдашь.
  • дед мороз (31.12.16 02:53) [18]
    а если NAT за NAT-ом за NAT-ом за NAT-ом ...
  • megavoid © (31.12.16 02:58) [19]
    1. отправляешь с клиента А udp пакет серверу, тот запоминает ип1:порт1, откуда пакет пришел, а на рутере у А создаётся запись в таблице ната
    2. отправляешь с клиента B udp пакет серверу, тот также запоминает ип2:порт2, откуда пришло, и рутер В тоже запоминает маппинг
    3. сервер сообщает и А, и В ип:порты собеседников
    теперь А может слать udp "напрямую" на ип2:порт2, а В - на ип1:порт1
    вот и весь hole punching; иногда может и не сработать; плюс записи в таблицах ната могут отвалиться по таймауту
 
Конференция "Начинающим" » Помогите реализовать связь клиентов между собой из под NAT
Есть новые Нет новых   [118232   +26][b:0][p:0.001]