0196

학교

[컴퓨터 네트워크] Chapter 3. Transport Layer (Part 3) - (2)

일자 : 9주차 1차시

7. TCP 혼잡 제어

[1] TCP 혼잡 제어 메커니즘

  • 느린 시작 (Slow start)

  • 혼잡 회피 (Congestion avoidance)

  • 빠른 복구 / 빠른 재전송 (Fast recovery / Fast retransmission)

  • 변수

    • cwnd: 혼잡 윈도우 (Congestion Window)

    • ssthresh: 느린 시작 임계값 (Slow-start threshold)

    • rwnd: 수신자가 광고한 윈도우 (Receiver's advertised window)

[2] TCP 느린 시작 (TCP slow start)

1) 특징 1

  • 만약 TCP가 송신자가 네트워크에 여러 세그먼트를 주입하며(injecting) 연결을 시작하면, 이는 수신자가 광고한(advertised) 윈도우 크기만큼 할 수 있다.

  • 이 접근법의 문제점은 무엇인가?

    • 중간 라우터에서 혼잡이 발생하면(intermediate)(패킷이 버려(discarded질 수 있음), 이는 TCP 연결의 처리량을 급격히(drastically) 줄일 수 있다.

  • Slow Start 원칙:

    • 네트워크의 가용 용량을 확인하기 위해 서서히 탐색한다(probe).

    • 빠르게(rapidly 가용 대역폭을 찾을 수 있도록 한다.

    • 혼잡 윈도우 크기가 지수적으로 증가한다.

      • 만약 cwnd가 선형적으로 증가한다면 시간이 너무 오래 걸린다.

2) 특징 2

  • 연결이 시작되면 첫 번째 손실 사건이 발생할 때까지 속도를 지수적으로(exponentially) 증가시킨다.

    • 처음에는 cwnd = 1 MSS (최대 세그먼트 크기)

    • 각 RTT마다 cwnd를 두 배로 증가시킨다.

    • 이는 수신된 ACK마다 cwnd를 증가시켜 수행된다.

  • 요약: 초기 속도는 느리지만, 급격하게 지수적으로(exponentially) 증가한다(ramps up).

설명: TCP의 느린 시작은 네트워크의 혼잡을 피하기 위해 처음에는 느리게 시작하여 점차적으로 네트워크의 가용 대역폭을 탐색하며 빠르게 증가하는 방식이다. 첫 번째 손실 사건이 발생할 때까지는 cwnd를 두 배로 늘려가며 점차적으로 전송 속도를 빠르게 증가시킨다.

[3-1] TCP 혼잡 회피 (Congestion avoidance)

  • 혼잡 회피 모드에서는 cwnd가 선형적으로 증가한다.

    • 모든 세그먼트가 확인된 경우에만 cwnd는 MSS(최대 세그먼트 크기)만큼 증가한다.

  • 만약 cwnd < ssthresh라면 TCP는 느린 시작(slow start)에 있으며, 그렇지 않으면 TCP는 혼잡 회피(congestion avoidance)를 수행하고 있다.

  • 혼잡이 발생하면(타임아웃이나 중복 ACK 수신으로 인식됨), 현재 윈도우 크기의 절반은 ssthresh에 저장된다.

[3-2] TCP 혼잡 회피: AIMD

  • 접근 방식: 송신자는 패킷 손실(혼잡)이 발생할 때까지 전송 속도를 증가시키고, 손실 이벤트가 발생하면 전송 속도를 감소시킨다.

  • AIMD 톱니바퀴 행동 (AIMD sawtooth behavior): 대역폭을 탐색한다.

2) 특징

  1. Additive Increase:

    • 전송 속도를 매 RTT마다 최대 세그먼트 크기(MSS)만큼 증가시킨다. 손실이 감지될 때까지 계속 증가시킨다.

  2. Multiplicative Decrease:

    • 손실 이벤트가 발생하면 전송 속도를 절반으로 줄인다.

설명: AIMD(가감 증감)는 TCP 혼잡 제어에서 중요한 방법론으로, 송신자는 패킷 손실이 발생할 때까지 전송 속도를 점차적으로 증가시키고, 손실이 발생하면 전송 속도를 급격히 절반으로 줄여 혼잡을 피한다. 이 과정은 "톱니바퀴" 형태의 패턴을 보이며, 네트워크의 가용 대역폭을 효율적으로 탐색한다.

[3-2] TCP 혼잡 회피: 세부사항

1) TCP 송신 동작

  • 대략적으로(roughly): cwnd 바이트를 송신하고, RTT만큼 기다려 ACK를 받은 후, 추가로 바이트를 송신한다.

    TCP 전송 속도(rate) ≈ $\frac{cwnd}{RTT}$ 바이트/초

2) 특징

  • TCP 송신자는 전송을 제한한다: LastByteSend - LastByteAcked <= cwnd

  • cwnd는 네트워크 혼잡을 관찰하여 동적으로 조정되며, 이는 TCP 혼잡 제어를 구현하는 방식이다. LastByteSend - LastByteAcked < cwnd 조건에 따라 송신이 이루어진다.

설명: TCP 송신자는 cwnd 크기만큼 데이터를 보내고, 해당 데이터에 대한 ACK를 기다린 후 다시 데이터를 전송하는 방식으로 작동한다. cwnd는 네트워크의 혼잡 상태를 반영하여 송신자가 전송할 수 있는 데이터 양을 조절하며, 이를 통해 네트워크의 효율적인 사용을 도모한다.

[4] TCP 빠른 복구: 손실 감지 및 반응

1) 경우의 수

  • 타임아웃에 의한 손실:

    • cwnd는 1 MSS로 설정된다.

  • TCP Tahoe는 항상 타임아웃 또는 3개의 중복 ACK가 발생하면 cwnd를 1로 설정한다.

    • 이후 윈도우는 지연 시작(Slow Start)처럼 지수적으로 성장하며, 임계값(ssThresh)까지 성장한 후에는 선형적으로 증가한다.

  • 3개의 중복 ACK에 의한 손실: TCP Reno

    • 중복 ACK는 네트워크가 일부 세그먼트를 전달할 수 있음을 나타낸다.

    • cwnd는 반으로 줄어들며, 윈도우는 선형적으로 증가하고 즉시 혼잡 회피(Congestion Avoidance) 단계로 진입한다(지연 시작 생략).

    • 지연 시작을 생략함으로써 빠른 복구는 대역폭 낭비를 줄인다.

설명:

  • 타임아웃은 네트워크에서 패킷 손실을 감지하는 가장 기본적인 방법으로, 손실이 발생하면 cwnd를 1로 설정하여 전송 속도를 다시 시작한다. 하지만 TCP Tahoe에서는 타임아웃 또는 중복 ACK가 3번 발생하면 cwnd를 1로 설정하고, 윈도우 크기가 지수적으로 증가하면서 혼잡을 회피하려 시도한다.

  • TCP Reno에서는 3개의 중복 ACK가 도달하면, 네트워크가 여전히 일부 세그먼트를 전송할 수 있음을 의미하므로 cwnd를 반으로 줄이고, 빠르게 혼잡 회피 단계로 들어가게 된다. 이는 지연 시작을 건너뛰기 때문에 대역폭 낭비를 줄이는 데 도움이 된다.

2) TCP Tahoe와 TCP Reno의 차이

TCP TahoeTCP Reno는 모두 TCP의 혼잡 제어 알고리즘을 사용하여 네트워크 혼잡을 관리하는 방법을 다릅니다. 이 두 가지 방식은 주로 패킷 손실을 감지하고 처리하는 방법에서 차이를 보입니다.

(1) TCP Tahoe

  • 비유: TCP Tahoe는 마치 "늦은 반응을 보이는 사람"과 같습니다. 손실이 발생하면 즉시 모든 전송을 중단하고 처음부터 다시 시작하는 방식입니다.

  • 특징:

    • 타임아웃이나 3개의 중복 ACK를 받으면 cwnd1 MSS로 설정하고, 다시 Slow Start 단계에서 시작합니다. 이는 윈도우 크기가 지수적으로 증가하며, 혼잡을 회피하는 방식입니다.

    • 손실이 발생하면 다시 시작하므로, 손실 이후에 대역폭을 다시 확보하는 데 시간이 걸립니다.

(2) TCP Reno

  • 비유: TCP Reno는 "빠르게 반응하는 사람"과 비슷합니다. 손실이 발생해도 일부 전송을 계속할 수 있다고 판단하여 효율적으로 회복하려고 합니다.

  • 특징:

    • 3개의 중복 ACK를 받으면 Fast Recovery를 시작합니다. cwnd반으로 줄이고, 지연 시작을 건너뛰고 즉시 Congestion Avoidance 단계로 들어갑니다.

    • 이렇게 함으로써 네트워크가 일부 세그먼트를 처리할 수 있다고 판단하고, 대역폭 낭비를 줄이며 빠르게 전송을 재개할 수 있습니다.

(3) 요약:

  • TCP Tahoe는 손실 발생 시 완전히 리셋하여 처음부터 다시 시작하는 방식이고,

  • TCP Reno는 손실이 발생하더라도 일부 데이터를 계속 보내며, 빠르게 복구할 수 있도록 합니다.

따라서 TCP RenoTCP Tahoe보다 더 빠르게 대역폭을 회복할 수 있는 장점이 있습니다.

[5] TCP: Slow Start에서 Congestion Avoidance로 전환

질문: cwnd의 지수적 증가가 언제 선형 증가로 전환되어야 할까요?
답변: cwnd가 타임아웃 이전의 값의 절반에 도달하면, 지수적 증가가 선형 증가로 전환되어야 합니다.

1) 구현:

  • 변수 ssthresh (slow-start threshold)가 사용됩니다.

  • 손실 이벤트가 발생하면, ssthresh손실 이벤트 발생 직전의 cwnd 값의 절반으로 설정됩니다.

설명:

  • TCP는 네트워크 혼잡을 피하기 위해 초기에는 Slow Start 방식으로 지수적 증가를 합니다.

  • 그러나 혼잡을 감지하면, 전송 속도를 점진적으로 증가시키는 Congestion Avoidance로 전환됩니다.

  • 이 전환 지점은 cwnd 값이 타임아웃 직전의 값의 절반에 도달할 때 이루어지며, 그 후에는 선형적으로 증가하여 혼잡을 피하려고 합니다.

[6] Summary: TCP congestion control

[7] TCP 처리량

  • TCP는 네트워크가 혼잡하지 않으면, 윈도우 크기만큼 데이터를 전송한다.

  • 평균 TCP 처리량은 윈도우 크기와 RTT의 함수로 표현할 수 있습니다.

    • Slow Start는 무시하고, 항상 전송할 데이터가 있다고 가정합니다.

  • W: 손실이 발생하는 윈도우 크기(바이트 단위)

    • 손실이 발생하기 직전까지 전송할 수 있는 데이터 양을 나타낸다.

    • 평균 윈도우 크기(전송 중인 바이트 수)는 ¾ W입니다.

    • 평균 처리량은 3/4 W per RTT입니다.

평균 TCP 처리량 = (3/4) * W / RTT 바이트/초

[8] "긴 대역폭, 긴 전송 경로에서의 TCP"

  • 예시: 1500 바이트 세그먼트, 100ms RTT, 10 Gbps 처리량을 원함

    • 이 경우, W = 83,333개의 전송 중인 세그먼트가 필요함

  • 세그먼트 손실 확률 L에 따른 처리량 (Mathis, 1997):

    TCP 처리량 = $\frac{1.22 \times MSS}{RTT \sqrt{L}}$

    • MSS : 1500 바이트 세그먼트

    • RTT : 100ms RTT -> 0.1

    • 처리량 : 10 Gbps -> 1 바이트 = 8 비트이므로,10 Gbps= 10,000,000,000 bits per second= 1,250,000,000 bytes per second

    ➜ 10 Gbps의 처리량을 달성하려면 손실률 L = 2·10^-10이 필요함
    – 이는 매우 작은 손실률임!

  • 긴 대역폭과 고속 네트워크 시나리오를 위한 새로운 TCP 버전이 필요하다!

설명:

  • 고속 네트워크 환경에서 높은 처리량을 달성하기 위해서는 매우 낮은 세그먼트 손실률이 필요하다.

  • 위 식을 보면, 세그먼트 손실률 L이 매우 작아야만 원하는 처리량을 유지할 수 있다. 이를 통해 기존 TCP는 긴 경로와 고속 네트워크 환경에서 적합하지 않음을 알 수 있으며, 이를 해결하기 위한 새로운 TCP 버전이 필요함을 시사한다.

[9] TCP CUBIC

  • AIMD로 대역폭을 탐색하는 것보다 더 나은 방법이 있을까?

  • 통찰력/직관 (Insight/intuition):

    • $W_{max}$: 혼잡 손실이 발생한 전송률

    • 병목 링크의 혼잡 상태는 아마도 크게 변하지 않았을 것

    • 손실 발생 후 전송률/윈도우 크기를 반으로 줄인 후, 처음에는 Wmax에 더 빠르게 접근(ramp)하고, 그 후에는 Wmax에 더 천천히 접근하게 됨

1) 특징

  • TCP CUBICAIMD(Additive Increase Multiplicative Decrease) 방식의 한계를 극복하려는 접근 방식으로, 전송률을 더 빠르게 증가시킬 수 있도록 개선되었다.

  • Wmax는 마지막 손실이 발생했을 때의 윈도우 크기를 의미하며, CUBIC에서는 이 값을 기준으로 빠르게 전송률을 다시 높이려 하고, 그런 후에는 Wmax에 접근할 때 더 천천히 접근하도록 설계되어 있다.

  • 이 방식은 대역폭이 충분한 네트워크에서 성능을 더 잘 발휘할 수 있도록 도와줍니다.

2) 특징 2

  • K: TCP 윈도우 크기가 Wmax에 도달할 시점

    • K 자체는 조정 가능

    • 이를 통해 K 값에 대한 예측을 통해 더 효율적인 윈도우 크기 증가를 유도할 수 있다.

  • 현재 시간과 K 사이의 거리를 세제곱한 값에 비례하여 W 증가

    • K와 멀리 있을 때는 더 크게 증가

    • K에 가까워질수록 더 작은 증가 (조심스러운 증가)

  • TCP CUBIC은 리눅스에서 기본 설정으로 사용되며, 가장 인기 있는 웹 서버의 TCP 방식

(1) 설명

  • TCP CUBICAIMD 방식을 개선하여 Web 서버와 같은 고속 네트워크 환경에서 성능을 극대화할 수 있는 방식으로 설계되었다.K 값과 Wmax를 조정함으로써 혼잡을 피하고 대역폭을 효율적으로 활용하는데 도움이 된다.

(2) 공식

$cwnd = C(t-K)^3 + w_{max}$
K = $\sqrt\frac{w_{max}(1-\beta)}C$

  • 윈도우 크기 cwnd는 현재 시간과 K 사이의 거리를 세제곱하여 점진적으로 증가한다.

  • 처음에는 K와 멀리 있을 때 빠르게 증가하고, 점차 K에 가까워지면 증가 속도를 조절하여 안정적이고 효율적인 전송을 유지하려는 방식이다.

[10] 명시적 혼잡 알림 (ECN)

TCP 배포는 종종 네트워크 지원(network-assisted) 혼잡 제어를 구현합니다:

  • 네트워크 라우터가 혼잡을 나타내기 위해 IP 헤더의 두 비트(ToS 필드)에 표시합니다.

    • 표시 정책은 네트워크 운영자가 선택합니다.

  • 혼잡 표시가 목적지로 전달됩니다.

  • 목적지는 ACK 세그먼트에서 ECE 비트를 설정하여 송신자에게 혼잡을 알립니다(notify).

  • 이 과정은 IP와 TCP에서 모두 이루어집니다(involves)

    • IP 헤더에서 ECN 비트 표시

      • 네트워크 라우터는 혼잡을 감지하고, 이를 IP 헤더에 표시

    • TCP 헤더에서 C, E 비트 표시

  • ECN을 통해 혼잡을 사전에 감지하고, 패킷 손실 없이 네트워크 성능을 최적화할 수 있습니다.