XTLS/Xray-core · error
MaxConnectionReceiveWindow must be at least 16384
Error message
MaxConnectionReceiveWindow must be at least 16384
What it means
The 16384-byte minimum for the connection-level maximum receive window (finalMask.quicParams.maxConnectionReceiveWindow). Positive values below 16 KiB fail validation; 0 is the default. This is the last of the four window floor checks.
Source
Thrown at infra/conf/transport_internet.go:270
default:
return nil, errors.New("unknown congestion control: ", c.FinalMask.QuicParams.Congestion, ", valid values: reno, bbr, brutal, force-brutal")
}
if (c.FinalMask.QuicParams.UdpHop.Interval.From != 0 && c.FinalMask.QuicParams.UdpHop.Interval.From < 5) || (c.FinalMask.QuicParams.UdpHop.Interval.To != 0 && c.FinalMask.QuicParams.UdpHop.Interval.To < 5) {
return nil, errors.New("Interval must be at least 5")
}
if c.FinalMask.QuicParams.InitStreamReceiveWindow > 0 && c.FinalMask.QuicParams.InitStreamReceiveWindow < 16384 {
return nil, errors.New("InitStreamReceiveWindow must be at least 16384")
}
if c.FinalMask.QuicParams.MaxStreamReceiveWindow > 0 && c.FinalMask.QuicParams.MaxStreamReceiveWindow < 16384 {
return nil, errors.New("MaxStreamReceiveWindow must be at least 16384")
}
if c.FinalMask.QuicParams.InitConnectionReceiveWindow > 0 && c.FinalMask.QuicParams.InitConnectionReceiveWindow < 16384 {
return nil, errors.New("InitConnectionReceiveWindow must be at least 16384")
}
if c.FinalMask.QuicParams.MaxConnectionReceiveWindow > 0 && c.FinalMask.QuicParams.MaxConnectionReceiveWindow < 16384 {
return nil, errors.New("MaxConnectionReceiveWindow must be at least 16384")
}
if c.FinalMask.QuicParams.MaxIdleTimeout != 0 && (c.FinalMask.QuicParams.MaxIdleTimeout < 4 || c.FinalMask.QuicParams.MaxIdleTimeout > 120) {
return nil, errors.New("MaxIdleTimeout must be between 4 and 120")
}
if c.FinalMask.QuicParams.KeepAlivePeriod != 0 && (c.FinalMask.QuicParams.KeepAlivePeriod < 2 || c.FinalMask.QuicParams.KeepAlivePeriod > 60) {
return nil, errors.New("KeepAlivePeriod must be between 2 and 60")
}
if c.FinalMask.QuicParams.MaxIncomingStreams != 0 && c.FinalMask.QuicParams.MaxIncomingStreams < 8 {
return nil, errors.New("MaxIncomingStreams must be at least 8")
}
if c.FinalMask.QuicParams.Debug {
os.Setenv("HYSTERIA_BBR_DEBUG", "true")
os.Setenv("HYSTERIA_BRUTAL_DEBUG", "true")
}
config.QuicParams = &internet.QuicParams{
Congestion: c.FinalMask.QuicParams.Congestion,View on GitHub (pinned to 7d214f8b09)
Solutions
- Set maxConnectionReceiveWindow >= 16384 bytes (e.g. 8388608).
- Or omit it for the default.
- Verify max >= init for both stream and connection windows.
Example fix
// before
"quicParams": { "maxConnectionReceiveWindow": 8192 }
// after
"quicParams": { "maxConnectionReceiveWindow": 8388608 } Defensive patterns
Strategy: validation
Validate before calling
func connectionWindowsOK(qp map[string]any) bool {
return windowFloorOK(qp["maxConnectionReceiveWindow"], 16384) &&
windowFloorOK(qp["initConnectionReceiveWindow"], 16384)
} Prevention
- Tune the four window knobs as a set; do not shrink max below init.
- Use byte literals (e.g. 8388608) in configs to avoid unit ambiguity.
- Re-run config validation after any QUIC tuning change.
When it happens
Trigger: "quicParams": { "maxConnectionReceiveWindow": 8192 }.
Common situations: Memory-tuning that crosses the protocol floor; inconsistent window sets where max < init; stale values from older configs.
Related errors
- InitStreamReceiveWindow must be at least 16384
- MaxStreamReceiveWindow must be at least 16384
- InitConnectionReceiveWindow must be at least 16384
- unknown bbr profile
- BrutalUp must be at least 65536 bytes per second
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/bde8e368c9f6fb48.
Report an issue: GitHub.