Что использует BitTorrent и Gnutella для обхода NAT при передаче файлов?
Я пытаюсь выполнить p2p файл для обмена файлами на Java.
Мне интересно изучать использование сокета, поэтому я не буду использовать JXTA или какой-либо API.
Я прочитал о пробивке отверстий в TCP, и он может не работать для всех типов NAT.
Но я вижу, что Gnutella и BitTorrent всегда работают на каждой машине /NAT, которую я пытаюсь.
Так они используют TCP Hole Punching для инициирования соединения между хостами?
Кроме того, такой код мог бы сделать пробивку TCP Hole?
final ServerSocket s = new ServerSocket(7777);
Thread t = new Thread(new Runnable(){
public void run() {
try
{
s.accept();
}
catch(Exception ex)
{
}
}
});
Socket sock = new Socket();
sock.connect(new InetSocketAddress("IP ADDRESS", 7777), 50000);
Ответы
Ответ 1
После моего исследования я обнаружил, что TCP не подходит для обхода NAT, а TCP Hole Punching - это не 100% -ный метод sucesfull.
Лучший способ - использовать UDP и реализовать над ним уровень допуска, так как он будет работать как TCP.
Также есть некоторые API, такие как UDT для Java. Но я еще не пробовал
http://sourceforge.net/projects/udt-java/
Ответ 2
Я думаю, что Universal Plug and Play (UPnP) - это протокол, который позволяет вам программировать переадресацию портов в маршрутизаторе. Я не уверен, что это единственный метод, который используют эти программы.
Взгляните на проект UPnP PortMapper для реализации Java.
Эта статья CodeProject также выглядит неплохо, хотя это не Java: Использование UPnP для программных переадресаций портов и NAT Traversal.
Ответ 3
Вы должны сначала прочитать обход NAT в Википедии.
Однако на самом деле в основном используемые способы - UPnP, STUN, TURN, а также ICE, который является комбинацией STUN и TURN.
Поскольку TCP является протоколом, ориентированным на соединение, NAT могут управлять им для каждого соединения и отбрасывать все пакеты, когда соединение завершено.
Но UDP без установления соединения, и ответ может исходить из разных портов или разных адресов (по сравнению с исходным пунктом назначения). Кроме того, нет точного тайм-аута для сообщения UDP. Таким образом, обычно для NAT существует меньше ограничений для UDP.
В результате многие из этих P2P-инструментов используют UDP или некоторые виды протоколов на основе UDP, таких как microTP, RUDP, UDT или даже SCTP через UDP (на основе WebRTC).
Вы также можете узнать из статей об обходах NAT, RFC и BEP (документы BitTorrent).
Изменить: есть еще один интересный способ - обход ICMP. Фактически ICMP (особенно сообщение с превышением TTL) имеет еще меньше ограничений, чем UDP на NAT, поскольку сообщение об ошибке может быть отправлено со всех уголков Интернета, а маршрутизаторы с NAT не могут знать, что эти сообщения не являются истинными. Однако для отправки ICMP-пакетов требуется разрешение root для Unix-подобных систем и разрешение администратора на Windows.