diff --git a/common/dialer/dialer.go b/common/dialer/dialer.go index 0f5c913a..b059e38e 100644 --- a/common/dialer/dialer.go +++ b/common/dialer/dialer.go @@ -29,7 +29,12 @@ func New(router adapter.Router, options option.DialerOptions) (N.Dialer, error) } domainStrategy := dns.DomainStrategy(options.DomainStrategy) if domainStrategy != dns.DomainStrategyAsIS || options.Detour == "" { - dialer = NewResolveDialer(router, dialer, domainStrategy, time.Duration(options.FallbackDelay)) + dialer = NewResolveDialer( + router, + dialer, + options.Detour == "" && !options.TCPFastOpen, + domainStrategy, + time.Duration(options.FallbackDelay)) } return dialer, nil } diff --git a/common/dialer/resolve.go b/common/dialer/resolve.go index 327d3610..9e20c81d 100644 --- a/common/dialer/resolve.go +++ b/common/dialer/resolve.go @@ -16,14 +16,16 @@ import ( type ResolveDialer struct { dialer N.Dialer + parallel bool router adapter.Router strategy dns.DomainStrategy fallbackDelay time.Duration } -func NewResolveDialer(router adapter.Router, dialer N.Dialer, strategy dns.DomainStrategy, fallbackDelay time.Duration) *ResolveDialer { +func NewResolveDialer(router adapter.Router, dialer N.Dialer, parallel bool, strategy dns.DomainStrategy, fallbackDelay time.Duration) *ResolveDialer { return &ResolveDialer{ dialer, + parallel, router, strategy, fallbackDelay, @@ -48,7 +50,11 @@ func (d *ResolveDialer) DialContext(ctx context.Context, network string, destina if err != nil { return nil, err } - return N.DialParallel(ctx, d.dialer, network, destination, addresses, d.strategy == dns.DomainStrategyPreferIPv6, d.fallbackDelay) + if d.parallel { + return N.DialParallel(ctx, d.dialer, network, destination, addresses, d.strategy == dns.DomainStrategyPreferIPv6, d.fallbackDelay) + } else { + return N.DialSerial(ctx, d.dialer, network, destination, addresses) + } } func (d *ResolveDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {