С# одноранговая сеть - обход маршрутизаторов

Я хочу закодировать одноранговую программу чата на С#. Я пытаюсь выяснить, как будет работать сеть. Я знаю, что концепция заключается в том, что каждый пир является клиентом и сервером одновременно. Он может подключаться и быть подключенным. Но мой вопрос: как подключиться к компьютеру за маршрутизатором без переадресации порта на этот компьютер? Я знаю, что такие вещи, как Bittorrent, делают это без проблем. Я планировал использовать трекер для ведения списка пиров и портов, которые они прослушивают, но я до сих пор не понимаю, как решить проблему с маршрутизатором. Может кто-нибудь объяснить?


person The.Anti.9    schedule 25.04.2010    source источник


Ответы (3)


В дополнение к ответу Джона Феминеллы вы можете рассмотреть возможность использования службы UPNP, которую поддерживают многие потребительские сетевые устройства. .

person President James K. Polk    schedule 25.04.2010

Вы правы, это не тривиально. Проблема заключается в том, что называется NAT или преобразование сетевых адресов. По сути, IP-адрес, который у вас есть в вашей собственной локальной сети, уникален, но в более широком контексте общедоступного Интернета многие люди за одним и тем же маршрутизатором будут иметь один и тот же общедоступный IP-адрес. Таким образом, имея IP-адрес и некоторые данные, вы не всегда можете сказать, какой человек на другом конце должен их получить.

Наиболее эффективным и простым решением является использование третьей стороны для посредничества в соединении, которая встраивается в поток данных. Вместо того, чтобы каждый человек в чате был «клиентом» и «сервером» одновременно, есть только один сервер, и он находится в общеизвестном публичном месте; тогда все подключаются к нему. Затем сервер управляет коммуникациями и отправляет сообщения людям, когда они общаются.

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

person John Feminella    schedule 25.04.2010
comment
server == прослушивание соединений на порту. - person President James K. Polk; 26.04.2010
comment
@Greg: Я, наверное, мог бы сформулировать это лучше. Я имел в виду, что ... вместо того, чтобы использовать хорошо известную конечную точку и известный порт, вы можете просто иметь хорошо известный порт, если все заранее настроят все и все сверстники известны друг другу. Не очень полезно для программы чата, но это возможно. - person John Feminella; 26.04.2010

Я предполагаю, что вы имеете в виду в среде NAT, и если это так, прочитайте и поймите Peer-to - Одноранговая связь через трансляторы сетевых адресов (Ford, Srisuresh & Kegel.

Ключевая концепция заключается в том, что каждый клиент должен инициировать соединение, которое откроет путь через устройство NAT. Может быть полезно обратиться к исходному коду Pidgin, чтобы получить некоторые идеи.

person Richard Harrison    schedule 25.04.2010