TCP는 네트워크 상태에 따라 데이터 전송량을 제어하는 알고리즘이 있다.
- 흐름 제어의 기반에 있는 것이 송수신단에서 각각 버퍼 역할을 하는 윈도우(Window)다.
- TCP 세션마다 송신 윈도우와 수신 윈도우를 가지고 있다.

수신 윈도우
수신 윈도우는 TCP 연결에서 수신 버퍼 역할을 한다.
세그먼트를 너무 많이 전송해서 수신 윈도우 크기를 넘어서면 손실이 발생할 것이다. 이러한 문제를 없애고 데이터 송신을 효율적으로 하기 위해 TCP 프로토콜 헤더에 자신의 현재 수신 윈도우 여유 크기를 담아 상대방에게 알려준다.
- 중요한 점은 수신 윈도우의 크기가 아니라 여유 크기라는 것이다.
- TCP 헤더에서 수신 윈도우 크기는 16bit 로써 64KB가 최대지만, TCP Window scale 옵션을 지정하면 그 이상을 사용할 수 있다.
송신 윈도우
송신 윈도우는 고정 값이 아니라 네트워크 환경에 따라 동적으로 크기가 조절된다.
송신 윈도우 크기는 송신 측 혼잡 윈도우(Congestion window)와 수신측 수신 윈도우(Receiver window) 중 작은 값이 결정된다.
- 혼잡 윈도우는 TCP에서 네트워크 혼잡 상황(품질)에 따라 윈도우 크기를 조절하므로써 데이터 송신량을 제어하는 윈도우다.
- 혼잡 윈도우 크기는 Slow start와 TCP 재전송에 따라 조절이 된다.
- Slow start
- TCP 연결이 이루어졌을때 상대방으로 부터 ACK를 받기 전에 보낼 데이터 세그먼트 개수를 1개 부터 시작해 2/4/8/...로 두배씩 증가시켜 나간다.
- ssthresh(Slow start threshold)까지 슬로우 스타트 방식으로 증가하고 그 이후는 혼잡 회피로 1씩 증가시켜 나간다.
- 그러다가 재전송 타임아웃이나 중복 ACK등에 의해 재전송이 발생하면 다시 혼잡 윈도우를 줄인뒤 다시 증가시켜 전송량을 제어한다.

TCP 윈도우 옵션
소켓 생성시 SO_RCVBUF / SO_SNDBUF 옵션으로 송수신 윈도우 크기 제어가능
- 수신 윈도우:
tcp_rmem
- 송신 윈도우:
tcp_wmem