{"record":{"id":"cd90b7087161d141","repo":"XTLS/Xray-core","slug":"initstreamreceivewindow-must-be-at-least-16384","errorCode":null,"errorMessage":"InitStreamReceiveWindow must be at least 16384","messagePattern":"InitStreamReceiveWindow must be at least 16384","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"infra/conf/transport_internet.go","lineNumber":261,"sourceCode":"\t\t\t}\n\n\t\t\tc.FinalMask.QuicParams.Congestion = strings.ToLower(c.FinalMask.QuicParams.Congestion)\n\t\t\tswitch c.FinalMask.QuicParams.Congestion {\n\t\t\tcase \"\", \"brutal\", \"reno\", \"bbr\":\n\t\t\tcase \"force-brutal\":\n\t\t\t\tif up == 0 {\n\t\t\t\t\treturn nil, errors.New(\"force-brutal requires up\")\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn nil, errors.New(\"unknown congestion control: \", c.FinalMask.QuicParams.Congestion, \", valid values: reno, bbr, brutal, force-brutal\")\n\t\t\t}\n\n\t\t\tif (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) {\n\t\t\t\treturn nil, errors.New(\"Interval must be at least 5\")\n\t\t\t}\n\n\t\t\tif c.FinalMask.QuicParams.InitStreamReceiveWindow > 0 && c.FinalMask.QuicParams.InitStreamReceiveWindow < 16384 {\n\t\t\t\treturn nil, errors.New(\"InitStreamReceiveWindow must be at least 16384\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.MaxStreamReceiveWindow > 0 && c.FinalMask.QuicParams.MaxStreamReceiveWindow < 16384 {\n\t\t\t\treturn nil, errors.New(\"MaxStreamReceiveWindow must be at least 16384\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.InitConnectionReceiveWindow > 0 && c.FinalMask.QuicParams.InitConnectionReceiveWindow < 16384 {\n\t\t\t\treturn nil, errors.New(\"InitConnectionReceiveWindow must be at least 16384\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.MaxConnectionReceiveWindow > 0 && c.FinalMask.QuicParams.MaxConnectionReceiveWindow < 16384 {\n\t\t\t\treturn nil, errors.New(\"MaxConnectionReceiveWindow must be at least 16384\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.MaxIdleTimeout != 0 && (c.FinalMask.QuicParams.MaxIdleTimeout < 4 || c.FinalMask.QuicParams.MaxIdleTimeout > 120) {\n\t\t\t\treturn nil, errors.New(\"MaxIdleTimeout must be between 4 and 120\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.KeepAlivePeriod != 0 && (c.FinalMask.QuicParams.KeepAlivePeriod < 2 || c.FinalMask.QuicParams.KeepAlivePeriod > 60) {\n\t\t\t\treturn nil, errors.New(\"KeepAlivePeriod must be between 2 and 60\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.MaxIncomingStreams != 0 && c.FinalMask.QuicParams.MaxIncomingStreams < 8 {\n\t\t\t\treturn nil, errors.New(\"MaxIncomingStreams must be at least 8\")","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/infra/conf/transport_internet.go#L243-L279","documentation":"QUIC flow-control floor for finalMask.quicParams.initStreamReceiveWindow: any positive value below 16384 bytes is rejected (0 = use default). quic-go requires stream receive windows of at least 16 KiB; smaller windows would break the QUIC transport.","triggerScenarios":"\"quicParams\": { \"initStreamReceiveWindow\": 8192 }.","commonSituations":"Trying to reduce memory by shrinking windows below the protocol minimum; unit confusion (bits vs bytes); carry-over values tuned for TCP buffers.","solutions":["Set initStreamReceiveWindow to >= 16384 (bytes), e.g. 8192 KiB style values used in examples (e.g. 8388608).","Or omit the field to use the library default.","Prefer tuning maxStreamReceiveWindow rather than shrinking the initial window below the floor."],"exampleFix":"// before\n\"quicParams\": { \"initStreamReceiveWindow\": 8192 }\n// after\n\"quicParams\": { \"initStreamReceiveWindow\": 8388608 }","handlingStrategy":"validation","validationCode":"func windowFloorOK(v any, floor int64) bool {\n    n, ok := v.(float64)\n    return !ok || n == 0 || int64(n) >= floor\n}\n// usage: windowFloorOK(qp[\"initStreamReceiveWindow\"], 16384)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use the reference values from example configs (MiB-scale byte counts) for all four windows.","Enforce a shared 16384-byte floor constant in your config generator.","Never mix window units (KiB vs bytes) when hand-editing."],"tags":["go","xray","config","quic","flow-control","validation"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}