Hello Egoist,
The receive window (in this upload scenario) is managed by the server; the Windows client has no influence over how the receive window is managed - it only has influence over its "congestion window" (and direct information about that window size is not available from a simple network trace).
My nominal upload speed is 25 Mbps and the browser-based Speedtest reports 24.51 Mbps, so there is not much that needs explanation or tuning in my case.
Looking at my network trace, Speedtest (browser version) used 4 TCP connections in parallel during the "upload" test. Reviewing the TCP Connection Summary for these connections shows something like this:
Tcb = 0xFFFFDB87419D5AA0 // Transport Control Block address
DataBytesOut = 12875970 // The number of octets of data contained in transmitted segments, including retransmitted data
DataBytesIn = 5430 // The number of octets contained in received data segments, including retransmitted data
DataSegmentsOut = 8830 // The number of segments sent containing a positive length data segment
DataSegmentsIn = 102 // The number of segments received containing a positive length data segment
SegmentsOut = 8837 // The total number of segments sent
SegmentsIn = 3158 // The total number of segments received
NonRecovDa = 0 // The number of duplicate acks (or SACKS) that did not trigger a Fast Retransmit
NonRecovDaEpisodes = 0 // The number of duplicate acknowledgment episodes that did not trigger a Fast Retransmit
DupAcksIn = 214 // The number of duplicate ACKs received
BytesRetrans = 199140 // The number of bytes retransmitted
Timeouts = 2 // The number of times the retransmit timeout has expired when the retransmission timer backoff multiplier is equal to one
SpuriousRtoDetections = 0 // The number of acknowledgments reporting segments that have already been retransmitted due to a Retransmission Timeout
FastRetran = 16 // The number of invocations of the Fast Retransmit algorithm
MaxSsthresh = 273548 // The maximum size, in bytes, of the slow start threshold, excluding the initial value
MaxSsCwnd = 390784 // The maximum size, in bytes, of the congestion window size used during "Slow Start"
MaxCaCwnd = 310079 // The maximum size, in bytes, of the congestion window used during "Congestion Avoidance"
SndLimTransRwin = 0 // The number of transitions into the "Receiver Limited" state
SndLimTimeRwin = 0 // The cumulative time, in milliseconds, spent in the "Receiver Limited" state
SndLimBytesRwin = 0 // The total number of bytes sent in the "Receiver Limited" state
SndLimTransCwnd = 76 // The number of transitions into the "Congestion Limited" state
SndLimTimeCwnd = 8838 // The cumulative time, in milliseconds, spent in the "Congestion Limited" state
SndLimBytesCwnd = 6286884 // The total number of bytes sent in the "Congestion Limited" state
SndLimTransSnd = 77 // The number of transitions into the "Sender Limited" state
SndLimTimeRSnd = 6264 // The cumulative time, in milliseconds, spent in the "Sender Limited" state
SndLimBytesRSnd = 5859134 // The total number of bytes sent in the "Sender Limited" state
ConnectionTimeMs = 15157
TimestampsEnabled = FALSE
RttUs = 38644
MinRttUs = 9623 // The minimum sampled round trip time, in microseconds
MaxRttUs = 130243 // The maximum sampled round trip time, in microseconds
SynRetrans = 0
CongestionAlgorithm = CUBIC
State = ClosedState
LocalAddressLength = 16
LocalAddress = 192.168.0.10:63097
RemoteAddressLength = 16
RemoteAddress = 195.49.6.4:8080
CWnd = 52436
SsThresh = 27798
RcvWnd = 130438
RcvBuf = 131400
SndWnd = 390784
Looking at the raw captured packets and correlating them with the ETW data, one can easily spot the 77 occasions when there was no data to send (the application had not called "send" fast enough) and the 76 bouts of congestion.
Gary