송신 TCP는 버퍼에 세그먼트를 보관하고 이것들을 순차적으로 전송하고, 수신 TCP는 도착한 세그먼트를 응용 프로세스가 읽을 때까지 버퍼에 보관한다.
송신 TCP 윈도우 크기 = 수신 TCP 버퍼의 크기
즉, 송신 TCP는 ACK를 받기 전까지 윈도우 크기 만큼의 세그먼트를 연속해서 보낼 수 있다. ACK를 수신하면 다시 보낼 수 있는 세그먼트의 수 만큼 윈도우 크기를 변경한다. (sliding window flow control)
윈도우 크기가 0이 되면 (zero window) 더 이상 전송을 하지 못하고 ACK를 받을 때까지 대기한다.
TCP는 ACK를 수신하지 못할 경우 무한정 기다리는 것(deadlock)을 피하기 위해 일정 시간이 지나면 (timeout) 재전송을 한다. 이때 상대방이 ACK를 못 보내는 것이 아직 버퍼에 공간이 없어서라면 상황을 더 악화시킬 수 있다.
이를 알리기 위해 수신 TCP는 현재 남아있는 버퍼 크기를 ACK를 전송할 때 window size 필드를 통해서 알려준다.