diff --git a/pkg/core/server_client.go b/pkg/core/server_client.go
index 244d465..6f9639c 100644
--- a/pkg/core/server_client.go
+++ b/pkg/core/server_client.go
@@ -17,7 +17,7 @@ import (
 	"github.com/prometheus/client_golang/prometheus"
 )
 
-const udpBufferSize = 65535
+const udpBufferSize = 4096
 
 type serverClient struct {
 	CC              quic.Connection
diff --git a/pkg/relay/udp.go b/pkg/relay/udp.go
index c6b34ce..f02d227 100644
--- a/pkg/relay/udp.go
+++ b/pkg/relay/udp.go
@@ -10,7 +10,7 @@ import (
 	"github.com/HyNetwork/hysteria/pkg/core"
 )
 
-const udpBufferSize = 65535
+const udpBufferSize = 4096
 
 var ErrTimeout = errors.New("inactivity timeout")
 
diff --git a/pkg/socks5/server.go b/pkg/socks5/server.go
index 4cbd4dd..95c8d10 100644
--- a/pkg/socks5/server.go
+++ b/pkg/socks5/server.go
@@ -19,7 +19,7 @@ import (
 	"github.com/txthinking/socks5"
 )
 
-const udpBufferSize = 65535
+const udpBufferSize = 4096
 
 var (
 	ErrUnsupportedCmd = errors.New("unsupported command")
diff --git a/pkg/tproxy/udp_linux.go b/pkg/tproxy/udp_linux.go
index 0b684c8..1c07f49 100644
--- a/pkg/tproxy/udp_linux.go
+++ b/pkg/tproxy/udp_linux.go
@@ -8,7 +8,7 @@ import (
 	"github.com/LiamHaworth/go-tproxy"
 )
 
-const udpBufferSize = 65535
+const udpBufferSize = 4096
 
 type UDPTProxy struct {
 	HyClient   *core.Client
diff --git a/pkg/transport/pktconns/faketcp/obfs.go b/pkg/transport/pktconns/faketcp/obfs.go
index 2b44ebf..608503e 100644
--- a/pkg/transport/pktconns/faketcp/obfs.go
+++ b/pkg/transport/pktconns/faketcp/obfs.go
@@ -9,7 +9,7 @@ import (
 	"github.com/HyNetwork/hysteria/pkg/transport/pktconns/obfs"
 )
 
-const udpBufferSize = 65535
+const udpBufferSize = 4096
 
 type ObfsFakeTCPPacketConn struct {
 	orig *TCPConn
diff --git a/pkg/transport/pktconns/udp/obfs.go b/pkg/transport/pktconns/udp/obfs.go
index 073f786..d985e40 100644
--- a/pkg/transport/pktconns/udp/obfs.go
+++ b/pkg/transport/pktconns/udp/obfs.go
@@ -10,7 +10,7 @@ import (
 	"github.com/HyNetwork/hysteria/pkg/transport/pktconns/obfs"
 )
 
-const udpBufferSize = 65535
+const udpBufferSize = 4096
 
 type ObfsUDPPacketConn struct {
 	orig *net.UDPConn
diff --git a/pkg/transport/pktconns/udphop/common.go b/pkg/transport/pktconns/udphop/common.go
index cfe13e5..9205233 100644
--- a/pkg/transport/pktconns/udphop/common.go
+++ b/pkg/transport/pktconns/udphop/common.go
@@ -8,7 +8,7 @@ import (
 
 const (
 	packetQueueSize = 1024
-	udpBufferSize   = 2048
+	udpBufferSize   = 4096
 )
 
 // parseAddr parses the listen address and returns the host and ports.
diff --git a/pkg/transport/pktconns/wechat/obfs.go b/pkg/transport/pktconns/wechat/obfs.go
index 6e13696..2714b20 100644
--- a/pkg/transport/pktconns/wechat/obfs.go
+++ b/pkg/transport/pktconns/wechat/obfs.go
@@ -12,7 +12,7 @@ import (
 	"github.com/HyNetwork/hysteria/pkg/transport/pktconns/obfs"
 )
 
-const udpBufferSize = 65535
+const udpBufferSize = 4096
 
 // ObfsWeChatUDPPacketConn is still a UDP packet conn, but it adds WeChat video call header to each packet.
 // Obfs in this case can be nil
diff --git a/pkg/tun/udp.go b/pkg/tun/udp.go
index 8bfb030..f824699 100644
--- a/pkg/tun/udp.go
+++ b/pkg/tun/udp.go
@@ -13,7 +13,7 @@ import (
 	"github.com/xjasonlyu/tun2socks/v2/core/adapter"
 )
 
-const udpBufferSize = 65535
+const udpBufferSize = 4096
 
 func (s *Server) HandleUDP(conn adapter.UDPConn) {
 	go s.handleUDPConn(conn)
diff --git a/pkg/utils/pipe.go b/pkg/utils/pipe.go
index 828b205..55c95ee 100644
--- a/pkg/utils/pipe.go
+++ b/pkg/utils/pipe.go
@@ -6,7 +6,7 @@ import (
 	"time"
 )
 
-const PipeBufferSize = 65535
+const PipeBufferSize = 32 * 1024
 
 func Pipe(src, dst io.ReadWriter, count func(int)) error {
 	buf := make([]byte, PipeBufferSize)