문서의 각 단락이 어느 리비전에서 마지막으로 수정되었는지 확인할 수 있습니다. 왼쪽의 정보 칩을 통해 작성자와 수정 시점을 파악하세요.

슬라이딩 윈도우 | |
이름 | 슬라이딩 윈도우 |
분류 | TCP 혼잡 제어 기법 |
목적 | 네트워크 혼잡 방지 및 효율적 데이터 전송 |
핵심 개념 | 송신 가능한 데이터 양(윈도우 크기)을 동적으로 조절 |
주요 구성 요소 | 송신 윈도우, 수신 윈도우, 혼잡 윈도우 |
관련 프로토콜 | |
상세 정보 | |
동작 원리 | 수신자의 ACK 확인에 따라 윈도우를 슬라이딩하며 전송 |
윈도우 크기 결정 요소 | |
혼잡 제어 알고리즘 | |
송신 윈도우 | ACK를 기다리지 않고 전송할 수 있는 최대 데이터 양 |
수신 윈도우 | 수신 측의 가용 버퍼 크기로 통지 |
혼잡 윈도우 | 네트워크 상태를 고려한 송신자의 내부 윈도우 크기 |
윈도우 크기 공식 | 실제 윈도우 크기 = min(송신 윈도우, 수신 윈도우, 혼잡 윈도우) |
장점 | 흐름 제어와 혼잡 제어를 결합, 대역폭 효율적 활용 |
단점 | 구현 복잡성, RTT에 따른 성능 영향 |
관련 RFC | RFC 5681 (TCP Congestion Control) |

슬라이딩 윈도우는 TCP에서 데이터의 흐름을 효율적으로 제어하고 신뢰성을 보장하기 위한 핵심 메커니즘이다. 이 기법은 패킷 기반 네트워크에서 송신 측이 수신 측의 처리 능력을 고려하지 않고 과도한 데이터를 전송하는 것을 방지하여 흐름 제어를 수행한다. 동시에, 확인 응답을 기다리지 않고 연속적으로 여러 세그먼트를 전송할 수 있게 함으로써 네트워크 대역폭 활용도를 극대화한다.
기본적으로 슬라이딩 윈도우는 송신자와 수신자 각각이 유지하는 가상의 버퍼 공간인 '윈도우'를 기반으로 작동한다. 송신자는 수신자로부터 허용된 윈도우 크기 내에서만 데이터를 전송한다. 수신자가 데이터를 성공적으로 수신하고 처리하면, 윈도우는 수신 확인된 데이터만큼 '슬라이딩'하여 앞으로 이동하며, 새로운 데이터를 수신할 수 있는 공간을 확보한다. 이 과정은 연결이 종료될 때까지 반복적으로 이루어진다.
이 방식은 단순한 정지-대기 프로토콜에 비해 네트워크 지연 시간 동안 유휴 상태로 머무는 시간을 줄여 전송 효율을 획기적으로 향상시킨다. 또한, 혼잡 제어 알고리즘과 밀접하게 연동되어 네트워크의 혼잡을 감지하고 윈도우 크기를 동적으로 조절함으로써, 전체 네트워크의 안정성을 유지하는 데 기여한다. 따라서 슬라이딩 윈도우는 TCP의 신뢰성, 흐름 제어, 혼잡 제어라는 세 가지 주요 목표를 달성하는 데 필수적인 구성 요소이다.

슬라이딩 윈도우는 TCP에서 데이터의 흐름을 효율적으로 제어하고 신뢰성을 보장하기 위한 핵심 메커니즘이다. 이 기법은 송신 측이 수신 측의 처리 능력을 초과하지 않도록 데이터 전송 속도를 조절하며, 동시에 한 번에 여러 세그먼트를 전송함으로써 네트워크 활용도를 높인다. 기본적으로 송신 측은 수신 측으로부터 허용된 범위 내에서 확인 응답을 기다리지 않고 연속적으로 데이터를 보낼 수 있다.
흐름 제어의 핵심은 윈도우 크기이다. 윈도우 크기는 수신 측이 현재 수용할 수 있는 데이터의 양(바이트 단위)을 의미한다. 수신 측은 TCP 헤더의 '윈도우 크기' 필드를 통해 이 값을 송신 측에 알린다. 송신 측은 이 윈도우 크기에 따라 전송할 수 있는 데이터의 양을 제한한다. 예를 들어, 윈도우 크기가 3000바이트라면, 송신 측은 확인 응답을 받지 않은 상태에서 최대 3000바이트까지의 데이터를 네트워크로 보낼 수 있다. 이는 수신 측의 버퍼 공간이 부족해 데이터가 손실되는 것을 방지한다.
슬라이딩 윈도우의 동작은 시퀀스 번호와 확인 응답(ACK)에 기반한다. 모든 전송된 데이터 바이트에는 고유한 시퀀스 번호가 부여된다. 수신 측은 성공적으로 수신한 데이터의 다음 예상 시퀀스 번호를 ACK 번호로 포함하여 응답한다. 송신 측은 ACK를 받으면, 해당 번호까지의 데이터가 성공적으로 전달되었음을 확인하고 윈도우를 그만큼 앞으로 이동(슬라이딩)시킨다. 이 과정을 통해 윈도우는 네트워크 상에서 '슬라이딩'하며 이동한다.
용어 | 설명 |
|---|---|
윈도우 크기 | 수신 측이 한 번에 수신할 수 있는 데이터의 최대량. 흐름 제어의 기준이 된다. |
시퀀스 번호 | 전송되는 각 데이터 바이트에 할당된 고유 번호. 데이터의 순서와 무결성을 보장한다. |
확인 응답(ACK) | 수신 측이 데이터를 성공적으로 받았음을 알리는 신호. 다음에 기대하는 시퀀스 번호를 포함한다. |
이 기본 개념을 바탕으로, 송신 윈도우는 ACK가 도착함에 따라 지속적으로 이동하며 새로운 데이터의 전송을 가능하게 한다. 따라서 회선 지연 시간이 긴 네트워크에서도 송신 측은 회선을 꽉 채워 사용할 수 있어 전송 효율이 크게 향상된다.
윈도우 크기는 슬라이딩 윈도우 프로토콜의 핵심 매개변수로, 송신 측이 확인 응답을 기다리지 않고 한 번에 전송할 수 있는 데이터의 최대 양을 정의한다. 이 크기는 바이트 단위로 표현되며, 수신자의 버퍼 상태와 네트워크 상황에 따라 동적으로 변할 수 있다. 윈도우 크기는 흐름 제어의 기본 메커니즘으로 작동하여, 빠른 송신자가 느린 수신자를 압도하는 것을 방지한다.
흐름 제어는 수신 측의 처리 능력을 고려한 데이터 전송률 조절 과정이다. 수신 측은 자신의 수신 버퍼에 남아 있는 가용 공간을 TCP 헤더의 '윈도우 크기' 필드에 담아 확인응답 세그먼트와 함께 송신 측에 알린다. 송신 측은 이 공지된 윈도우 크기 내에서만 새로운 데이터를 전송할 수 있다. 이를 통해 수신 버퍼가 가득 차서 데이터가 손실되는 오버플로우 상황을 예방한다.
윈도우 크기는 고정되지 않고 통신 과정에서 지속적으로 조정된다. 수신 애플리케이션이 버퍼의 데이터를 읽어 처리하면 가용 공간이 늘어나고, 이는 이후의 확인응답을 통해 송신 측에 새로운 윈도우 업데이트로 전달된다. 반대로 버퍼가 거의 가득 차면 윈도우 크기는 줄어들어 송신률을 낮춘다. 극단적으로 가용 공간이 0바이트가 되면 제로 윈도우 상태가 되어 송신이 일시 중단된다.
따라서 윈도우 크기와 흐름 제어는 단순한 전송 제한이 아니라, 수신자의 상태에 기반한 적응형 제어 시스템이다. 이는 신뢰성 있는 데이터 전송을 보장하면서도 링크 대역폭을 효율적으로 활용할 수 있는 기반을 제공한다.
시퀀스 번호는 TCP 세그먼트 내 데이터의 각 바이트에 할당된 고유한 식별자이다. 송신 측은 데이터를 보낼 때 각 세그먼트의 헤더에 해당 세그먼트 첫 번째 데이터 바이트의 시퀀스 번호를 기록한다. 이를 통해 수신 측은 분할되어 도착하거나 순서가 바뀐 세그먼트도 올바른 순서로 재조립할 수 있다.
확인 응답 번호는 수신 측이 성공적으로 수신한 데이터의 다음 바이트 위치를 알려주는 피드백 메커니즘이다. 예를 들어, 수신 측이 시퀀스 번호 1000으로 시작하는 500바이트의 데이터를 정상 수신했다면, 확인 응답 번호 1500을 송신 측에 보낸다. 이는 "1500번 바이트까지 정상 수신했으니, 다음에는 1500번 바이트부터 보내라"는 의미이다.
시퀀스 번호와 확인 응답 번호는 슬라이딩 윈도우의 동작을 가능하게 하는 핵심 요소이다. 송신 측은 확인 응답을 받은 데이터는 윈도우에서 벗어난 것으로 간주하고 윈도우를 앞으로 이동시켜 새로운 데이터를 전송할 수 있다. 이 과정에서 데이터의 누락이나 중복 없이 신뢰성 있는 전송이 보장된다.
용어 | 설명 | 역할 |
|---|---|---|
시퀀스 번호 | 전송하는 데이터 바이트의 절대적 위치 식별자 | 데이터 순서 보장 및 재조립 |
확인 응답 번호 | 성공적으로 수신한 데이터의 다음 바이트 위치 | 수신 확인 및 다음 전송 위치 지시 |
이러한 번호 체계는 3-way handshake 과정에서 초기 시퀀스 번호가 교환되며 설정된다. 또한, 확인 응답은 별도의 ACK 세그먼트로 보낼 수도 있고, 데이터를 실어 보내는 세그먼트에 함께 실어 보낼 수도 있다[1].

TCP 슬라이딩 윈도우의 동작은 송신 측과 수신 측이 각각 유지하는 송신 윈도우와 수신 윈도우를 기반으로 이루어진다. 송신 윈도우는 ACK를 기다리지 않고 한 번에 전송할 수 있는 데이터의 범위를 정의한다. 이 윈도우 내의 데이터는 전송되었으나 확인응답을 받지 않은 상태이다. 수신 윈도우는 수신 측의 버퍼에 남아 있는 여유 공간을 바이트 단위로 나타내며, 이 값을 TCP 헤더의 윈도우 크기 필드를 통해 송신 측에 알려 흐름을 제어한다.
윈도우 슬라이딩 과정은 연속적인 확인응답과 새로운 데이터 전송으로 진행된다. 송신 측은 윈도우의 시작 부분에 해당하는 데이터에 대한 확인응답을 받으면, 윈도우를 해당 확인응답된 바이트 수만큼 오른쪽으로 이동(슬라이드)시킨다. 이로 인해 윈도우의 앞부분은 닫히고, 새로운 공간이 열리며, 이 새 공간에 해당하는 데이터를 전송할 수 있게 된다. 이 과정은 연결이 종료될 때까지 반복된다.
아래 표는 윈도우 슬라이딩의 간단한 예를 보여준다. 초기 수신 윈도우 크기는 6,000바이트이며, 시퀀스 번호는 1,000부터 시작한다고 가정한다.
단계 | 송신 윈도우 범위 (시퀀스 번호) | 전송 상태 | 수신 측 ACK 및 새 윈도우 크기 | 설명 |
|---|---|---|---|---|
초기 | 1,000 ~ 7,000 | 1,000~3,000 전송 | - | 윈도우 내 첫 2,000바이트 전송 |
1 | 1,000 ~ 7,000 | 3,001~5,000 전송 | ACK 3,001, Win=4,000 | 2,000바이트 확인응답, 버퍼 여유 4,000바이트로 변경 |
2 | 3,001 ~ 7,001 | 5,001~7,000 전송 | ACK 5,001, Win=2,000 | 윈도우가 슬라이드되며 새로운 데이터 전송 |
이 동작 원리는 전이중 통신을 가능하게 하며, 송신 측은 수신 측의 처리 능력을 초과하지 않으면서도 왕복 지연 시간 동안 계속해서 데이터를 전송할 수 있다. 따라서 링크 활용도를 극대화하면서도 수신 측의 버퍼 오버플로를 방지하는 효율적인 흐름 제어 메커니즘이 된다.
TCP 연결에서 데이터 흐름을 관리하는 두 가지 핵심적인 윈도우가 존재한다. 바로 송신 윈도우와 수신 윈도우이다. 이 두 윈도우는 서로 독립적으로 운영되며, 수신자의 처리 능력과 네트워크 상태에 따라 동적으로 변화한다.
송신 윈도우는 송신 측이 확인 응답을 기다리지 않고 한 번에 전송할 수 있는 데이터의 양을 정의한다. 이 윈도우 내의 데이터는 세그먼트로 나누어 전송되며, 윈도우의 시작점은 이미 확인 응답을 받은 데이터의 시퀀스 번호이다. 윈도우의 끝점은 시작점에 윈도우 크기를 더한 값으로, 이 범위를 벗어난 데이터는 아직 전송할 수 없다. 송신 윈도우의 크기는 수신 윈도우의 크기와 혼잡 윈도우의 크기 중 더 작은 값에 의해 결정된다[2].
수신 윈도우는 수신 측의 TCP 버퍼에 남아 있는 가용 공간을 바이트 단위로 나타낸다. 이 값은 수신 측이 송신 측에게 정기적으로 알려주며, TCP 헤더의 '윈도우 크기' 필드를 통해 전달된다. 수신 애플리케이션이 버퍼에서 데이터를 읽어가면 가용 공간이 늘어나고, 이에 따라 수신 윈도우의 크기도 커진다. 반대로 데이터가 도착하여 버퍼에 쌓이면 윈도우 크기는 줄어든다. 수신 윈도우의 주요 목적은 수신자의 처리 속도보다 빠르게 데이터가 도착하여 버퍼가 오버플로우되는 것을 방지하는 것이다.
두 윈도우의 관계는 다음과 같이 요약할 수 있다.
구분 | 결정 주체 | 결정 요소 | 역할 |
|---|---|---|---|
송신 윈도우 | 송신자 | 수신 윈도우, 혼잡 윈도우 | 네트워크와 수신자 상태를 고려해 한 번에 보낼 데이터 양을 제한 |
수신 윈도우 | 수신자 | 수신 TCP 버퍼의 가용 공간 | 자신의 처리 능력을 송신자에게 알려 과도한 데이터 전송을 방지 |
송신자는 수신자로부터 받은 최신의 수신 윈도우 크기 값을 바탕으로 자신의 송신 윈도우를 조정한다. 따라서 효율적인 데이터 전송을 위해서는 수신자가 적시에 윈도우 업데이트 메시지를 보내 가용 공간을 알려주는 것이 중요하다.
송신자는 시퀀스 번호를 기준으로 송신 윈도우 내에 있는 데이터를 전송할 수 있다. 윈도우는 이미 전송되었지만 확인 응답을 받지 못한 데이터와 아직 전송되지 않은 데이터를 포함한다.
수신자가 데이터를 성공적으로 수신하고 처리하면, 확인 응답 번호와 함께 새로운 수신 윈도우 크기를 담은 ACK 세그먼트를 보낸다. 확인 응답 번호는 다음으로 기대하는 시퀀스 번호를 나타내며, 이 번호까지의 모든 데이터가 정상 수신되었음을 의미한다. 송신자는 이 확인 응답 번호를 받으면, 윈도우의 시작 경계를 해당 번호로 이동시킨다. 이로 인해 확인 응답된 데이터는 윈도우에서 벗어나고, 새로운 공간이 윈도우에 추가되어 추가 데이터 전송이 가능해진다. 이 과정을 '윈도우가 슬라이딩(미끄러지듯 이동)한다'고 표현한다.
윈도우 슬라이딩 과정은 수신자의 처리 능력에 따라 동적으로 조절된다. 수신자의 버퍼 여유 공간이 줄어들어 윈도우 크기가 작아지면, 송신자는 그에 맞춰 전송 속도를 늦춘다. 반대로 수신 버퍼에 공간이 생겨 윈도우 크기가 커지면, 송신자는 더 많은 데이터를 연속적으로 전송할 수 있다. 이는 흐름 제어의 핵심 메커니즘이 된다.
단계 | 송신자 동작 | 수신자 동작 | 윈도우 상태 변화 |
|---|---|---|---|
초기 전송 | 윈도우 내 데이터 전송 | 데이터 수신 및 버퍼 저장 | 윈도우 내 전송되지 않은 공간 감소 |
ACK 수신 | 확인 응답 번호 확인 | 처리 완료 후 ACK 전송 | 윈도우 시작점이 ACK 번호로 이동(슬라이딩) |
추가 전송 | 슬라이딩된 윈도우 내 새 데이터 전송 | 새 데이터 수신 | 윈도우가 연속적으로 앞으로 이동하며 데이터 흐름 유지 |
이러한 슬라이딩 과정을 통해, TCP는 한 번에 여러 세그먼트를 전송하고 확인 응답을 기다리지 않고도 지속적인 데이터 전송을 가능하게 하여 네트워크 활용도를 극대화한다.

혼잡 제어는 네트워크의 과부하를 방지하는 메커니즘이다. 슬라이딩 윈도우는 흐름 제어를 담당하지만, 실제 성능은 네트워크의 혼잡 상태에 크게 좌우된다. 따라서 TCP는 슬라이딩 윈도우의 실제 사용 가능한 크기를 결정할 때, 수신자의 버퍼 공간에 기반한 '수신 윈도우'와 네트워크 상태에 기반한 '혼잡 윈도우' 중 더 작은 값을 사용한다. 이 결합을 통해 효율성과 네트워크 보호라는 두 가지 목표를 동시에 달성한다.
혼잡 윈도우는 송신자가 네트워크 혼잡을 감지하지 않은 상태에서 한 번에 전송할 수 있는 데이터 양을 의미한다. 그 크기는 동적으로 변화한다. 초기에는 슬로우 스타트 알고리즘이 적용되어, 매 확인 응답을 받을 때마다 혼잡 윈도우 크기가 지수적으로 증가한다. 이는 사용 가능한 대역폭을 빠르게 탐색하기 위한 단계이다. 혼잡 윈도우가 특정 임계값에 도달하면, 혼잡 회피 단계로 전환되어 윈도우 크기를 선형적으로 증가시킨다.
네트워크에서 패킷 손실이 발생하면, 이는 혼잡의 신호로 간주된다. 송신자는 재전송 타임아웃 또는 세 번의 중복 확인 응답을 통해 이를 감지한다. 혼잡이 감지되면, 임계값은 현재 혼잡 윈도우 크기의 절반으로 설정되고, 혼잡 윈도우는 다시 작은 값(전통적으로 1 MSS[3])으로 줄어든 후 슬로우 스타트부터 다시 시작한다. 이 과정을 통해 송신 윈도우는 네트워크의 수용 능력에 맞춰 지속적으로 조정된다.
단계 | 혼잡 윈도우 변화 | 트리거 |
|---|---|---|
슬로우 스타트 | 지수적 증가 (매 ACK마다 1 MSS 증가) | 연결 시작 또는 타임아웃 후 |
혼잡 회피 | 선형적 증가 (매 RTT[4]마다 1 MSS 증가) | 혼잡 윈도우 크기가 임계값 도달 |
혼잡 발생 | 임계값 = 현재 혼잡 윈도우 / 2, 윈도우 크기 초기화 | 패킷 손실 감지 (타임아웃 또는 3 Dup-ACK) |
이러한 연동 구조 덕분에 TCP는 수신자의 처리 능력과 네트워크 경로의 상태를 모두 고려하여 최적의 전송 속도를 자동으로 찾아낸다. 결과적으로 슬라이딩 윈도우는 단순한 버퍼 관리 도구를 넘어, 네트워크의 공정한 자원 분배를 가능하게 하는 핵심 요소가 된다.
혼잡 윈도우는 네트워크 혼잡을 제어하기 위해 송신 측이 유지하는 또 다른 가변 크기의 윈도우이다. 이 윈도우의 크기는 수신 윈도우와 함께 실제 데이터 전송량을 결정하는 핵심 요소가 된다. 송신 측은 수신 측이 통지한 수신 윈도우 크기와 자신이 추정한 혼잡 윈도우 크기 중 더 작은 값만큼만 데이터를 전송할 수 있다[5].
혼잡 윈도우의 크기는 네트워크 상태에 따라 동적으로 변화한다. 초기에는 작은 값(보통 1개의 MSS 크기)에서 시작하여, 패킷 손실 없이 확인 응답이 성공적으로 돌아올 때마다 지수적으로 증가한다. 이 단계를 슬로우 스타트라고 부른다. 혼잡 윈도우가 특정 임계값에 도달하면, 증가 속도가 선형적으로 바뀌는 혼잡 회피 단계로 진입한다.
단계 | 윈도우 증가 방식 | 트리거 조건 |
|---|---|---|
지수적 증가 (매 ACK마다 1 MSS 증가) | 연결 시작 또는 타임아웃 발생 후 | |
선형적 증가 (매 RTT마다 1 MSS 증가) | 혼잡 윈도우 크기가 | |
빠른 재전송 | 윈도우 크기를 반으로 줄이고 | 중복 ACK 3개 수신 |
빠른 회복 | 윈도우 크기를 | 빠른 재전송 후 |
패킷 손실이 발생하면, 이는 네트워크 혼잡의 신호로 해석된다. 타임아웃이 발생하거나 중복 ACK가 연속으로 수신되면, 송신 측은 혼잡 윈도우 크기를 급격히 줄인다. 이후 새로운 슬로우 스타트나 혼잡 회피 단계를 시작하여 네트워크에 다시 적응한다. 이 동적 조정 메커니즘을 통해 TCP는 네트워크 자원을 공정하게 공유하면서도 높은 처리량을 유지할 수 있다.
혼잡 윈도우는 네트워크의 혼잡 상태를 추정하여 동적으로 결정되는 송신 측의 윈도우 크기이다. 송신자는 수신자로부터 통지된 수신 윈도우 크기와 자신이 계산한 혼잡 윈도우 크기 중 더 작은 값을 실제 사용 가능한 윈도우 크기로 삼는다. 이는 수신자의 처리 능력과 네트워크 경로의 수용 능력을 모두 고려하여 데이터 전송 속도를 조절하기 위함이다.
슬로우 스타트는 TCP 연결이 시작되거나 타임아웃으로 인한 패킷 손실이 발생한 후에 적용되는 알고리즘이다. 초기 혼잡 윈도우 크기는 보통 1개의 MSS로 설정된다. 송신자는 매 확인 응답을 정상적으로 수신할 때마다 혼잡 윈도우 크기를 지수적으로 증가시킨다. 구체적으로, 매 RTT마다 윈도우 크기가 두 배가 된다. 이 과정은 윈도우 크기가 사전에 설정된 슬로우 스타트 임계값에 도달하거나 패킷 손실이 감지될 때까지 계속된다.
단계 | 동작 | 혼잡 윈도우 변화 |
|---|---|---|
슬로우 스타트 | ACK 수신 시 윈도우 크기 증가 | 지수적 증가 (1, 2, 4, 8, ...) |
혼잡 회피 | ACK 수신 시 윈도우 크기 증가 | 선형적 증가 (cwnd = cwnd + 1/cwnd) |
혼잡 회피 단계는 슬로우 스타트 임계값에 도달한 후 시작된다. 이 단계에서는 더 이상 지수적 증가를 하지 않고, 매 RTT마다 혼잡 윈도우 크기를 선형적으로 1 MSS만큼 증가시킨다. 이는 네트워크가 포화 상태에 가까워졌을 때 과도한 패킷 전송으로 인한 혼잡을 예방하기 위한 조심스러운 접근 방식이다. 만약 패킷 손실이 발생하면, 송신자는 슬로우 스타트 임계값을 현재 혼잡 윈도우 크기의 절반으로 낮추고, 다시 슬로우 스타트 단계부터 전송을 재개한다.

슬라이딩 윈도우는 TCP의 핵심 메커니즘으로, 단순한 신뢰성 보장을 넘어 네트워크 효율성을 극대화하는 여러 장점을 제공한다. 가장 큰 장점은 전이중 통신과 파이프라이닝을 가능하게 하여 대역폭을 효율적으로 활용한다는 점이다. 송신 측은 수신 측의 처리 능력에 맞춰 조정된 윈도우 크기만큼의 데이터를 확인응답을 기다리지 않고 연속적으로 전송할 수 있다. 이는 한 번에 하나의 세그먼트만 보내고 응답을 기다리는 정지-대기 방식에 비해 링크 이용률과 처리량을 획기적으로 향상시킨다.
또한, 이 기법은 흐름 제어와 혼잡 제어를 효과적으로 통합한다. 수신 측의 수신 버퍼 상태에 기반한 윈도우 크기 통보를 통해, 빠른 송신자가 느린 수신자를 압도하지 않도록 보장한다. 동시에 혼잡 윈도우 개념과 연동되어 네트워크의 혼잡 상태를 감지하고 윈도우 크기를 동적으로 조절함으로써, 과도한 데이터 전송으로 인한 패킷 손실과 혼잡 붕괴를 방지한다. 이는 자기 조절 특성으로, 네트워크와 호스트의 상태 변화에 유연하게 적응하게 만든다.
마지막으로, 순서 번호와 확인응답 번호를 이용한 슬라이딩 윈도우의 동작 원리는 데이터의 순차적 전달과 신뢰성 있는 복구를 보장한다. 손실되거나 지연된 세그먼트를 탐지하고, 재전송을 통해 정확하게 복구하는 동시에, 정상적으로 도착한 데이터는 즉시 상위 계층에 전달할 수 있다. 결과적으로 이 기법은 높은 처리량, 낮은 지연, 그리고 강력한 신뢰성이라는 상충될 수 있는 목표들을 동시에 달성하는 데 기여한다.

TCP 헤더에는 흐름 제어를 위한 윈도우 크기 정보를 담는 16비트 길이의 '윈도우 크기(Window Size)' 필드가 존재한다. 이 필드는 확인 응답(ACK) 세그먼트를 보내는 측, 즉 수신자가 자신의 현재 수신 버퍼 여유 공간을 바이트 단위로 알리기 위해 사용한다. 송신자는 이 값을 참조하여 송신 윈도우의 크기를 조정하고, 아직 확인응답을 받지 못한 데이터의 양을 이 윈도우 크기 내로 유지한다.
초기 TCP 명세에서 이 필드는 16비트로 정의되어 최대 65,535바이트(64KB - 1)의 윈도우 크기만을 표현할 수 있었다. 그러나 고대역폭·고지연 네트워크 환경에서는 이 크기로도 대역폭-지연 곱을 채우기에 부족한 경우가 발생했다. 이를 해결하기 위해 RFC 1323에서 '윈도우 스케일링 옵션(TCP Window Scale option)'이 도입되었다. 이 옵션은 3방향 핸드셰이크 과정에서 협상되며, 윈도우 크기 필드의 값에 2의 지수승을 곱하여 실제 윈도우 크기를 확장한다[6].
수신자의 처리 속도가 느려져 수신 버퍼가 가득 차면, 수신자는 윈도우 크기 필드에 '0'을 설정하여 제로 윈도우(Zero Window) 상태를 송신자에게 통보한다. 이는 일시적인 전송 중지를 의미한다. 이후 수신 버퍼가 다시 여유 공간을 확보하면, 수신자는 즉시 윈도우 업데이트(Window Update) 세그먼트를 보내 새로운 윈도우 크기를 알린다. 이 세그먼트는 데이터를 실어 보내지 않고 순수히 윈도우 크기 정보만을 전달하는 ACK 세그먼트이다. 제로 윈도우 상태가 지속될 경우, 송신 측은 윈도우 탐침(Window Probe)이라는 작은 세그먼트를 주기적으로 보내 윈도우 상태가 변경되었는지 확인한다.
TCP 헤더 필드/옵션 | 길이 | 설명 |
|---|---|---|
윈도우 크기(Window) | 16비트 | 수신자의 현재 수신 버퍼 여유 공간(바이트). 송신 윈도우의 상한을 결정한다. |
윈도우 스케일링 옵션 | 3바이트 | 실제 윈도우 크기를 확장하기 위한 스케일 인자(shift count)를 협상한다. |
선택적 확인응답(SACK) 옵션 | 가변 | 연속되지 않은 데이터 블록의 수신을 효율적으로 보고하여, 손실된 세그먼트만 재전송하도록 돕는다. |
TCP 헤더의 윈도우 크기 필드는 16비트로 구성되어 있으며, 수신 호스트가 현재 수용할 수 있는 데이터의 양을 바이트 단위로 송신 호스트에게 알리는 역할을 한다. 이 값은 확인 응답 번호 필드와 함께 사용되어, 수신 측이 다음에 받기를 기대하는 데이터의 시작 지점과 함께 현재의 수신 버퍼 여유 공간을 명시한다. 필드의 최대값은 2^16 - 1인 65,535바이트로, 이는 초기 TCP 설계에서의 한계였다.
이 16비트 제한은 고대역폭·고지연 네트워크 환경에서 성능 병목 현상을 초래할 수 있다. 예를 들어, RTT가 100ms이고 윈도우 크기가 65,535바이트인 경우, 이론적 최대 처리량은 초당 약 5.2Mbps로 제한된다[7]. 현대 네트워크는 기가비트 수준의 대역폭을 가지므로, 이 제한을 극복하기 위한 확장 메커니즘이 필요하게 되었다.
이 필드의 값은 흐름 제어의 핵심 변수로 동적으로 변한다. 수신 애플리케이션이 데이터를 소비하여 버퍼 공간이 생기면, 수신 측은 ACK 세그먼트를 보낼 때 이 윈도우 크기 필드의 값을 증가시켜 새로운 여유 공간을 알린다. 반대로 버퍼가 가득 차면 윈도우 크기는 0이 되어 송신을 일시 중지시킨다. 이 동적 조정을 통해 빠른 송신자가 느린 수신자를 압도하는 것을 방지한다.
TCP 연결에서 수신 측은 자신의 수신 버퍼에 남은 공간을 윈도우 크기 필드로 알려 송신 측의 데이터 전송 속도를 조절한다. 이때 수신 버퍼에 가용 공간이 없는 상태, 즉 윈도우 크기가 0이 된 상황을 제로 윈도우라고 한다. 제로 윈도우 상태에서는 송신 측이 새로운 데이터를 보낼 수 없으며, 전송을 일시 중지한다.
송신 측은 제로 윈도우 상태에서도 주기적으로 제로 윈도우 프로브라는 작은 세그먼트를 보내 수신 측의 버퍼 상태를 확인한다. 이 프로브 패킷은 1바이트의 새 데이터를 포함하거나, 순번이 재전송되는 데이터일 수 있다. 수신 측은 여전히 버퍼 공간이 없으면 윈도우 크기 0으로 다시 응답한다. 가용 공간이 생기면, 수신 측은 윈도우 업데이트 세그먼트를 보내 새로운 윈도우 크기를 알린다. 윈도우 업데이트는 확인응답(ACK) 번호가 이전과 동일하고, 데이터를 수반하지 않는 순수한 ACK 세그먼트로 전송된다.
상황 | 송신 측 동작 | 수신 측 응답 |
|---|---|---|
윈도우 크기 = 0 수신 | 데이터 전송 중지 | - |
프로브 타이머 만료 | 제로 윈도우 프로브 전송 | 윈도우 크기 = 0으로 ACK |
수신 버퍼 공간 확보 | - | 윈도우 업데이트 ACK 전송 |
윈도우 업데이트 수신 | 정상 데이터 전송 재개 | - |
이 메커니즘은 수신 측의 처리 능력을 초과하는 데이터 전송으로 인한 버퍼 오버플로우를 방지한다. 또한, 수신 측이 윈도우 업데이트 패킷을 분실했을 경우를 대비해, 송신 측은 이후에 도착하는 데이터에 대한 일반적인 ACK를 통해도 간접적으로 윈도우가 열렸음을 감지하고 전송을 재개할 수 있다.

TCP의 기본 슬라이딩 윈도우 메커니즘은 네트워크 성능을 보장하지만, 고대역폭·고지연 네트워크 환경에서는 한계를 보일 수 있다. 이를 극복하기 위해 여러 성능 최적화 기법이 개발되어 사용된다.
주요 최적화 기법으로는 윈도우 스케일링과 선택적 확인응답(SACK)이 있다. 윈도우 스케일링은 TCP 헤더의 16비트 윈도우 크기 필드로 표현 가능한 최대 65,535바이트의 제약을 극복한다. 연결 설정 단계에서 협상되는 스케일 팩터를 사용하여, 실제 윈도우 크기를 헤더의 윈도우 값 * 2^스케일팩터로 계산한다[8]. 이를 통해 기가비트 이상의 대역폭을 효율적으로 활용할 수 있다.
선택적 확인응답(SACK)은 기존의 누적 확인 응답(ACK) 방식의 비효율성을 개선한다. 표준 TCP에서는 수신자가 연속된 데이터 중 일부 세그먼트만 누락되더라도, 가장 높은 순번의 연속된 데이터까지의 ACK만 보낸다. 이로 인해 송신자는 정상 수신된 세그먼트까지도 재전송해야 하는 불필요한 중복 전송이 발생할 수 있다. SACK 옵션을 사용하면, 수신자는 정상 수신된 데이터 블록의 범위를 송신자에게 추가로 알려줄 수 있다. 송신자는 이 정보를 바탕으로 정확히 손실된 세그먼트만 선택적으로 재전송할 수 있어 네트워크 이용 효율이 크게 향상된다.
최적화 기법 | 해결하는 문제 | 핵심 메커니즘 |
|---|---|---|
16비트 윈도우 필드로 인한 대역폭 제한 | 연결 설정 시 스케일 팩터 협상, 윈도우 크기 확장 | |
선택적 확인응답(SACK) | 부분 손실 시 불필요한 중복 재전송 | 수신된 데이터 블록 범위를 옵션 필드로 통보, 선택적 재전송 유도 |
이 외에도 빠른 재전송과 빠른 회복, 타임스탬프 옵션을 이용한 지연 ACK의 정확한 RTT 측정 등 다양한 기법이 슬라이딩 윈도우의 성능을 보완한다. 이러한 최적화들은 혼잡 제어 알고리즘과 함께 작동하여, 현대 고속 네트워크에서 TCP의 안정성과 효율성을 유지하는 데 기여한다.
TCP 헤더의 윈도우 크기 필드는 16비트로, 최대 윈도우 크기를 65,535바이트(64KB)로 제한한다. 고속 네트워크 환경에서 이 제한은 대역폭 지연 곱을 충분히 활용하지 못해 성능 병목 현상을 초래할 수 있다. 윈도우 스케일링 옵션은 이 문제를 해결하기 위해 RFC 1323에서 정의된 TCP 옵션이다.
이 옵션은 TCP 3방향 핸드셰이크 과정에서 협상된다. SYN 세그먼트에 윈도우 스케일링 옵션을 포함시켜 송신 가능한 윈도우 크기의 스케일링 계수(shift count)를 제안한다. 상대방이 이를 수용하는 SYN-ACK 세그먼트로 응답하면, 실제 윈도우 크기는 '헤더의 윈도우 크기 필드 값 * 2^스케일링 계수'로 계산된다. 스케일링 계수는 최대 14까지 가능하여, 이론상 최대 윈도우 크기는 약 1GB(65,535 * 2^14)까지 확장된다.
윈도우 스케일링의 적용은 TCP 타임스탬프 옵션과 함께 고속 장거리 네트워크에서 특히 중요하다. 이를 통해 롱 패턴 네트워크에서도 송신 측이 수신 측의 처리 능력을 초과하지 않으면서 링크의 대역폭을 효율적으로 채울 수 있다. 대부분의 현대 운영체제는 기본적으로 이 기능을 지원하거나 활성화한다.
선택적 확인응답은 TCP의 슬라이딩 윈도우 프로토콜 성능을 향상시키기 위한 중요한 확장 옵션이다. 기존의 누적 확인응답 방식은 수신자가 연속된 데이터의 마지막 바이트만을 확인응답 번호로 알려주기 때문에, 일부 세그먼트가 손실되면 그 이후의 올바르게 수신된 세그먼트들도 모두 재전송 대상이 되는 문제가 있었다. SACK은 이 비효율성을 해결하기 위해 수신자가 손실된 구간을 제외하고 실제로 수신에 성공한 데이터 블록의 정보를 송신자에게 추가로 알려주는 메커니즘이다.
SACK 옵션은 TCP 헤더의 옵션 필드를 사용하며, 수신자는 ACK 세그먼트에 SACK 옵션을 포함시켜 송신자에게 전달한다. 이 옵션에는 하나 이상의 SACK 블록이 포함되며, 각 블록은 수신된 데이터의 시작과 끝 시퀀스 번호를 쌍으로 나타낸다. 예를 들어, 수신자가 시퀀스 번호 1000-1999, 3000-3999의 데이터는 받았지만 중간의 2000-2999 구간은 손실된 경우, SACK 옵션을 통해 1000-1999와 3000-3999 블록을 알린다. 이를 통해 송신자는 손실된 2000-2999 구간만을 선택적으로 재전송할 수 있다.
SACK의 동작은 다음과 같은 절차로 이루어진다.
1. 연결 설정 단계에서 양측 호스트는 TCP 헤더의 옵션을 통해 SACK 허용(SACK-Permitted) 옵션을 교환하여 SACK 사용을 협상한다.
2. 데이터 전송 중 수신 측은 누적 확인응답 번호(ACK 번호)와 함께, 수신된 불연속 데이터 블록에 대한 SACK 정보를 포함시킨다.
3. 송신 측은 이 SACK 정보를 바탕으로 자신의 송신 버퍼를 관리하며, 손실로 판단된 데이터 세그먼트만을 재전송한다.
SACK의 도입은 네트워크 혼잡 상황에서 특히 효과적이다. 여러 세그먼트가 연속적으로 손실되더라도 수신자는 각각의 수신된 데이터 블록을 정확히 보고할 수 있으므로, 송신자는 한 번의 왕복 시간(RTT) 내에 여러 손실을 한꺼번에 복구할 가능성이 높아진다. 이는 빠른 재전송 및 빠른 회복 알고리즘과 결합될 때 전체적인 혼잡 제어의 효율성을 크게 높인다. 그러나 SACK 옵션은 TCP 헤더의 길이를 증가시키며, 모든 TCP 구현체가 이를 지원하는 것은 아니다.
