From 71c230bc146549316146e18b18cff2986b0ee249 Mon Sep 17 00:00:00 2001 From: Gopherfarm Date: Fri, 8 Mar 2024 10:42:14 +0800 Subject: [PATCH 1/7] feat: add connection selection logic --- p2p/net/swarm/swarm.go | 49 +++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index a76edce6ce..f34a5c449d 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -18,6 +18,7 @@ import ( "github.com/libp2p/go-libp2p/core/peerstore" "github.com/libp2p/go-libp2p/core/transport" "golang.org/x/exp/slices" + manet "github.com/multiformats/go-multiaddr/net" logging "github.com/ipfs/go-log/v2" ma "github.com/multiformats/go-multiaddr" @@ -571,18 +572,10 @@ func (s *Swarm) ConnsToPeer(p peer.ID) []network.Conn { } func isBetterConn(a, b *Conn) bool { - // If one is transient and not the other, prefer the non-transient connection. - aTransient := a.Stat().Transient - bTransient := b.Stat().Transient - if aTransient != bTransient { - return !aTransient - } - - // If one is direct and not the other, prefer the direct connection. - aDirect := isDirectConn(a) - bDirect := isDirectConn(b) - if aDirect != bDirect { - return aDirect + aPriority := connPriority(a) + bPriority := connPriority(b) + if aPriority >= bPriority { + return false } // Otherwise, prefer the connection with more open streams. @@ -602,6 +595,38 @@ func isBetterConn(a, b *Conn) bool { return true } +func connPriority(c *Conn) int { + if c == nil { + return 0 + } + + var priority int + // LAN > WAN > PROXY + switch { + case c.conn.Transport().Proxy(): + priority += 10 + case manet.IsPrivateAddr(c.RemoteMultiaddr()): + priority += 20 + case manet.IsPublicAddr(c.RemoteMultiaddr()): + priority += 15 + } + + // We prefer udp protocols + switch c.ConnState().Transport { + case "quic", "quic-v1", "webtransport", "webrtc": + priority += 5 + case "tcp", "websocket": + priority += 3 + } + + // If one is transient and not the other, prefer the non-transient connection. + if !c.Stat().Transient { + priority += 2 + } + + return priority +} + // bestConnToPeer returns the best connection to peer. func (s *Swarm) bestConnToPeer(p peer.ID) *Conn { From 66034317cec4573a2058a7cb1028ac1e1b9ef5e6 Mon Sep 17 00:00:00 2001 From: Gopherfarm Date: Fri, 8 Mar 2024 10:56:40 +0800 Subject: [PATCH 2/7] fix: update return result --- p2p/net/swarm/swarm.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index f34a5c449d..29da622283 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -18,8 +18,8 @@ import ( "github.com/libp2p/go-libp2p/core/peerstore" "github.com/libp2p/go-libp2p/core/transport" "golang.org/x/exp/slices" + manet "github.com/multiformats/go-multiaddr/net" - logging "github.com/ipfs/go-log/v2" ma "github.com/multiformats/go-multiaddr" madns "github.com/multiformats/go-multiaddr-dns" @@ -575,7 +575,7 @@ func isBetterConn(a, b *Conn) bool { aPriority := connPriority(a) bPriority := connPriority(b) if aPriority >= bPriority { - return false + return true } // Otherwise, prefer the connection with more open streams. From b8d9c4e87a5e329726f2f4ca692dcd4087c15550 Mon Sep 17 00:00:00 2001 From: Gopherfarm Date: Fri, 8 Mar 2024 11:36:17 +0800 Subject: [PATCH 3/7] solve gofmt problem --- p2p/net/swarm/swarm.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index 29da622283..3632b141dc 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -19,10 +19,10 @@ import ( "github.com/libp2p/go-libp2p/core/transport" "golang.org/x/exp/slices" - manet "github.com/multiformats/go-multiaddr/net" - logging "github.com/ipfs/go-log/v2" - ma "github.com/multiformats/go-multiaddr" - madns "github.com/multiformats/go-multiaddr-dns" + logging "github.com/ipfs/go-log/v2" + ma "github.com/multiformats/go-multiaddr" + madns "github.com/multiformats/go-multiaddr-dns" + manet "github.com/multiformats/go-multiaddr/net" ) const ( From 35c6a17875eb7668d7a0c86ae46d7142f4c6ac8e Mon Sep 17 00:00:00 2001 From: Gopherfarm Date: Fri, 8 Mar 2024 14:27:27 +0800 Subject: [PATCH 4/7] solve gofmt problem --- p2p/net/swarm/swarm.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index 3632b141dc..40ed5c3352 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -18,11 +18,11 @@ import ( "github.com/libp2p/go-libp2p/core/peerstore" "github.com/libp2p/go-libp2p/core/transport" "golang.org/x/exp/slices" - - logging "github.com/ipfs/go-log/v2" - ma "github.com/multiformats/go-multiaddr" - madns "github.com/multiformats/go-multiaddr-dns" - manet "github.com/multiformats/go-multiaddr/net" + + logging "github.com/ipfs/go-log/v2" + ma "github.com/multiformats/go-multiaddr" + madns "github.com/multiformats/go-multiaddr-dns" + manet "github.com/multiformats/go-multiaddr/net" ) const ( From f19f3710b89f4a1b3376118decab17214a371cf6 Mon Sep 17 00:00:00 2001 From: Gopherfarm Date: Fri, 8 Mar 2024 15:21:34 +0800 Subject: [PATCH 5/7] reject transient links initially --- p2p/net/swarm/swarm.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index 40ed5c3352..9d73f4eae8 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -572,6 +572,14 @@ func (s *Swarm) ConnsToPeer(p peer.ID) []network.Conn { } func isBetterConn(a, b *Conn) bool { + // If one is transient and not the other, prefer the non-transient connection. + aTransient := a.Stat().Transient + bTransient := b.Stat().Transient + if aTransient != bTransient { + return !aTransient + } + + // Compare connection priorities and choose the better connection aPriority := connPriority(a) bPriority := connPriority(b) if aPriority >= bPriority { From afbcdebecf29af440c2cd4b998ec85e4cefafcca Mon Sep 17 00:00:00 2001 From: Gopherfarm Date: Fri, 8 Mar 2024 18:03:06 +0800 Subject: [PATCH 6/7] delete useless code --- p2p/net/swarm/swarm.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index 9d73f4eae8..d851a78672 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -627,11 +627,6 @@ func connPriority(c *Conn) int { priority += 3 } - // If one is transient and not the other, prefer the non-transient connection. - if !c.Stat().Transient { - priority += 2 - } - return priority } From d3c18a526207f7acdd65160914c5f1529f87738c Mon Sep 17 00:00:00 2001 From: wlynxg Date: Fri, 22 Mar 2024 15:24:05 +0800 Subject: [PATCH 7/7] update connection priority calculation --- p2p/net/swarm/swarm.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index 75cb52b9d2..0eff5a223f 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -613,19 +613,25 @@ func connPriority(c *Conn) int { // LAN > WAN > PROXY switch { case c.conn.Transport().Proxy(): - priority += 10 - case manet.IsPrivateAddr(c.RemoteMultiaddr()): priority += 20 + case manet.IsPrivateAddr(c.RemoteMultiaddr()): + priority += 100 case manet.IsPublicAddr(c.RemoteMultiaddr()): - priority += 15 + priority += 50 } // We prefer udp protocols switch c.ConnState().Transport { - case "quic", "quic-v1", "webtransport", "webrtc": + case "quic", "quic-v1": + priority += 10 + case "webtransport": + priority += 9 + case "webrtc": + priority += 8 + case "tcp": priority += 5 - case "tcp", "websocket": - priority += 3 + case "websocket": + priority += 4 } return priority