Dear GNU-net developers,
Sorry to be bugging you. I am currently working on a new NAT traversal technique and I could use YOUR help.
It's based off a combination of UDP hole punching, symmetric NAT traversal via UDP flooding, and TCP hole punching in order to handle the corner cases when the clients are behind large scale NAT (like AT&T 3G/4G) and when the client is behind a network that blocks all UDP traffic. It is designed to work without root privileges and it should be re-usable in a variety of applications that require NAT traversal.
I apologize because this project isn't only for gnunet.
For this job, I need someone who can implement TCP hole punching and someone who can abstract TCP socket and UDP socket into a higher order Reliable socket that can forward some of its functionality to either TCP or UDP depending on what concrete subclass of socket the NAT traversal was able to obtain.
So basically the control flow goes like this:
Find out if the NATs are symmetric or not.
if not symmetric, use regular UDP hole punching
if symmetric, use UDP flooding (I believe I can do this implementation without you)
if UDP is blocked (UDP hole punching fails even after a retry), try TCP hole punching
if no form of NAT punching works that does not require root privileges, give up
if one form of NAT punching works, give the client a reliable socket that can either be some sort of UDP implementation of TCP (uTP, psudo-TCP, UDP over TCP, UDT, etc.) or an actual TCP socket. The client doesn't have to actually know if they are using UDP to TCP. All the client does is request a reliable socket and use it to send data.
This is my design.