Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Соединение по динамических адресах


Автор: SVN74 18.3.2009, 00:14
Интересно существует ли в интернете какая ни будь возможность соединить два компа (на прямую) с динамическими IP, не используя сервера-посредника? 
Может есть какие ни будь для этого универсальные ресурсы в интернете, позволяющие как то временно зафиксировать временные адреса как постоянные (не зависимо от провайдера)?

Автор: dumb 18.3.2009, 03:22
http://www.google.ru/search?q=dyndns

Автор: SVN74 22.3.2009, 11:27
Да, хорошая штучка, но с NAT такой номер не пройдет...
Конечно, по любому придется  использовать сервер- посредник, но для большого количества клиентов и с большим объемом данных этот вариант не очень хорош, - причина линия интернета на сервере просто не сможет пропускать через себя большие объемы информации, причем надо без задержек. И тут постает вопрос, возможно ли обдурить (клиентскую) сторону создав первоначально соединение с динамических адресов двух клиентов с сервером на статике, а затем сервер соединит их сокеты и распрощается с ними, затем клиенты смогут работать между собой вне сервера.
Конечно, это с области фантастики, но как известно нет ничего невозможного.
Может кто ни будь слышал о таких извращениях?

Автор: Олег2005 22.3.2009, 11:31
Наверно P2P - торрент сети именно так и дeлают, по моему?

Автор: SVN74 30.3.2009, 20:33
Да, Р2Р примерно так и работает, но в большей части по статических адресах, а динамические все равно через соседние сервера.
Интересно , как известно при создании сокета между клиентом и сервером, - сервер получает инфу о клиенте в виде IP и Порта (обратного), возможно ли “законектить”  на стороне (динамического) клиента его сервер(с таким же номером порта)  по полученному от клиента порту?

Автор: Олег2005 30.3.2009, 21:47
Обычно говорится, что порт однозначно определяет приложение (одно) 
Но есть опция SO_REUSEPORT. Мож ее каким-то боком можно?
Не могу точно сказать smile 

Автор: vinick 30.3.2009, 23:39
Если брандмауэр, который обеспечивает NAT для динамических клиентов, умеет трассировать соединения по протоколам типа FTP. то можно попробовать замаскироваться под этот протокол и передать данные для второго соедиения. Тогда брандмауер пробросит внешний порт на внутренний, и второй динамический клиент сможет присоединится к первому. Ну а если есть возможность написать и подключить к брандмауэру свой модуль трассировки, то и маскироваться не надо.

Автор: SVN74 31.3.2009, 00:00
То бишь если я правильно понял обратный порт от клиента - это и есть пропущенный порт через firewall NAT(а) и возможно подконектиться к ждущему серверу(на стороне динамического клиента) по данному порту, главное не разрывать соединение с главным сервером ???

Автор: vinick 31.3.2009, 12:06
Вроде да. Но это только идея. На практике я такого не делал и не видел. 
вот выдержка из документации по http://www.opennet.ru/docs/RUS/iptables/#COMPLEXPROTOCOLS
Цитата

В качестве первого примера рассмотрим протокол FTP. Протокол FTP сначала открывает одиночное соединение, которое называется "сеансом управления FTP" (FTP control session). При выполнении команд в пределах этого сеанса, для передачи сопутствующих данных открываются дополнительные порты. Эти соединения могут быть активными или пассивными. При создании активного соединения клент передает FTP серверу номер порта и IP адрес для соединения. Затем клент открывает порт, сервер подключает к заданному порту клиента свой порт с номером 20 (известный как FTP-Data) и передает данные через установленное соединение.

Проблема состоит в том, что брандмауэр ничего не знает об этих дополнительных подключениях, поскольку вся информация о них передается через область данных пакета. Из-за этого брандмауэр не позволит серверу соединиться с указанным портом клиента.

Решение проблемы состоит в добавлении специального вспомогательного модуля трассировки, который отслеживает, специфичную для данного протокола, информацию в области данных пакетов, передаваемых в рамках сеанса управления. При создании такого соединения, вспомогательный модуль корректно воспримет передаваемую информацию и создаст соответствующую запись в таблице трассировщика со статусом RELATED, благодаря чему соединение будет установлено. Рисунок ниже поясняет порядок выполнения подобного соединения.


Кроме ftp есть и другие протоколы для которых необходимо обратное соединение. 

Автор: SVN74 9.4.2009, 22:29
Вот провел эксперимент: На внешнем IP запустил сервер, далее с посторонней сети (имеющей внутренний IP с центральным шлюзом NAT) запустил клиента на "коннект TCP" к указанному адресу, - установилась связь без проблем и внешний IP получил обратный IP и ПОРТ клиента(соединение не разрываю), далее хочу «законнектить»  клиента со стороны сервера по указанному (обратному) ПОРТУ клиента, для чего сначала пытаюсь запустить сервер на стороне клиента (внутреннем адресе) и вот тут та сервер и  выдает сообщение (обычно разрешается запускать только один сервер по указанному порту), ну оно и понятно, ведь порт уже занять клиентом...
==========
Как можно было бы все таки запустить (принудительно) сервер по указанному порту (на стороне клиента)?
Таким способом на мой взгляд любой другой хост(с внутренним IP) может «законнектиться»  к другому хосту(с внутренним IP) , зная его обратный порт и адрес (действующего соединения с центральным сервером), то бишь у внутреннего хоста  появляются ворота во внешний мир (по определенному порту).
==========
я прав???  smile 
========== 
кстати UDP и TCP сервера свободно работают по одному порту, буду пробовать подсесть на TCP с помощью UDP... 

Автор: J0ker 9.4.2009, 23:48
даю маячек
для соединения двух сокетов слушающий сокет совершенно необязателен - можо соединить два акивных сокета если они знают адреса друг друга

Автор: J0ker 10.4.2009, 00:55
Цитата(SVN74 @  9.4.2009,  22:29 Найти цитируемый пост)
кстати UDP и TCP сервера свободно работают по одному порту, буду пробовать подсесть на TCP с помощью UDP... 

не получится
сокет иденифицируется связкой протокол+адрес+порт

Автор: Artemon 10.4.2009, 06:07
SVN74, у меня следующая мысль,
если послать UDP пакет с внутреннего IP на белый IP, то в NAT какое-то время будет запись о том, что мы обращаемся к белому IP, это нужно для  того чтобы можно было в ответ (внутреннему IP) пысылать какие-либо данные, которые уже будут пробрасываться с NAT на внутренний IP.
Иначе не организовать взаимодействие через NAT.

Так вот, есть задумка, что если на обратный порт и IP (который пришел в UDP пакете), послать ответный покет с любого другог IP, то он будет принят. Но это лишь мои догадки.

Вы провели подобный опыт, но как я понял на TCP/IP, попробуйте тоже самое, но на UDP.


Автор: SVN74 10.4.2009, 18:25
Всем большое спасибо за внимание, обязательно буду пробовать все возможные шаги, как только, что ни будь "на пробую", - обязательно сообщу...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)