mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 09:25:41 +08:00
general: try to reduce tcp fragment
This commit is contained in:
parent
aefb9cd7ae
commit
e9f6f15290
@ -209,13 +209,11 @@ func (c *Client) exchange(qname string, reqBytes []byte, preferTCP bool) (
|
|||||||
|
|
||||||
// exchangeTCP exchange with server over tcp.
|
// exchangeTCP exchange with server over tcp.
|
||||||
func (c *Client) exchangeTCP(rc net.Conn, reqBytes []byte) ([]byte, error) {
|
func (c *Client) exchangeTCP(rc net.Conn, reqBytes []byte) ([]byte, error) {
|
||||||
buf := pool.GetBuffer(2 + len(reqBytes))
|
lenBuf := pool.GetBuffer(2)
|
||||||
defer pool.PutBuffer(buf)
|
defer pool.PutBuffer(lenBuf)
|
||||||
|
|
||||||
binary.BigEndian.PutUint16(buf[:2], uint16(len(reqBytes)))
|
binary.BigEndian.PutUint16(lenBuf, uint16(len(reqBytes)))
|
||||||
copy(buf[2:], reqBytes)
|
if _, err := (&net.Buffers{lenBuf, reqBytes}).WriteTo(rc); err != nil {
|
||||||
|
|
||||||
if _, err := rc.Write(buf); err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,14 +61,12 @@ func (s *Server) ListenAndServeUDP(wg *sync.WaitGroup) {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
reqBytes := pool.GetBuffer(UDPMaxLen)
|
reqBytes := pool.GetBuffer(UDPMaxLen)
|
||||||
|
|
||||||
n, caddr, err := pc.ReadFrom(reqBytes)
|
n, caddr, err := pc.ReadFrom(reqBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[dns] local read error: %v", err)
|
log.F("[dns] local read error: %v", err)
|
||||||
pool.PutBuffer(reqBytes)
|
pool.PutBuffer(reqBytes)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
go s.ServePacket(pc, caddr, reqBytes[:n])
|
go s.ServePacket(pc, caddr, reqBytes[:n])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -143,15 +141,11 @@ func (s *Server) ServeTCP(c net.Conn) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := pool.GetBuffer(2 + len(respBytes))
|
lenBuf := pool.GetBuffer(2)
|
||||||
defer pool.PutBuffer(buf)
|
defer pool.PutBuffer(lenBuf)
|
||||||
|
|
||||||
binary.BigEndian.PutUint16(buf[:2], uint16(len(respBytes)))
|
binary.BigEndian.PutUint16(lenBuf, uint16(len(respBytes)))
|
||||||
copy(buf[2:], respBytes)
|
if _, err := (&net.Buffers{lenBuf, respBytes}).WriteTo(c); err != nil {
|
||||||
|
|
||||||
if _, err := c.Write(buf); err != nil {
|
|
||||||
log.F("[dns-tcp] error in write respBytes: %s", err)
|
log.F("[dns-tcp] error in write respBytes: %s", err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
5
go.mod
5
go.mod
@ -11,8 +11,9 @@ require (
|
|||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
||||||
github.com/xtaci/kcp-go/v5 v5.6.1
|
github.com/xtaci/kcp-go/v5 v5.6.1
|
||||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897
|
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897
|
||||||
golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a // indirect
|
golang.org/x/net v0.0.0-20201022231255-08b38378de70 // indirect
|
||||||
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9 // indirect
|
golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd // indirect
|
||||||
|
golang.org/x/tools v0.0.0-20201022215848-ffe8bce740af // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
10
go.sum
10
go.sum
@ -141,6 +141,8 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgN
|
|||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20201022231255-08b38378de70 h1:Z6x4N9mAi4oF0TbHweCsH618MO6OI6UFgV0FP5n0wBY=
|
||||||
|
golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@ -166,8 +168,8 @@ golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a h1:e3IU37lwO4aq3uoRKINC7JikojFmE5gO7xhfxs8VC34=
|
golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd h1:WgqgiQvkiZWz7XLhphjt2GI2GcGCTIZs9jqXMWmH+oc=
|
||||||
golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
@ -176,8 +178,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
|
|||||||
golang.org/x/tools v0.0.0-20200425043458-8463f397d07c h1:iHhCR0b26amDCiiO+kBguKZom9aMF+NrFxh9zeKR/XU=
|
golang.org/x/tools v0.0.0-20200425043458-8463f397d07c h1:iHhCR0b26amDCiiO+kBguKZom9aMF+NrFxh9zeKR/XU=
|
||||||
golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9 h1:sEvmEcJVKBNUvgCUClbUQeHOAa9U0I2Ce1BooMvVCY4=
|
golang.org/x/tools v0.0.0-20201022215848-ffe8bce740af h1:L1EV/2WjPBRxjdgDu0bbZ5gWPuQ6yX9HjG6hSb2dFV4=
|
||||||
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201022215848-ffe8bce740af/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
|
@ -3,7 +3,6 @@ package proxy
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -50,15 +49,11 @@ func DialerFromURL(s string, dialer Dialer) (Dialer, error) {
|
|||||||
return nil, errors.New("DialerFromURL: dialer cannot be nil")
|
return nil, errors.New("DialerFromURL: dialer cannot be nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
u, err := url.Parse(s)
|
scheme := s[:strings.Index(s, ":")]
|
||||||
if err != nil {
|
c, ok := dialerCreators[strings.ToLower(scheme)]
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c, ok := dialerCreators[strings.ToLower(u.Scheme)]
|
|
||||||
if ok {
|
if ok {
|
||||||
return c(s, dialer)
|
return c(s, dialer)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, errors.New("unknown scheme '" + u.Scheme + "'")
|
return nil, errors.New("unknown scheme '" + scheme + "'")
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package proxy
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -39,15 +38,11 @@ func ServerFromURL(s string, p Proxy) (Server, error) {
|
|||||||
s = "mixed://" + s
|
s = "mixed://" + s
|
||||||
}
|
}
|
||||||
|
|
||||||
u, err := url.Parse(s)
|
scheme := s[:strings.Index(s, ":")]
|
||||||
if err != nil {
|
c, ok := serverCreators[strings.ToLower(scheme)]
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c, ok := serverCreators[strings.ToLower(u.Scheme)]
|
|
||||||
if ok {
|
if ok {
|
||||||
return c(s, p)
|
return c(s, p)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, errors.New("unknown scheme '" + u.Scheme + "'")
|
return nil, errors.New("unknown scheme '" + scheme + "'")
|
||||||
}
|
}
|
||||||
|
@ -222,20 +222,12 @@ func NewServerConn(c net.Conn) *ServerConn {
|
|||||||
|
|
||||||
func (c *ServerConn) Write(b []byte) (int, error) {
|
func (c *ServerConn) Write(b []byte) (int, error) {
|
||||||
if !c.sent {
|
if !c.sent {
|
||||||
buf := pool.GetWriteBuffer()
|
|
||||||
defer pool.PutWriteBuffer(buf)
|
|
||||||
|
|
||||||
buf.WriteByte(Version) // ver
|
|
||||||
buf.WriteByte(0) // addonLen
|
|
||||||
|
|
||||||
buf.Write(b)
|
|
||||||
c.sent = true
|
c.sent = true
|
||||||
|
|
||||||
n, err := c.Conn.Write(buf.Bytes())
|
n, err := (&net.Buffers{[]byte{Version, 0}, b}).WriteTo(c.Conn)
|
||||||
if n > 2 {
|
if n > 2 {
|
||||||
return n - 2, err
|
return int(n) - 2, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ import (
|
|||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"net"
|
||||||
|
|
||||||
"github.com/nadoo/glider/pool"
|
"github.com/nadoo/glider/pool"
|
||||||
)
|
)
|
||||||
@ -79,31 +80,28 @@ func (w *frameWriter) Write(b []byte) (int, error) {
|
|||||||
binary.BigEndian.PutUint64(hdr[2:2+nLenField], uint64(nPayload))
|
binary.BigEndian.PutUint64(hdr[2:2+nLenField], uint64(nPayload))
|
||||||
}
|
}
|
||||||
|
|
||||||
// header and length
|
header := hdr[:2+nLenField]
|
||||||
_, err := w.Writer.Write(hdr[:2+nLenField])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if w.server {
|
if w.server {
|
||||||
return w.Writer.Write(b)
|
n, err := (&net.Buffers{header, b}).WriteTo(w.Writer)
|
||||||
|
if int(n) <= len(header) {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return int(n) - len(header), err
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := pool.GetBuffer(nPayload)
|
payload := pool.GetBuffer(nPayload)
|
||||||
defer pool.PutBuffer(buf)
|
defer pool.PutBuffer(payload)
|
||||||
|
|
||||||
// mask
|
|
||||||
_, err = w.Writer.Write(w.maskKey[:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// payload with mask
|
// payload with mask
|
||||||
for i := 0; i < nPayload; i++ {
|
for i := 0; i < nPayload; i++ {
|
||||||
buf[i] = b[i] ^ w.maskKey[i%4]
|
payload[i] = b[i] ^ w.maskKey[i%4]
|
||||||
}
|
}
|
||||||
|
|
||||||
return w.Writer.Write(buf)
|
n, err := (&net.Buffers{header, w.maskKey[:], payload}).WriteTo(w.Writer)
|
||||||
|
if int(n) > len(header)+4 {
|
||||||
|
return int(n) - len(header) - 4, err
|
||||||
|
}
|
||||||
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
type frameReader struct {
|
type frameReader struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user