Fix: Deprecate TCPMSS (#336)
* 修改 DefaultTCPMSS 为 MaxDatagramSize 修改 MaxDatagramSize 的值提高 TUIC 的上传速度
This commit is contained in:
parent
0467b2a68d
commit
cd38fc63b3
2 changed files with 42 additions and 20 deletions
|
@ -12,12 +12,14 @@ import (
|
||||||
"github.com/metacubex/quic-go/congestion"
|
"github.com/metacubex/quic-go/congestion"
|
||||||
)
|
)
|
||||||
|
|
||||||
const DefaultTCPMSS congestion.ByteCount = 1460
|
const (
|
||||||
const DefaultBBRMaxCongestionWindow congestion.ByteCount = 2000 * DefaultTCPMSS
|
MaxDatagramSize = 1252
|
||||||
const InitialCongestionWindow congestion.ByteCount = 32 * DefaultTCPMSS
|
DefaultBBRMaxCongestionWindow congestion.ByteCount = 2000 * MaxDatagramSize
|
||||||
const MinInitialPacketSize = 1200
|
InitialCongestionWindow congestion.ByteCount = 10 * MaxDatagramSize
|
||||||
const InitialPacketSizeIPv4 = 1252
|
MinInitialPacketSize = 1200
|
||||||
const InitialPacketSizeIPv6 = 1232
|
InitialPacketSizeIPv4 = 1252
|
||||||
|
InitialPacketSizeIPv6 = 1232
|
||||||
|
)
|
||||||
|
|
||||||
func GetMaxPacketSize(addr net.Addr) congestion.ByteCount {
|
func GetMaxPacketSize(addr net.Addr) congestion.ByteCount {
|
||||||
maxSize := congestion.ByteCount(MinInitialPacketSize)
|
maxSize := congestion.ByteCount(MinInitialPacketSize)
|
||||||
|
@ -33,17 +35,32 @@ func GetMaxPacketSize(addr net.Addr) congestion.ByteCount {
|
||||||
return maxSize
|
return maxSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetMaxOutgoingPacketSize(addr net.Addr) congestion.ByteCount {
|
||||||
|
maxSize := congestion.ByteCount(MinInitialPacketSize)
|
||||||
|
// If this is not a UDP address, we don't know anything about the MTU.
|
||||||
|
// Use the minimum size of an Initial packet as the max packet size.
|
||||||
|
if udpAddr, ok := addr.(*net.UDPAddr); ok {
|
||||||
|
|
||||||
|
if udpAddr.IP.To4() != nil {
|
||||||
|
//The maximum packet size of any QUIC packet over IPv4. 1500(Ethernet) - 20(IPv4 header) - 8(UDP header) = 1472.
|
||||||
|
maxSize = congestion.ByteCount(1472)
|
||||||
|
} else {
|
||||||
|
// The maximum outgoing packet size allowed.
|
||||||
|
// The maximum packet size of any QUIC packet over IPv6, based on ethernet's max
|
||||||
|
// size, minus the IP and UDP headers. IPv6 has a 40 byte header, UDP adds an
|
||||||
|
// additional 8 bytes. This is a total overhead of 48 bytes. Ethernet's
|
||||||
|
// max packet size is 1500 bytes, 1500 - 48 = 1452.
|
||||||
|
maxSize = congestion.ByteCount(1452)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxSize
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// The maximum outgoing packet size allowed.
|
|
||||||
// The maximum packet size of any QUIC packet over IPv6, based on ethernet's max
|
|
||||||
// size, minus the IP and UDP headers. IPv6 has a 40 byte header, UDP adds an
|
|
||||||
// additional 8 bytes. This is a total overhead of 48 bytes. Ethernet's
|
|
||||||
// max packet size is 1500 bytes, 1500 - 48 = 1452.
|
|
||||||
MaxOutgoingPacketSize = congestion.ByteCount(1452)
|
|
||||||
|
|
||||||
// Default maximum packet size used in the Linux TCP implementation.
|
// Default maximum packet size used in the Linux TCP implementation.
|
||||||
// Used in QUIC for congestion window computations in bytes.
|
// Used in QUIC for congestion window computations in bytes.
|
||||||
MaxSegmentSize = DefaultTCPMSS
|
MaxSegmentSize = MaxDatagramSize
|
||||||
|
|
||||||
// Default initial rtt used before any samples are received.
|
// Default initial rtt used before any samples are received.
|
||||||
InitialRtt = 100 * time.Millisecond
|
InitialRtt = 100 * time.Millisecond
|
||||||
|
@ -51,10 +68,10 @@ var (
|
||||||
// Constants based on TCP defaults.
|
// Constants based on TCP defaults.
|
||||||
// The minimum CWND to ensure delayed acks don't reduce bandwidth measurements.
|
// The minimum CWND to ensure delayed acks don't reduce bandwidth measurements.
|
||||||
// Does not inflate the pacing rate.
|
// Does not inflate the pacing rate.
|
||||||
DefaultMinimumCongestionWindow = 4 * DefaultTCPMSS
|
DefaultMinimumCongestionWindow = 4 * MaxDatagramSize
|
||||||
|
|
||||||
// The gain used for the STARTUP, equal to 2/ln(2).
|
// The gain used for the STARTUP, equal to 2/ln(2).
|
||||||
DefaultHighGain = 2.885
|
DefaultHighGain = 2.89
|
||||||
|
|
||||||
// The gain used in STARTUP after loss has been detected.
|
// The gain used in STARTUP after loss has been detected.
|
||||||
// 1.5 is enough to allow for 25% exogenous loss and still observe a 25% growth
|
// 1.5 is enough to allow for 25% exogenous loss and still observe a 25% growth
|
||||||
|
@ -249,11 +266,14 @@ type bbrSender struct {
|
||||||
// Latched value of --quic_always_get_bw_sample_when_acked.
|
// Latched value of --quic_always_get_bw_sample_when_acked.
|
||||||
alwaysGetBwSampleWhenAcked bool
|
alwaysGetBwSampleWhenAcked bool
|
||||||
|
|
||||||
pacer *pacer
|
pacer *pacer
|
||||||
|
|
||||||
maxDatagramSize congestion.ByteCount
|
maxDatagramSize congestion.ByteCount
|
||||||
|
|
||||||
|
MaxOutgoingPacketSize congestion.ByteCount
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBBRSender(clock Clock, initialMaxDatagramSize, initialCongestionWindow, maxCongestionWindow congestion.ByteCount) *bbrSender {
|
func NewBBRSender(clock Clock, initialMaxDatagramSize, initialCongestionWindow, initialMaxOutgoingPacketSize, maxCongestionWindow congestion.ByteCount) *bbrSender {
|
||||||
b := &bbrSender{
|
b := &bbrSender{
|
||||||
mode: STARTUP,
|
mode: STARTUP,
|
||||||
clock: clock,
|
clock: clock,
|
||||||
|
@ -263,7 +283,7 @@ func NewBBRSender(clock Clock, initialMaxDatagramSize, initialCongestionWindow,
|
||||||
congestionWindow: initialCongestionWindow,
|
congestionWindow: initialCongestionWindow,
|
||||||
initialCongestionWindow: initialCongestionWindow,
|
initialCongestionWindow: initialCongestionWindow,
|
||||||
maxCongestionWindow: maxCongestionWindow,
|
maxCongestionWindow: maxCongestionWindow,
|
||||||
minCongestionWindow: DefaultMinimumCongestionWindow,
|
minCongestionWindow: congestion.ByteCount(DefaultMinimumCongestionWindow),
|
||||||
highGain: DefaultHighGain,
|
highGain: DefaultHighGain,
|
||||||
highCwndGain: DefaultHighGain,
|
highCwndGain: DefaultHighGain,
|
||||||
drainGain: 1.0 / DefaultHighGain,
|
drainGain: 1.0 / DefaultHighGain,
|
||||||
|
@ -274,6 +294,7 @@ func NewBBRSender(clock Clock, initialMaxDatagramSize, initialCongestionWindow,
|
||||||
recoveryState: NOT_IN_RECOVERY,
|
recoveryState: NOT_IN_RECOVERY,
|
||||||
recoveryWindow: maxCongestionWindow,
|
recoveryWindow: maxCongestionWindow,
|
||||||
minRttSinceLastProbeRtt: InfiniteRTT,
|
minRttSinceLastProbeRtt: InfiniteRTT,
|
||||||
|
MaxOutgoingPacketSize: initialMaxOutgoingPacketSize,
|
||||||
maxDatagramSize: initialMaxDatagramSize,
|
maxDatagramSize: initialMaxDatagramSize,
|
||||||
}
|
}
|
||||||
b.pacer = newPacer(b.BandwidthEstimate)
|
b.pacer = newPacer(b.BandwidthEstimate)
|
||||||
|
@ -790,7 +811,7 @@ func (b *bbrSender) MaybeEnterOrExitProbeRtt(now time.Time, isRoundStart, minRtt
|
||||||
// PROBE_RTT. The CWND during PROBE_RTT is kMinimumCongestionWindow, but
|
// PROBE_RTT. The CWND during PROBE_RTT is kMinimumCongestionWindow, but
|
||||||
// we allow an extra packet since QUIC checks CWND before sending a
|
// we allow an extra packet since QUIC checks CWND before sending a
|
||||||
// packet.
|
// packet.
|
||||||
if b.GetBytesInFlight() < b.ProbeRttCongestionWindow()+MaxOutgoingPacketSize {
|
if b.GetBytesInFlight() < b.ProbeRttCongestionWindow()+b.MaxOutgoingPacketSize {
|
||||||
b.exitProbeRttAt = now.Add(ProbeRttTime)
|
b.exitProbeRttAt = now.Add(ProbeRttTime)
|
||||||
b.probeRttRoundPassed = false
|
b.probeRttRoundPassed = false
|
||||||
}
|
}
|
||||||
|
@ -924,7 +945,7 @@ func (b *bbrSender) CalculateRecoveryWindow(ackedBytes, lostBytes congestion.Byt
|
||||||
if b.recoveryWindow >= lostBytes {
|
if b.recoveryWindow >= lostBytes {
|
||||||
b.recoveryWindow -= lostBytes
|
b.recoveryWindow -= lostBytes
|
||||||
} else {
|
} else {
|
||||||
b.recoveryWindow = MaxSegmentSize
|
b.recoveryWindow = congestion.ByteCount(MaxSegmentSize)
|
||||||
}
|
}
|
||||||
// In CONSERVATION mode, just subtracting losses is sufficient. In GROWTH,
|
// In CONSERVATION mode, just subtracting losses is sufficient. In GROWTH,
|
||||||
// release additional |bytes_acked| to achieve a slow-start-like behavior.
|
// release additional |bytes_acked| to achieve a slow-start-like behavior.
|
||||||
|
|
|
@ -45,6 +45,7 @@ func SetCongestionController(quicConn quic.Connection, cc string) {
|
||||||
congestion.NewBBRSender(
|
congestion.NewBBRSender(
|
||||||
congestion.DefaultClock{},
|
congestion.DefaultClock{},
|
||||||
congestion.GetMaxPacketSize(quicConn.RemoteAddr()),
|
congestion.GetMaxPacketSize(quicConn.RemoteAddr()),
|
||||||
|
congestion.GetMaxOutgoingPacketSize(quicConn.RemoteAddr()),
|
||||||
congestion.InitialCongestionWindow,
|
congestion.InitialCongestionWindow,
|
||||||
congestion.DefaultBBRMaxCongestionWindow,
|
congestion.DefaultBBRMaxCongestionWindow,
|
||||||
),
|
),
|
||||||
|
|
Loading…
Reference in a new issue