Open mxinden opened 3 years ago
Hi @mxinden,
thanks for the overview.
Remarks concerning hopr-connect:
Signaling Protocols
into TURN-like protocols
I think the description misses one of the main issues when reasoning about NAT traversal: there is a bunch of smaller protocols such as STUN, TURN, UPnP, TCP, and QUIC. Each of them is able to solve their main purpose for example STUN allows the discovery of public IPv4 addresses.
But the main issue is that a combination of these protocols is required to successfully bypass NATs, and this makes handling unsuccessful attempts and automatic fallbacks necessary. Otherwise you end up with a transport module that always fails on certain internet setups. Unfortunately, this is the most tricky part.
Updated the description:
I think the description misses one of the main issues when reasoning about NAT traversal: there is a bunch of smaller protocols such as STUN, TURN, UPnP, TCP, and QUIC. Each of them is able to solve their main purpose for example STUN allows the discovery of public IPv4 addresses.
I am not quite sure I follow. Each of these are listed in the table. An individual protocol in itself can not achieve NAT traversal by itself. Instead Projects, like HOPR connect, are combining various protocols to overcome a NAT.
But the main issue is that a combination of these protocols is required to successfully bypass NATs, and this makes handling unsuccessful attempts and automatic fallbacks necessary. Otherwise you end up with a transport module that always fails on certain internet setups. Unfortunately, this is the most tricky part.
Correct. This should be handled by the individual libp2p implementations. Today, if none of the direct connection approaches succeed, the fallback would be the circuit relay v1 protocol.
Added https://github.com/libp2p/go-libp2p/issues/1039 to project Flare as another reading resource.
Added @vasco-santos's proposal (https://github.com/protocol/web3-dev-team/pull/70/) as one of the projects involved in NAT traversal.
Changelog
Changelog
Changelog
Changelog
Changelog
Thanks for the update @mxinden!
@andreykiryushkin worth for you to take a dive on this now that you are exploring hopr-connect
Below sequence diagram depicts the process of Hole Punching with Project Flare. I have yet to find the right place for this to live long-term. Still I am posting it here in case others are looking for a high level overview already today.
Changelog
There is also a transport that "talks" to a running instance of tor and configures it: https://github.com/berty/go-libp2p-tor-transport
Changelog
Changelog
Thus all protocols for basic hole punching in rust-libp2p are in master
now :tada: If you want to punch holes yourself, check out https://github.com/libp2p/rust-libp2p/pull/2460.
Hey @mxinden, seems like a lot of work has been done lately around the rust
implementation. Would it be safe to say that teams looking to implement hole-punching from scratch using libp2p
API would be better off doing it via Rust?
go-libp2p is further ahead and supports QUIC which has better penetration succeess rate, so no this isnt an accurate statement.
a lot of work has been done lately around the
rust
implementation.
Yes, a lot of progress in regards to hole punching.
Would it be safe to say that teams looking to implement hole-punching from scratch using
libp2p
API would be better off doing it via Rust?
rust-libp2p does not yet have support for QUIC (see https://github.com/libp2p/rust-libp2p/pull/2289) which bears higher hole punchings success rates given that it is based on UDP. For now, rust-libp2p only supports TCP hole punching. As mentioned above by @vyzo, go-libp2p is further ahead with QUIC support and a more battle tested hole punching stack.
IPFS developed Delegate routers which can help connect nodes behind NAT as well as browser-based clients: https://github.com/ipfs/js-ipfs/blob/master/docs/DELEGATE_ROUTERS.md
Something like delegates could be ported to the libp2p core and a side-channel like DNS, or another bootstrap can be used to identify delegate nodes which can facilitate connectivity. IPFS Delegates do not support the full range of libp2p features like pub/sub.
This GitHub issue tracks the status of NAT traversal capabilities across libp2p implementations and platforms.
See Hole Punching document for greater picture.
Please comment below to suggest additions or corrections.
Projects
The following projects combine various protocols from the table below to achieve NAT traversal:
Project proposal: browser nodes can connect to any node out of the box
Protocols
None of the Protocols below enable NAT traversal by themselves. Instead combinations of these protocols do.
Keywords for search engines: hole punching, TCP, QUIC, WebRTC, UPnP, ICE, STUN, TURN, meta