Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Не могу пробить NAT, UDP создает канал (3 стр)

Не могу пробить NAT, UDP создает канал (3 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
RammПостоялецwww5 дек. 201714:46#30
Dampire
Не знаю лучше. но я провел еще один эксперимент - с двух ПК в лок.сети создал клиентов и по одному порту отправил пакеты на сервер - у одного клиента пакеты приходили с другого порта, не того, что я забиндил. Т.е. сервер определял их как отправленные с порта 1, а не 443... Во как!
Хотя я думаю, это мой роутер их изменил...
Dampire, а что, симметричный нат такая редкая редкость?

Правка: 5 дек. 2017 14:55

ZabПостоялецwww5 дек. 201715:54#31
Может у тебя вообще не NAT? Может быть сеансовый внешний ip-адрес, провайдеры часто работают в таком режиме.
RammПостоялецwww5 дек. 201715:59#32
Zab
В личном кабинете на сайте провайдера написано, что подключен NAT... Можно отключить.
ZabПостоялецwww5 дек. 201716:10#33
Возможно тут какая-то фишка с NAT'ом на одного. Например, чтобы твои порты нельзя было просканировать.
Одни и те же порты на входе и на выходе легко назначить только если сквозь NAT подключен ровно один комп. Обычно то NAT стоит на роутере. У него то нет возможности так себя вести.
DampireПостоялецwww5 дек. 201716:18#34
Zab
Где ты видел спеки, что нат обязан менять порты? Даже древний ipfw если порт свободен мапит его прямиком, в ином случае выбирает какой хочет.
ZabПостоялецwww5 дек. 201716:21#35
Не обязан NAT менять порты, но что ему делать, если внутренних адресов много, а внешний один? И многие внутренние используют одинаковые порты.
RammПостоялецwww5 дек. 201716:31#36
Zab
> Возможно тут какая-то фишка с NAT'ом на одного.
Т.е. за натом я сижу один у провайдера? =)
Я вот тут отключил это нат в кабинете, перезапустил роутер, попробовал опять - вообще нет разницы, та же самая реакция сервера, тот же порт, что и биндил у клиента, высвечивается на сервере, нет ответа от сокета, на котороый я ничего не отправлял. Только IP сменился.
Я хз что это за хрень, я просто думал, что создавая игрушку, любой сможет создать лобби-хост-сервер и поиграть. Хрен там, хочешь создать сервак - купи постоянный IP или обзаведись белым адресом. Ну или хотя бы чтобы твой нат или роутер не резал пакеты... Ну и следующая проблема - это что, мне десяток VDS серверов покупать по всему миру?
И еще, я поставил Payday 2, создал лобби и нормально все играет. Вот как? Или у них есть сервера, через которые мой трафик во время игры гоняет (аналог комнаты)?
DampireПостоялецwww5 дек. 201716:32#37
О чем я и написал. Но тут оп напирая на твои слова про рандомные порты уверяет меня, что у него не PRC и удивляется смене порта при подключении второго хоста за натом.
Ramm
> а что, симметричный нат такая редкая редкость?
https://developers.google.com/talk/libjingle/important_concepts?csw=1
RammПостоялецwww5 дек. 201716:33#38
Zab
> Не обязан NAT менять порты, но что ему делать, если внутренних адресов много, а
> внешний один? И многие внутренние используют одинаковые порты.
А может НАТ анализировать пакеты, и обслуживать несколько клиентов одним портом?
DampireПостоялецwww5 дек. 201716:35#39
Нет, не может. Не может быть никакого анализа пакетов. Заголовки подменяются как раз чтобы все "просто работало". То что ты хочешь называется уже прокси, а не NAT.

Правка: 5 дек. 2017 16:37

Dmitry_MilkПостоялецwww5 дек. 201719:46#40
У меня идея для топикстартера - осуществлять обмен не TCP или UDP, а ICMP-пакетами. В них вроде как нет такой штуки, как порт, только sequential number уже в теле одного из типов ICMP, и я сильно сомневаюсь, что роутер полезет внутрь ICMP-пакета подменять его.

То есть, оба клиента посылают ICMP-пакет наружу на внешний IP партнера с заранее обговоренными sequential number. Поскольку ICMP из-за ната обычно проходит, значит роутер как-то выкручивается без всяческих подмен портов (которых тут просто нет), обходясь только подменой адреса, возможно максимум что он делает - проверяет sequential number у пришедшего снаружи пакета.

В работоспособности метода не уверен, но проверить было бы интересно.

RammПостоялецwww6 дек. 201711:42#41
Zab
> Может у тебя вообще не NAT? Может быть сеансовый внешний ip-адрес, провайдеры
> часто работают в таком режиме.
Zab оказался прав, фишка в том, что НАТ иногда отключается, я хз как и почему так происходит, после долгих и упорных тестов, а так же слежением за настройками в личном кабинете провайдера. Там эта галочка живет отдельной жизнью, либо оборудование не может моментально отреагировать...
В общем, ситуация такая, когда НАТ работает, все порты меняются. Не бывает такого, чтобы я дважды запустил прогу, отправил пакет, и сервер получил бы их с одного и того же порта. Тем более с того, что забиндил на клиенте.
Все те 3 страницы назад я наблюдал за натом своего роутера.
Сейчас пробую панчинг для его пробития и организации прямого сообщения клиентов... Тестирую на виртуалке и ОС, т.е. с одного ПК. Вопрос, так можно делать, или сеть не будет по определению так работать?
На виртуалке тоже настроен нат, для отправки в сеть она берет свободный порт в ОС.

Правка: 6 дек. 2017 11:42

DampireПостоялецwww6 дек. 201711:50#42
Как все запущено. У провайдера есть пул свободных адресов и пул адресов за nat (у двух в нашем городе так). Когда заканчивается пул свободных адресов - они кидают меня за nat. Если тебе нужно лезть в личный кабинет, а не на роутер, чтобы понять за натом ты или нет, то тебе еще рано в сетевое программирование лезть. Разберись для начала с приватными/публичными диапазонами адресов и вообще как работают провайдеры. А чтобы тестировать панчинг на виртуалке - делают мост, а не nat.
RammПостоялецwww6 дек. 201712:07#43
Dampire
> Если тебе нужно лезть в личный кабинет, а не на роутер, чтобы понять за натом
> ты или нет, то тебе еще рано в сетевое программирование лезть.
Блииин, точно, там же предоставленный адрес отображается.
Да у него прошивка настолько убогая и тормозная, что я на наго заходил 3 раза за все время. *так себе отмаз=)*

Правка: 6 дек. 2017 12:21

25cmПользовательwww11 дек. 201717:04#44
Представим сценарий когда КлиентА выступает в роли игрового сервера, а КлиентБ будет к нему коннектиться.
Оба клиента находятся за NAT. Ну и Сервер - с белым IP как посредник.

1) КлиентА отправляет пакет на Сервер({я сервер, мой адрес:addressA_portA}). Сервер, имея адрес КлиентаА, может отправлять ему пакеты.
2) Сервер отправляет КлиентуА пакет({ок, ты-сервер})
3) КлиентБ отправляет пакет на Сервер({дай список серверов}). Сервер, имея адрес КлиентаБ, может отправлять ему пакеты.
4) Сервер отправляет КлиентуБ пакет({список серверов, включая КлиентаА})
5) КлиентБ хочет подключиться к КлиентуА. КлиентБ отправляет пакет на Сервер({хочу подключиться к КлиентА}).
6) Сервер получает от КлиентаБ пакет и отправляет ответ ({жди}). КлиентБ ждет.
7) Сервер отправляет КлиентуА пакет ({КлиентБ хочет подключиться, вот его адрес: addressB_portB}).
8) КлиентА отправляет КлиентуБ пакет ({ignore_this_packet})
9) КлиентА отправляет Серверу пакет ({готов принять КлиентаБ})
10) Сервер отправляет КлиентуБ пакет ({КлиентА готов тебя принять, вот адрес: addressA_portA})
11) КлиентБ отправляет КлиентуА пакет ({connect})
12) КлиентА отправляет КлиентуБ пакет ({ok})
далее идет обмен между КлиентомА и КлиентомБ напрямую без сервера

Не нужны никакие UPnP и прочие приблуды. Только сервер с белым IP.
Клиенты могут иметь прямое подключение или находиться за NATом (или за двойным, тройным - пофиг)
Как бы клиент не был подключен к сети - если у него работает скайп - заработает и ЭТО.

Вся фишка в том, чтобы тот, к кому подключаются (КлиентА), пробил свой NAT для того, кто хочет подключиться (КлиентБ).
Это делается на этапе 8. Пакет, отправленный на этом этапе будет доставлен, но будет отброшен NATом КлиентаБ.
Или будет потерян (если используется UDP), но это не важно. Важно то, что NAT будет пробит со стороны КлиентаА для КлиентаБ.
После чего сервер уведомляет КлиентаБ о том, что тот может общаться с КлиентомА (этап 10).

Единственное что я бы посоветовал - использовать что-то типа LidgrenNetwork (Reliable UDP библиотека на C#).
Там поверх UDP создается эмуляция соединений и периодически отправляются пакеты (для контроля соединения).
А если ничего не слать - то через какое-то время NAT закроет доступ.

Страницы: 1 2 3 4 5 6 7 Следующая »

/ Форум / Программирование игр / Сеть

2001—2018 © GameDev.ru — Разработка игр