- time several round-trips on the warm connection and report the
fastest, shedding transient network jitter
- time the warm-up request too and fall back to it if the node won't
honour keep-alive, instead of failing the IP outright
- stop at the first reuse failure and keep the samples already gathered
- restore the auto speed timeout to 10s as a hard cap
- measure throughput over 500ms windows from the first body byte and
return as soon as a window stops climbing (TCP slow start is over),
so the result is the real steady-state speed, not a slow-start-dragged
average
- fall back to the overall average if the transfer ends before settling
- exclude the one-time tunnel + inner TLS setup from the timing, which
was inflating latency ~5x over the real per-request RTT
- send a throwaway warm-up request, then time a second request on the
warm keep-alive connection (matches what clients like v2rayN report)
- extract request_once helper for the keep-alive GET + response parse
- replace the two-phase availability pre-scan with a single-stage
continuous stream that round-robins segments and keeps concurrency
probes in flight, so a slow unreachable IP only blocks its own slot
- drop the now-unused --probe-sample knob
- show per-probe reasons (unreachable / too fast / too slow / loss) in
the live feed across all stages
- cut the auto speed timeout to 5s