개요

TCP는 신뢰성 있는 데이터 전송을 위해 흐름 제어(Flow Control) 와 혼잡 제어(Congestion Control) 기능을 제공함.

흐름 제어는 송신자와 수신자 사이의 데이터 전송량을 조절하고, 혼잡 제어는 네트워크 전체의 혼잡을 방지하기 위한 메커니즘이다.

흐름 제어 (Flow Control)

송신자와 수신자의 처리 속도 차이로 인해 데이터가 손실되지 않도록 전송량을 조절하는 기능이다.

정지-대기 (Stop-and-Wait)

수신 측의 ACK를 받은 후에 다음 패킷을 전송하는 방식, 한 번에 하나의 패킷만을 전송할 수 있음

슬라이딩 윈도우 (Sliding Window)

ACK를 이용해서 송신 데이터의 양을 조절하는 방식, ACK를 받지 않더라도 미리 정해진 패킷의 수 만큼 연속적으로 전송하는 방식

  • 전송 효율이 좋음
  • ACK를 기다리지 않고 보낼 수 있는 데이터의 범위를 윈도우로 관리함
  • 수신자는 자신이 더 받을 수 있는 버퍼 크기를 수신 윈도우(rwnd)로 알리고, 송신자는 이를 넘지 않도록 전송량을 제한함

혼잡 제어 (Congestion Control)

네트워크의 혼잡 상태를 감지하고, 송신 속도를 조절하는 기능 트래픽 과부하로 인해 패킷 손실이 발생하는 것을 방지한다.

혼잡 제어는 네트워크 자원을 효율적으로 사용하면서 여러 사용자 간의 공정한 대역폭 분배를 보장하기도 한다.

느린 시작 (Slow Start)

처음 연결을 시작하거나, 네트워크가 혼잡한 경우 전송 속도를 급격히 늘리지 않고 천천히 증가시키는 방식,

  • 비교적 작은 초기 혼잡 윈도우(cwnd)에서 시작한다. 초기값은 TCP 구현과 표준에 따라 달라질 수 있다.
  • ACK를 받을 때마다 cwnd를 늘린다. 한 RTT 동안 현재 윈도우의 데이터가 모두 확인되면 결과적으로 약 두 배씩 증가한다.
  • 임계점에 도달한 경우, 혼잡 회피 단계로 전환한다.

지수적으로 증가하기 때문에, 임계치에 도달하기 전에 네트워크 혼잡이 발생할 가능성이 있음

혼잡 회피 (Congestion Avoidance)

느린 시작의 지수적 증가가 임계치에 도달하면, 혼잡 윈도우를 선형적으로 증가시키는 방식

  • ACK마다 조금씩 증가시켜 한 RTT당 전체 cwnd가 약 1 MSS 증가하도록 한다.
  • 패킷 손실이 발생하거나 중복된 ACK를 수신할 경우 혼잡으로 간주하고, 혼잡 제어를 수행한다.

네트워크 혼잡을 방지하면서 최대 전송 속도를 유지할 수 있음

빠른 재전송 (Fast Retransmit)

패킷 손실을 빠르게 감지하여 재전송하는 메커니즘

  • 수신자가 중복 ACK를 3번 연속으로 보낼 경우, 송신자는 해당 패킷이 손실된 것으로 판단한다.
    • 중복 ACK가 패킷 손실을 의미하는 이유는 TCP는 누적 방식으로 ACK를 보내는데, 1번 패킷을 받았으면, 다음 패킷을 의미하는 ACK 2를 보냄, 하지만 2번 패킷이 손실되고 3번, 4번 패킷을 받게 된 경우 계속해서 ACK 2번을 보내게 된다.
  • 손실된 패킷을 타이머 만료를 기다리지 않고 즉시 재전송한다.

빠른 복구 (Fast Recovery)

패킷 손실 후 전송 속도를 급격히 줄이지 않고, 적절히 감소시켜 네트워크 회복을 돕는 메커니즘

  • 중복 ACK를 3번 연속으로 받으면 손실된 세그먼트를 즉시 재전송하고 ssthresh를 기존 cwnd의 절반 정도로 낮춘다.
    • 중복 ACK를 수신한 것은 네트워크가 완전히 정체된 것이라고 판단하지 않는다. (이후 패킷들이 정상적으로 네트워크에 도달하고 있는 것을 의미하므로)
    • 손실된 패킷에 대한 정상적인 ACK가 도착하면 다음 단계로 넘어간다.
  • 중복 ACK가 이어지는 동안에는 네트워크를 빠져나간 세그먼트를 반영해 cwnd를 일시적으로 늘릴 수 있다.
  • 재전송한 세그먼트에 대한 새로운 ACK가 도착하면 cwndssthresh 수준으로 낮추고 혼잡 회피로 돌아간다.

대표 알고리즘

AIMD (Additive Increase Multiplicative Decrease)

  • Additive Increase: 혼잡이 발생하지 않을 때, 매 RTT마다 cwnd를 1MSS씩 증가
  • Multiplicative Decrease: 패킷 손실 발생 시, cwnd를 절반으로 감소

TCP Tahoe

  • 패킷 손실 시 cwnd를 1MSS 초기화하고 임계치를 절반으로 감소시킨다.
  • 손실 이후에 무조건 Slow Start를 한다.

TCP Reno

  • Fast Retransmit과 Fast Recovery를 도입한다.
  • 3중복 ACK를 받으면 Fast Retransmit으로 손실된 세그먼트를 재전송하고 Fast Recovery를 거쳐 혼잡 회피로 전환한다.
  • 재전송 타이머가 만료된 경우에는 더 심한 혼잡으로 보고 cwnd를 크게 낮춘 뒤 Slow Start로 돌아간다.