We have a network throughput issue, but cannot find a bottleneck. We have spent four weeks looking at router logs, FW logs, and monitoring and we are now looking into the TCP window size on client.
What I already know from research and do not require an explanation here:
- What the TCP window does, and is for
- What happens when it is full
- How ACKs tell the sender that more buffer is free
- How TCP Scaling works and this needs to be captured in the 3-way handshake
What I have found is that the TCP window (on any machine) always sets the same value for every session. However, I also found that the same window seems to be a different (almost unique) to each machine.
I know that some of this is due to the OS, but is this "buffer" a space on the NIC or the RAM in OS?
Does additional RAM equate to a larger window size?
What factors determine the "negotiated" window size?
I know congestion control can play a part in this, but my Wireshark captures are setting these values right at the beginning of the TCP handshake, so I can't see how any form on congestion control is in play this early on.
Another point I'd like to make is that the receiver window never decreases when the sender sends lots of data. For example, let's say the receive window is 2 MB. I read that when bytes are in flight (no ACK received yet), that the advertised window should start to decrease. This is not occurring, the receiver keeps sending back ACKs with the same window size, even though it has not ACKed all bytes in flight yet.
Is this normal or have I misunderstood what I read?