2016-01-26 13 views
0

В настоящее время я выполняю приложение p2p (UDP) в C, используя метод «дырочной штамповки». Я нашел действительно иллюстрирующую предыдущие записи Дж. Селби, где он объясняет основы и продолжал соответственно (post1, post2), но, вероятно, я что-то пропустил, и только один из сверстников получает данные, а другой - нет.Приложение P2P, пробивка отверстий не работает для независимого отображения точки доступа NAT

Вот шаги, которые я принимаю:

  • установка: Один из узлов подключен к сотовому ключу 4G (NAT A), а другой подключен к маршрутизатору, который идет к провайдеру провайдера (NAT B). Это результаты, полученные для stunclient (клиент каскадера) для обоих NAT.

    NAT A: 
    Binding test: success 
    Local address: X1:48383 
    Mapped address: Y1:28265 
    Behavior test: success 
    Nat behavior: Endpoint Independent Mapping 
    Filtering test: success 
    Nat filtering: Address and Port Dependent Filtering 
    
    NAT B: 
    Binding test: success 
    Local address: X2:49158 
    Mapped address: Y2:49158 
    Behavior test: success 
    Nat behavior: Endpoint Independent Mapping 
    Filtering test: success 
    Nat filtering: Address and Port Dependent Filtering 
    

Теперь, согласно этим результатам, это мое понимание, что оба NATs имеют разумное поведение и перфорирования может добиться успеха (обратите внимание, что NAT А не делать сохранение порта).

  • перфорация попытка: Оба клиента связаться с сервером общественного облицовочного (STUN/Rendezvous) с помощью UDP обнаружить/обмен IP: пары портов. Когда каждый из клиентов получает ответ от сервера, они отправляют дейтаграмму UDP на другой одноранговый узел (ip: порт, как видно на связанном публичном сервере), а затем приступают к отправке еще нескольких сообщений и получают ответ и отправляют сообщение на адрес из которого он пришел. Я отправляю дейтаграммы, используя тот же сокет, который связался с общедоступным сервером, только меняя порт назначения ip: порт на функцию sendto.

Дело в том, что хост за NAT A (подключенный к 4G-ключу) всегда получает сообщение и, несмотря на ответ на правильный ip и порт назначения, другой позади (NAT B) никогда не получает сообщение. Любые идеи, что я здесь отсутствует? или как диагностировать проблему?

Спасибо заранее.

ответ

-2

Это стандартный и общий сценарий, когда вызов p2p (одноранговый) между сетью сотовой сети и Wi-Fi (ISP) невозможен. Теперь почему?

Почему ?: Вся сотовая сеть использует экономичный метод, при котором пользователь не может иметь выделенный публичный IP или NAT. Значение мобильных IP-адресов может измениться через несколько часов или около того. В результате поставщик сотовой сети может использовать меньшее количество публичных IP-адресов для огромного количества пользователей. Этот процесс обычно выполняется путем назначения нового ip: порта для каждого запроса, который является функцией symmetric NAT. Таким образом, в вашем случае, когда NAT B равен Nat filtering: Address and Port Dependent Filtering, это означает, что если данные поступают из NAT, у него есть уникальный ip: порт для каждого отправления/запроса, тогда NAT B будет фильтровать данные, и вызов завершится с ошибкой.

В общем, вам нужен сервер ретрансляции, размещенный на общедоступном IP-адресе, который будет получать данные от A и пересылать их на B и B, также будет делать это без какой-либо фильтрации. Этот вид сервера называется TURN server.

Теперь я не знаю, почему ваш тестовый клиент каскадера обнаруживает PRC NAT(Nat filtering: Address and Port Dependent Filtering) как для A, так и для B. Для A это должен быть Symmatric NAT, как в сотовой сети.