Study/알고리즘 | 자료구조

TCP ACK 알고리즘: 신뢰성 있는 데이터 전송의 핵심 메커니즘

AC 2025. 11. 3. 07:11

 

네트워크 통신에서 데이터가 정확하게 전달되었는지 어떻게 확인할까요? 바로 ACK(Acknowledgment) 알고리즘이 그 해답입니다. TCP 프로토콜의 핵심 메커니즘인 ACK 시스템을 깊이 있게 살펴보겠습니다.


ACK의 기본 개념

ACK는 수신자가 송신자에게 "데이터 잘 받았어요!"라고 알려주는 확인 응답 메커니즘입니다. TCP는 연결 지향 프로토콜로서, 데이터의 신뢰성 있는 전송을 보장하기 위해 이 메커니즘을 사용합니다.

TCP 헤더에는 ACK 번호 필드가 존재하며, 이는 다음에 받기를 기대하는 바이트의 순서 번호를 나타냅니다. 예를 들어, ACK 번호가 1001이라면 "1000번까지는 모두 받았으니, 이제 1001번부터 보내주세요"라는 의미입니다.


ACK의 주요 동작 방식

누적 ACK (Cumulative ACK)

TCP는 기본적으로 누적 ACK 방식을 사용합니다. 이는 수신자가 순서대로 받은 마지막 바이트까지의 ACK를 보내는 방식입니다. 만약 세그먼트 1, 2, 3을 순서대로 받았다면, 세그먼트 3에 대한 ACK만 보내면 그 이전 세그먼트들도 모두 받았다는 의미가 됩니다.

이 방식의 장점은 네트워크 트래픽을 줄일 수 있다는 점입니다. 모든 패킷마다 개별 ACK를 보낼 필요가 없으니까요. 하지만 단점도 있습니다. 중간에 패킷이 손실되면, 그 이후에 정상적으로 도착한 패킷들에 대한 정보를 송신자가 알 수 없습니다.

지연 ACK (Delayed ACK)

효율성을 높이기 위해 TCP는 지연 ACK 전략을 사용합니다. 데이터를 받을 때마다 즉시 ACK를 보내는 대신, 일정 시간 동안 기다렸다가 여러 세그먼트에 대한 ACK를 한 번에 보내는 방식입니다.

일반적으로 다음 규칙을 따릅니다:

  • 두 개의 전체 크기 세그먼트를 받으면 즉시 ACK를 보냅니다
  • 두 번째 세그먼트가 도착하지 않으면 최대 500ms 후에 ACK를 보냅니다
  • 순서가 맞지 않는 세그먼트를 받으면 즉시 중복 ACK를 보냅니다

이 메커니즘은 네트워크 대역폭을 절약하고, 양방향 통신에서 데이터와 ACK를 함께 보낼 수 있게 해줍니다(피기배킹).

선택적 ACK (Selective ACK, SACK)

RFC 2018에서 정의된 SACK는 누적 ACK의 한계를 보완합니다. 수신자가 받은 모든 세그먼트의 범위를 송신자에게 알려줄 수 있습니다.

예를 들어, 세그먼트 1, 2, 4, 5를 받았고 3번이 손실되었다면, SACK 옵션을 통해 "1-2번은 받았고, 4-5번도 받았어요. 3번만 재전송해주세요"라고 명확히 알릴 수 있습니다. 이는 불필요한 재전송을 크게 줄여줍니다.


ACK와 재전송 메커니즘

타임아웃 기반 재전송

송신자는 세그먼트를 보낸 후 일정 시간(RTO: Retransmission Timeout) 내에 ACK를 받지 못하면 해당 세그먼트를 재전송합니다. RTO는 네트워크 상황에 따라 동적으로 조정되며, RTT(Round Trip Time)를 기반으로 계산됩니다.

RTO 계산은 Jacobson 알고리즘을 사용하여 RTT의 평균과 편차를 고려합니다:

$$\text{SRTT} = (1 - \alpha) \times \text{SRTT} + \alpha \times \text{RTT}$$

$$\text{RTTVAR} = (1 - \beta) \times \text{RTTVAR} + \beta \times |\text{SRTT} - \text{RTT}|$$

$$\text{RTO} = \text{SRTT} + 4 \times \text{RTTVAR}$$

여기서 α는 보통 1/8, β는 1/4로 설정됩니다.

빠른 재전송 (Fast Retransmit)

타임아웃을 기다리는 것은 비효율적일 수 있습니다. TCP는 중복 ACK를 통해 더 빠르게 손실을 감지합니다. 송신자가 동일한 ACK 번호를 3번 연속으로 받으면(중복 ACK 3개), 타임아웃을 기다리지 않고 즉시 해당 세그먼트를 재전송합니다.

이는 패킷 손실을 훨씬 빠르게 복구할 수 있게 해주며, 네트워크 처리량을 크게 향상시킵니다.

빠른 복구 (Fast Recovery)

빠른 재전송 후에는 빠른 복구 알고리즘이 동작합니다. 혼잡 윈도우를 절반으로 줄이되, 슬로우 스타트 단계로 돌아가지 않고 혼잡 회피 단계를 유지합니다. 이는 일시적인 패킷 손실에 과도하게 반응하지 않도록 합니다.


ACK와 흐름 제어

ACK는 단순히 수신 확인만 하는 것이 아니라, 흐름 제어에도 중요한 역할을 합니다. TCP 헤더의 윈도우 크기 필드를 통해 수신자는 자신이 받을 수 있는 데이터의 양을 송신자에게 알립니다.

슬라이딩 윈도우 프로토콜

송신자는 ACK를 받지 않고도 윈도우 크기만큼의 데이터를 연속으로 보낼 수 있습니다. ACK를 받으면 윈도우가 앞으로 슬라이드하여 새로운 데이터를 보낼 수 있게 됩니다.

이 메커니즘은 파이프라이닝을 가능하게 하여, 왕복 시간이 긴 네트워크에서도 높은 처리량을 유지할 수 있게 해줍니다.

제로 윈도우 처리

수신자의 버퍼가 가득 차면 윈도우 크기를 0으로 설정한 ACK를 보냅니다. 송신자는 데이터 전송을 중단하고, 주기적으로 윈도우 프로브를 보내 수신자의 윈도우가 다시 열렸는지 확인합니다.


ACK와 혼잡 제어

ACK는 혼잡 제어 알고리즘의 핵심 입력 신호입니다. ACK의 도착 패턴을 분석하여 네트워크 상태를 추정하고, 전송 속도를 조절합니다.

슬로우 스타트

연결 초기에는 혼잡 윈도우를 작게 시작하여, ACK를 받을 때마다 지수적으로 증가시킵니다. 이는 네트워크 용량을 빠르게 탐색하면서도 급격한 혼잡을 방지합니다.

혼잡 회피

혼잡 윈도우가 임계값(ssthresh)에 도달하면, 선형적으로 증가시킵니다. 이는 네트워크가 혼잡 상태에 가까워질수록 조심스럽게 전송 속도를 높이는 전략입니다.

혼잡 발생 시 대응

타임아웃이나 중복 ACK를 통해 혼잡을 감지하면, 혼잡 윈도우를 줄이고 임계값을 조정합니다. 타임아웃의 경우 더 심각한 혼잡으로 간주하여 윈도우를 1로 리셋하고, 중복 ACK의 경우 절반으로만 줄입니다.


최신 ACK 최적화 기법

TCP Timestamps

RFC 7323에서 정의된 타임스탬프 옵션을 사용하면 더 정확한 RTT 측정이 가능합니다. 이는 재전송된 세그먼트에 대한 ACK도 RTT 계산에 사용할 수 있게 해주며, PAWS(Protection Against Wrapped Sequences) 메커니즘을 통해 시퀀스 번호 재사용 문제도 해결합니다.

Appropriate Byte Counting (ABC)

전통적인 ACK 기반 윈도우 증가는 ACK 개수에 의존하지만, ABC는 ACK된 바이트 수를 기준으로 윈도우를 증가시킵니다. 이는 지연 ACK나 ACK 분할 공격에 더 강건합니다.

ECN (Explicit Congestion Notification)

IP 헤더의 ECN 비트를 사용하여 라우터가 패킷을 드롭하기 전에 혼잡 신호를 보낼 수 있습니다. 수신자는 이를 ACK에 반영하여 송신자에게 전달하며, 송신자는 패킷 손실 없이도 혼잡에 대응할 수 있습니다.


ACK 최적화 전략

ACK 압축

고속 네트워크에서는 ACK 트래픽 자체가 병목이 될 수 있습니다. 헤더 압축 기술이나 ACK 필터링을 통해 ACK 오버헤드를 줄일 수 있습니다.

ACK 우선순위 지정

QoS(Quality of Service) 메커니즘을 통해 ACK 패킷에 높은 우선순위를 부여하면, 혼잡 상황에서도 ACK가 빠르게 전달되어 전체 처리량이 향상됩니다.

비대칭 경로 처리

업로드와 다운로드 속도가 크게 다른 비대칭 링크에서는 ACK 트래픽이 다운로드 성능에 영향을 줄 수 있습니다. ACK 페이싱이나 적응적 ACK 전략을 통해 이를 완화할 수 있습니다.


실무 적용 시 고려사항

애플리케이션 계층 최적화

TCP의 ACK 메커니즘은 커널 레벨에서 자동으로 처리되지만, 애플리케이션 설계도 중요합니다. 작은 데이터를 자주 보내면 Nagle 알고리즘과 지연 ACK의 상호작용으로 지연이 발생할 수 있습니다. TCP_NODELAY 옵션을 통해 이를 제어할 수 있습니다.

모니터링과 디버깅

tcpdump, Wireshark 같은 도구로 ACK 패턴을 분석하면 네트워크 문제를 진단할 수 있습니다. 중복 ACK의 빈도, RTO 발생률, 재전송률 등의 지표를 모니터링하세요.

튜닝 파라미터

Linux에서는 /proc/sys/net/ipv4/tcp_* 파라미터를 통해 ACK 관련 동작을 조정할 수 있습니다. 특히 tcp_sack, tcp_timestamps, tcp_window_scaling 등은 성능에 큰 영향을 줍니다.


미래 전망

QUIC과 ACK의 진화

Google이 개발한 QUIC 프로토콜은 UDP 기반이지만 TCP의 신뢰성 메커니즘을 재설계했습니다. 스트림 단위의 독립적인 ACK, 더 정교한 손실 감지, 개선된 혼잡 제어 등을 제공합니다. HTTP/3가 QUIC을 기반으로 하면서, 이는 웹 통신의 새로운 표준이 되고 있습니다.

머신러닝 기반 ACK 최적화

네트워크 조건을 학습하여 RTO, 혼잡 윈도우, ACK 전략을 동적으로 최적화하는 연구가 진행 중입니다. Google의 BBR(Bottleneck Bandwidth and RTT) 알고리즘은 이미 이러한 방향의 첫 걸음을 보여주고 있습니다.


결론

ACK 알고리즘은 단순해 보이지만, 신뢰성 있는 네트워크 통신의 토대입니다. 누적 ACK, 지연 ACK, SACK, 빠른 재전송 등 다양한 메커니즘이 조화롭게 동작하여 효율적이고 강건한 데이터 전송을 가능하게 합니다.

네트워크 엔지니어나 백엔드 개발자라면 ACK의 동작 원리를 이해하는 것이 필수적입니다. 이를 통해 성능 문제를 진단하고, 최적의 네트워크 설정을 선택하며, 미래의 프로토콜 발전 방향을 예측할 수 있습니다.

TCP는 40년이 넘는 역사를 가진 프로토콜이지만, ACK 메커니즘은 여전히 진화하고 있습니다. 새로운 네트워크 환경과 애플리케이션 요구사항에 맞춰 계속해서 개선되고 있으며, 이는 인터넷의 미래를 형성하는 중요한 요소입니다.

LIST