Создание TCP-соединения между двумя компьютерами без сервера - PullRequest
4 голосов
/ 05 марта 2011
  • 2 компьютера находятся в разных подсетях.
  • Обе машины Windows.
  • Между ними есть 2-5 IGMP-совместимых маршрутизаторов.
  • Они могут соединяться друг с другом по протоколу многоадресной рассылки (они присоединились к одной группе многоадресной рассылки и знают о существовании друг друга).

Как установить надежное TCP-соединение между ними без какого-либо публичного сервера?

Язык программирования: C ++, WinAPI

(мне нужно TCP-соединение для отправки больших важных данных, которые я не могу доверить UDP)

1 Ответ

3 голосов
/ 06 марта 2011

Вы не указали язык программирования, поэтому весь этот вопрос может быть не по теме.

Подсети не проблема. Проблема с маршрутизируемостью. Либо есть настроенная маршрутизация, либо ее нет. Если они, например, оба находятся за блоками NAT, то вы зависите от конфигурации блоков nat. Если они находятся только в двух разных подсетях маршрутизируемой сети, администратор сети должен настроить маршрутизацию. Итак, у каждого есть IP-адрес, и каждый может обратиться к другому.

На одной машине вы собираетесь создать сокет, привязать его к какому-либо порту по вашему выбору и прослушать. С другой стороны, вы будете подключаться к IP-адресу первого компьютера + выбранному порту.

редактировать

Я собираюсь попробовать еще раз, но я чувствую, что здесь есть огромный концептуальный разрыв.

Когда-то был изобретен протокол TCP / IP. В первоначальной концепции каждый элемент в сети имел адрес IPV4, и каждая машина могла подключаться к любой другой машине через маршрутизацию, за исключением машин в «частном» адресном пространстве (10.x и т. Д.).

В самые первые дни единственными «подсетями» были «класс A, класс B, класс C». Позже была добавлена ​​идея разделения сети с помощью битовых масок. Понятие «подсеть» - это просто способ описания части сети, в которой все хосты могут доставлять пакеты друг другу одним скачком через некоторый транспорт или другой. В правильно настроенной сети это касается только драйверов операционной системы. Обычные программы просто адресуют пакеты по сети, и они приходят.

Реализация этого подключения всегда осуществлялась через протокол маршрутизации. Если у вас есть (физическая) сеть A здесь и (физическая) сеть B там, соединенные каким-то двухточечным каналом, машины на A должны знать, куда отправлять пакеты для B. Или, точнее говоря, им нужно знать, куда отправлять пакеты «не-А», а все, что они отправляют, должно знать, куда отправлять пакеты «В». В простых случаях это осуществляется с помощью явной конфигурации: правила маршрутизации, встроенные в коробки маршрутизатора или даже компьютеры с несколькими физическими интерфейсами. В более сложных случаях блоки маршрутизации взаимодействуют через протоколы, такие как EGP, BGP или IGMP, для изучения топологии сети.

Если вы используете команду Windows «route», вы увидите «маршрут по умолчанию», который система использует для отправки пакетов, которые должны покинуть локальную подсеть. Как правило, это адрес блока маршрутизатора, который отвечает за перемещение информации из локальной подсети в другое место.

Вся цель этой маршрутизации состоит в том, чтобы доставить туда пакет, отправленный с a.b.c.d на e.f.g.h. TCP ничем не отличается от UDP, за исключением того, что вы не можете туда попасть по многоадресной или широковещательной рассылке: вам нужно знать точный адрес вашего корреспондента.

DNS был изобретен, чтобы позволить узлам узнавать IP-адреса друг друга, не позволяя человеку отправлять их в сообщениях электронной почты.

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

Из вашего исходного сообщения я сомневаюсь, что здесь используется NAT. Я просто не понимаю ваш комментарий «У меня нет доступа к сети». Вы говорите, что отправили UDP-пакеты здесь и там. Так как ты это сделал? Какие адреса вы использовали?

...