Octet

You see TCP ZeroWindow in a capture. What does it mean and whose fault is it?

Show the answer

Say this first

The receiver advertised a window of zero: its receive buffer is full because its application is not reading fast enough. The sender stops, starts the persist timer and sends small zero-window probes until the receiver advertises space again with a window update. It points at the receiving host or its application (CPU, disk, a slow consumer), not at the network.

Go deeper

Wireshark labels and who sends them

LabelSent byMeaning
TCP Window FullSenderIt has sent everything the receiver's window allows
TCP ZeroWindowReceiverWindow field is 0
TCP ZeroWindowProbeSenderPersist timer probe
TCP ZeroWindowProbeAckReceiverAnswer, usually still 0
TCP Window UpdateReceiverWindow opened again

Proving it on the hosts

  • Receiver: ss -tn shows a large Recv-Q on that connection: data the kernel holds that the application has not read.
  • Sender: ss -tn shows a large Send-Q: data waiting for window.

Why the persist timer exists

If the receiver's window update were lost, both sides would wait forever. The sender's probes force a fresh ACK carrying the current window.

Silly window syndrome

A receiver that advertises every few freed bytes makes the sender send tiny segments. Receivers wait until they can open a meaningful amount (an MSS or half the buffer) before advertising.

Traps

  • Treating ZeroWindow as packet loss or congestion. It is flow control doing its job.