TCP 혼잡·흐름·오류제어가 함께 만드는 전송 제어
TCP 혼잡제어·흐름제어·오류제어의 역할과 상호 작용, 윈도우 및 재전송 메커니즘을 정리한다.
2026-08-14 · 최초 발행 2025-08-10
TCP 전송은 서로 다른 제한 조건을 동시에 다룬다
TCP(Transmission Control Protocol)는 연결 지향 방식으로 신뢰성 있는 데이터 전송을 제공한다. 전송 중에는 네트워크가 감당할 수 있는 트래픽, 수신 측이 처리할 수 있는 데이터량, 손상되거나 사라진 세그먼트가 동시에 문제가 된다.
혼잡제어는 네트워크 전체의 과부하를 피하고, 흐름제어는 수신 버퍼가 넘치지 않도록 하며, 오류제어는 손실이나 손상된 세그먼트를 다시 전달한다. 세 기능은 분리되어 보이지만 실제 TCP 연결에서는 서로의 결과에 영향을 준다.
네트워크 혼잡에 맞춰 전송량을 조절하는 방식
혼잡제어는 네트워크로 들어가는 트래픽이 네트워크 용량을 넘지 않도록 전송 속도를 조절하는 메커니즘이다. TCP는 혼잡 상태를 감지해 전송량을 바꾸며, 네트워크 전체의 성능을 유지하려 한다.
연결 초반에는 슬로우 스타트가 작은 혼잡 윈도우(CWND)에서 출발한다. ACK를 받을 때마다 윈도우를 지수적으로 증가시키다가 임계값인 ssthresh에 닿으면 혼잡 회피 단계로 넘어간다. 혼잡 회피에서는 CWND를 매 RTT(Round-Trip Time)마다 1 MSS(Maximum Segment Size)만큼 선형적으로 증가시킨다.
패킷 손실에 대응하는 방식도 있다. 중복 ACK를 3번 연속 받으면 타임아웃을 기다리지 않고 해당 패킷을 재전송하는 빠른 재전송이 동작한다. 이어서 빠른 회복은 혼잡 윈도우를 절반으로 줄인 뒤 혼잡 회피 상태에서 선형 증가를 계속한다.
대용량 파일을 내려받을 때 초반에는 속도가 낮다가 점차 증가하는 모습은 슬로우 스타트와 혼잡 회피의 결과다. 반대로 패킷 손실이 생기면 전송 속도가 급격히 줄었다가 다시 서서히 회복될 수 있다.
수신 버퍼의 여유를 전송 측에 알리는 흐름제어
흐름제어는 수신지가 자신의 상태를 송신지에 알려 전송량을 조절하게 하는 방식이다. 핵심 목적은 수신 버퍼 오버플로우를 막는 데 있다. 송신자는 수신자의 처리 능력을 넘는 데이터를 보내지 않도록 제한받는다.
TCP는 헤더의 윈도우 필드로 수신 가능한 데이터량을 전달한다. 수신 측은 ACK마다 현재 사용할 수 있는 버퍼 크기를 포함해 송신 측에 알린다.
수신 버퍼가 가득 차면 수신 윈도우는 0이 된다. 이때 송신 측은 데이터 전송을 일시 중지하고, 수신 측은 버퍼 공간이 생기면 윈도우 업데이트 패킷을 보낸다. 작은 윈도우 업데이트가 반복되어 비효율이 생기는 실링 윈도우(Silly Window Syndrome)는 클락의 알고리즘과 네이글 알고리즘 등으로 방지한다.
스트리밍 서비스에서 버퍼링이 일어날 때 플레이어는 TCP 연결을 통해 서버에 처리 가능한 데이터량을 전달한다. 재생 버퍼가 충분하면 수신 윈도우를 늘려 더 많은 데이터를 받고, 버퍼가 차면 윈도우를 줄여 흐름을 조절한다.
손실과 손상을 검출하고 세그먼트를 복구하는 오류제어
오류제어는 전송 중 발생한 오류를 수신 측에서 검출하고, 송신 측이 재전송하도록 하는 기법이다. TCP의 오류제어는 기본적으로 세그먼트 재전송에 기반한다. 세그먼트에 문제가 생기면 같은 세그먼트를 다시 전송한다.
TCP 헤더에는 16비트 체크섬 필드가 포함된다. 수신 측은 계산한 체크섬과 전송된 체크섬을 비교해 오류를 검출한다.
송신 측은 세그먼트를 보낸 뒤 타이머를 시작한다. ACK를 받지 못한 상태에서 타임아웃이 발생하면 해당 세그먼트를 재전송하며, RTO(Retransmission Timeout)는 네트워크 상황에 따라 동적으로 조정된다. 동일한 ACK가 연속 3번 수신됐을 때도 패킷 손실로 간주해 빠른 재전송을 수행한다.
SACK(Selective Acknowledgment)은 특정 범위의 데이터만 선택적으로 재전송할 수 있게 한다. TCP 옵션 필드로 구현되며, 중복 데이터 전송을 줄여 네트워크 효율성을 높인다.
온라인 뱅킹에서 거래 정보를 보낼 때도 이 메커니즘이 데이터 무결성을 뒷받침한다. 일부 패킷이 손상되거나 손실되면 체크섬으로 오류를 감지하고 해당 패킷만 재전송해 정확한 거래 정보가 전달되도록 한다.
혼잡 윈도우와 수신 윈도우가 만드는 실제 전송량
혼잡제어, 흐름제어, 오류제어는 각각 독립적인 목적을 갖지만 TCP 연결에서는 함께 작동한다. 오류제어가 패킷 손실을 감지하면 혼잡제어는 이를 네트워크 혼잡으로 보고 전송 속도를 조절한다.
수신 버퍼의 제한으로 흐름제어가 송신 윈도우를 줄이면, 혼잡제어가 허용하는 전송량에도 상한이 생긴다. 실제 TCP 전송 속도는 혼잡 윈도우와 수신 윈도우 중 더 작은 값으로 결정된다.
RTT를 지속적으로 측정해 타임아웃 값을 조정하면 불필요한 재전송을 피할 수 있다. 패킷 손실률과 지연 시간 변화에는 TCP Reno, TCP Vegas, TCP CUBIC 등의 TCP 변형으로 대응할 수 있다. TCP 헤더 압축과 타임스탬프, 선택적 확인응답 등의 옵션도 오버헤드를 줄이고 성능을 높이는 데 활용된다.
클라우드 컴퓨팅, 스트리밍 서비스, 온라인 금융 거래는 이런 TCP 전송 메커니즘에 의존한다. 네트워크 엔지니어와 개발자가 이 동작 원리를 이해하면, 대역폭이 제한되거나 지연 시간이 긴 환경에서도 애플리케이션의 전송 특성을 더 정확히 해석하고 설계할 수 있다.