Я имею в виду, если кто-то скачивает у меня файл, разве это не означает, что я являюсь хостом, и он подключается ко мне?
Или я подключаюсь к нему?
В любом случае кому-то из нас нужен открытый порт, не так ли?
У меня нет открытого порта маршрутизации к моему компьютеру на маршрутизаторе. Как же тогда я принимаю соединения?
решение1
Если ваш маршрутизатор поддерживает UPnP, возможно, что используемое вами приложение p2p открывает порты на маршрутизаторе без необходимости ручной настройки открытых портов.
В противном случае, возможно, ваше приложение использует процесс, называемый NAT traversal, который распространен в p2p-приложениях и приложениях удаленного рабочего стола, таких как GoToMyPC или Hamachi. Эта технология предназначена для работы через Network Address Translation, который считается брандмауэром, но также является средством для частной сети, разделяющей один IP-адрес в Интернете (то, что использует ваш маршрутизатор).
решение2
В протоколах типа BitTorrent, пока одна из двух сторон соединения имеет включенную переадресацию портов, открытая сторона всегда будет выступать в качестве хоста. Если обе стороны открыты, любой конец может быть «хостом». Если обе стороны закрыты, вам нужна третья сторона, у которой есть открытое соединение, чтобы договориться о соединении, вот как это делают такие вещи, как Skype (третья сторона называется Supernode)
Вот хороший пост в блогеобъясняя, как Skype использует Supernodes и как он использует их для обхода брандмауэров.
решение3
Я бы сравнил открытый порт с телефонным номером.
Представьте себе, что у вас есть телефон, на который можно позвонить, но нет номера телефона, на который можно принимать звонки.
Для того, чтобы два человека говорили друг с другом (или один говорил все время), неважно, кто на самом деле набирает номер. Важно, чтобы хотя бы у одного из них был номер телефона, тогда другой партнер просто ему позвонит.
Если ни у кого из них нет телефонного номера, в некоторых системах используется суперузел, который может быть другом, который принимает два звонка, по одному от каждого из них, и объединяет их вместе. Это единственный способ поговорить, если ни у кого из двух участников нет телефонного номера. Проблема в том, что тогда разговор ограничивается качеством телефонной линии этого друга суперузла.
Надеюсь, эта аналогия облегчит понимание трех возможных сценариев.