Performance over long hauls

I’ve have the unfortunate “luck” of discovering the wonderful aspects of using TCP over high BDP networks (Bandwidth Delay Product), where TCP performs miserably over networks with very large bandwidths (say 100Mbit/s) and high distances (15k miles, in some of my cases).

One of the ways around this I’ve employed so far was the use of udp based tools like uftp whose main saving grace (except for having and abominal cli interface) is that it simply blasts the other side with udp packets and re-transmits the failed chunks in a second, then third and so forth passes.

This sort of technique, has been able to provide almost full BW over long hauls for me, where all previous methods had failed.

I would like to perhaps understand a bit more about how pulse/syncthing works, and start by asking, is there a way to force pulse to use UDP?

But I’d be nice to have encryption too somehow.

Yeah, it’s something that’s going on a little bit in the background. Now and then when I have time over I make baby steps towards implementing UDT or similar in Go (but not much progress there yet), and another approach could be to change BEP to be easier used directly on top of unreliable messages. That would require reworking the encryption mostly, since we can’t rely on TLS solving it for us.

There is DTLS for encryption, though I don’t see a Go package that supports it; you’d have to bind to OpenSSL or something.

Yeah, exactly. I’d prefer not going down that route.

1 Like