You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailscale/ipn/ipnlocal
Simon Law e84e58c567 ipn/ipnlocal: use rendezvous hashing to traffic-steer exit nodes
With auto exit nodes enabled, the client picks exit nodes from the
ones advertised in the network map. Usually, it picks the one with the
highest priority score, but when the top spot is tied, it used to pick
randomly. Then, once it made a selection, it would strongly prefer to
stick with that exit node. It wouldn’t even consider another exit node
unless the client was shutdown or the exit node went offline. This is
to prevent flapping, where a client constantly chooses a different
random exit node.

The major problem with this algorithm is that new exit nodes don’t get
selected as often as they should. In fact, they wouldn’t even move
over if a higher scoring exit node appeared.

Let’s say that you have an exit node and it’s overloaded. So you spin
up a new exit node, right beside your existing one, in the hopes that
the traffic will be split across them. But since the client had this
strong affinity, they stick with the exit node they know and love.

Using rendezvous hashing, we can have different clients spread
their selections equally across their top scoring exit nodes. When an
exit node shuts down, its clients will spread themselves evenly to
their other equal options. When an exit node starts, a proportional
number of clients will migrate to their new best option.

Read more: https://en.wikipedia.org/wiki/Rendezvous_hashing

The trade-off is that starting up a new exit node may cause some
clients to move over, interrupting their existing network connections.
So this change is only enabled for tailnets with `traffic-steering`
enabled.

Updates tailscale/corp#29966
Fixes #16551

Signed-off-by: Simon Law <sfllaw@tailscale.com>
6 months ago
..
testdata ipn/ipnlocal: fix the path for writing cert files (#7203) 3 years ago
autoupdate.go clientupdate: return true for CanAutoUpdate for macsys (#12746) 2 years ago
autoupdate_disabled.go ipn/ipnlocal: periodically run auto-updates when "offline" (#12118) 2 years ago
breaktcp_darwin.go cmd/tailscale: add debug commands to break connections 2 years ago
breaktcp_linux.go cmd/tailscale: add debug commands to break connections 2 years ago
bus.go ipn/ipnlocal: fix build, remove another Notify.BackendLogID reference that crept in 1 year ago
bus_test.go ipn/ipnlocal: add IPN Bus NotifyRateLimit watch bit NotifyRateLimit 1 year ago
c2n.go ipn: add missing entries for OpenBSD 7 months ago
c2n_pprof.go ipn/ipnlocal: add c2n /debug/pprof/allocs endpoint 2 years ago
c2n_test.go util/cmpx: delete now that we're using Go 1.22 2 years ago
cert.go ipn/ipnlocal: include previous cert in new ACME orders (#15595) 9 months ago
cert_js.go ipn/ipnlocal: add c2n method to check on TLS cert fetch status 2 years ago
cert_test.go ipn/ipnlocal, envknob: make it possible to configure the cert client to act in read-only mode (#15250) 10 months ago
dnsconfig_test.go ipn/ipnlocal: add localNodeContext with netmap-related fields and methods 8 months ago
drive.go drive,ipn/ipnlocal: calculate peer taildrive URLs on-demand 6 months ago
expiry.go all: add Node.HomeDERP int, phase out "127.3.3.40:$region" hack [capver 111] 12 months ago
expiry_test.go cmd/viewer,types/views,various: avoid allocations in pointer field getters whenever possible 12 months ago
extension_host.go ipn/ipnlocal: make GetExt work earlier, before extension init 8 months ago
extension_host_test.go ipn/ipnlocal: fix missing defer in testExtension.Shutdown 6 months ago
local.go ipn/ipnlocal: use rendezvous hashing to traffic-steer exit nodes 6 months ago
local_test.go ipn/ipnlocal: use rendezvous hashing to traffic-steer exit nodes 6 months ago
loglines_test.go net/netmon: publish events to event bus 9 months ago
network-lock.go ipn/ipnlocal: make pricing restriction message for Tailnet Lock clearer 7 months ago
network-lock_test.go ipn: generate LoginProfileView and use it instead of *LoginProfile where appropriate 11 months ago
node_backend.go ipn/ipnlocal: update PeerByID to return SelfNode and rename it to NodeByID (#16096) 6 months ago
node_backend_test.go ipn/ipnlocal,wgengine/magicsock: use eventbus for node & filter updates (#16271) 7 months ago
peerapi.go ipn/ipnlocal: add some verbose logging to taildrive peerapi handler 7 months ago
peerapi_h2c.go all: update copyright and license headers 3 years ago
peerapi_macios_ext.go net/netmon, add: add netmon.State type alias of interfaces.State 2 years ago
peerapi_test.go feature/taildrop, ipn/ipnlocal: remove leftover dup calls to osshare 8 months ago
prefs_metrics.go health, ipn/ipnlocal: add metrics for various client events (#15828) 8 months ago
profiles.go health, ipn/ipnlocal: add metrics for various client events (#15828) 8 months ago
profiles_notwindows.go ipn/ipnlocal: refactor and cleanup profileManager 1 year ago
profiles_test.go feature,ipn/ipnlocal: add profileManager.StateChangeHook 8 months ago
profiles_windows.go ipn/ipnlocal: refactor and cleanup profileManager 1 year ago
serve.go ipn/ipnlocal: add localNodeContext with netmap-related fields and methods 8 months ago
serve_test.go ipn/ipnlocal,wgengine{/magicsock}: replace SetNetworkMap with eventbus (#16299) 7 months ago
ssh.go all: remove non-applicable "linux" deps on Android 8 months ago
ssh_stub.go all: remove non-applicable "linux" deps on Android 8 months ago
ssh_test.go ipn/ipnlocal: plumb health.Tracker into profileManager constructor 2 years ago
state_test.go cmd/tailscale/cli,ipn/ipnlocal: restrict logout when AlwaysOn mode is enabled 6 months ago
web_client.go ipn/ipnlocal: add localNodeContext with netmap-related fields and methods 8 months ago
web_client_stub.go all: use new LocalAPI client package location 11 months ago