Почему клиенты BitTorrent могут связываться с серверами и другими одноранговыми узлами, даже если пользователь не настроил переадресацию портов на своих маршрутизаторах?
Конечно, скорость будет снижена по сравнению с переадресацией портов, но все же им удается общаться? Как???
Есть ли входящие порты, которые всегда открыты?
Входящие соединения выполняются третьим партнером.
Скажем, одноранговый узел A хочет подключиться к узлу F, который находится за брандмауэром. Затем одноранговый узел A сообщает одноранговому узлу B, который уже подключен к F, что он хочет подключиться к F. Затем F получает сообщение и подключается вместо этого к A. Я не знаю внутреннюю структуру протокола BT, но B может быть, например, трекер, поскольку он хорошо известен обоим сверстникам. Чтобы этот сценарий работал, A должен принимать входящие соединения. AFAIK в Gnutella, ультрапир F играл роль B. Этот сценарий обычно работает для TCP.
Для соединений UDP проверьте также пробивание отверстий UDP.
Если у клиента нет открытого порта (на языке большинства небольших резидентных маршрутизаторов), это блокирует только входящие соединения.
Машина за этим маршрутизатором все еще может инициировать соединения с другими. Как только это произойдет, маршрутизатор запомнит это и разрешит двустороннюю связь. NAT, функция, которая позволяет нескольким машинам совместно использовать один общедоступный IP-адрес, должна сделать это, чтобы работать.
Таким образом, связь возможна без открытых портов на вашем маршрутизаторе, это просто ваш компьютер должен инициировать это; внешний компьютер не может инициировать соединение с любым компьютером за этим маршрутизатором, если вы не откроете порт и не подключите порт к определенному IP-адресу за маршрутизатором.
Я не слишком увлечен низкоуровневыми деталями протокола bittorrent, но я думаю, что он или какая-то его версия позволяет машинам получать данные, как-то инициируя соединения с другими, а не просто прослушивая открытый порт и ожидая внешнего машина, чтобы начать соединение.