From 455a7cdea047bf520e36fbacc46cbe8bfb678c75 Mon Sep 17 00:00:00 2001 From: notsure2 Date: Sat, 10 Jun 2023 15:46:51 +0300 Subject: [PATCH] Implement TCP_NODELAY in client and server tcp connections. --- internal/client/connector.go | 17 +++++++++++++++++ internal/client/piper.go | 5 +++++ internal/server/dispatcher.go | 19 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/internal/client/connector.go b/internal/client/connector.go index 660862e..f3b41c0 100644 --- a/internal/client/connector.go +++ b/internal/client/connector.go @@ -4,6 +4,7 @@ import ( "net" "sync" "sync/atomic" + "syscall" "time" "github.com/cbeuw/Cloak/internal/common" @@ -31,6 +32,22 @@ func MakeSession(connConfig RemoteConnConfig, authInfo AuthInfo, dialer common.D goto makeconn } + tcpConn := remoteConn.(*net.TCPConn) + syscallConn, err := tcpConn.SyscallConn() + if err != nil { + panic(err) + } + + err = syscallConn.Control(func(fd uintptr) { + err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1) + if err != nil { + log.Errorf("setsocketopt TCP_NODELAY: %s\n", err) + } + }) + if err != nil { + panic(err) + } + transportConn := connConfig.TransportMaker() sk, err := transportConn.Handshake(remoteConn, authInfo) if err != nil { diff --git a/internal/client/piper.go b/internal/client/piper.go index 744c2de..1927012 100644 --- a/internal/client/piper.go +++ b/internal/client/piper.go @@ -129,6 +129,11 @@ func RouteTCP(listener net.Listener, streamTimeout time.Duration, singleplex boo log.Errorf("setsocketopt SO_RCVBUF: %s\n", err) } } + + err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1) + if err != nil { + log.Errorf("setsocketopt TCP_NODELAY: %s\n", err) + } }) if err != nil { log.Fatal(err) diff --git a/internal/server/dispatcher.go b/internal/server/dispatcher.go index 4285ed3..2e499ed 100644 --- a/internal/server/dispatcher.go +++ b/internal/server/dispatcher.go @@ -9,6 +9,7 @@ import ( "io" "net" "net/http" + "syscall" "time" "github.com/cbeuw/Cloak/internal/common" @@ -294,6 +295,24 @@ func serveSession(sesh *mux.Session, ci ClientInfo, user *ActiveUser, sta *State } log.Tracef("%v endpoint has been successfully connected", ci.ProxyMethod) + tcpConn, ok := localConn.(*net.TCPConn) + if ok { + syscallConn, err := tcpConn.SyscallConn() + if err != nil { + return err + } + + err = syscallConn.Control(func(fd uintptr) { + err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1) + if err != nil { + log.Errorf("setsocketopt TCP_NODELAY: %s\n", err) + } + }) + if err != nil { + return err + } + } + go func() { if _, err := common.Copy(localConn, newStream); err != nil { log.Tracef("copying stream to proxy server: %v", err)