wanna be dev 🧑‍💻

Cool 하고 Sick한 개발자가 되고 싶은 uzun입니다

A.K.A. Kick-snare, hyjhyj0901, h_uz99 solvedac-logo

Computer Science/Computer Network

📡 [Network] TCP 혼잡 제어 알아보기 [1] (Slow start 느린 출발, Congestion Avoidance 혼잡회피, Fast Recovery 빠른 회복, Reno, Tahoe, CUBIC)

Kick_snare 2022. 11. 5. 16:37
728x90

본 포스팅은 < 컴퓨터 네트워킹 하향식 접근[8판] James F. Kurose, Keith W. Ross 저/최종원, 강현국, 김기태 > 을 참고하여 작성되었습니다.

TCP congestion control 혼잡제어

TCP 혼잡 제어에 대한 3가지 질문

혼잡제어에 대한 세가지 의문점이 있다. 이에 대한 답을 알아보자.

1. TCP sender는 어떻게 트래픽 전송률을 제한하는가?

  • congestion window (cwnd) 를 가진다. (rwnd와 유사)
  • LastByteSent - LastByteAcked ≤ min(cwnd,rwnd)

2.  TCP sender는 자신과 receiver 사이 경로의 혼잡을 어떻게 감지하는가?

  • 정상적인 상태가 아니라면 timeout 또는 3dupack (3연중복ACK)가 감지 될 것.

3. TCP sender는 end systems간 혼잡을 감지함에 따라 송신율을 변화시키기 위해 어떤 알고리
즘을 사용해야 하는가?

  • ACK 가 오면 cwnd를 증가
  • timeout 또는 3dupack 이 발생하면 cwrnd를 감소

TCP 혼잡 제어 알고리즘 (TCP Reno)

이것은 처음에 [Jacobson 1988] 에서 설명하고 [RFC5681]에 표준화되었다. 이 알고리즘은 다음과 같은 중요한 세 가지 구성 요소를 갖는다.

  1. 슬로스타트(slowstart)
  2. 혼잡회피 (congestion avoidance)
  3. 빠른회복(fast recovery)

TCP 제어 알고리즘은 종종 가법적 증가, 승법적 감소라고도 불린다. (additive-increase, multiplicative decrease , AIMD)

TCP slow start

TCP 연결이 시작될 때, cwnd의 값은 일반적으로 1MSS로 초기화된다. 처음 상태인 slow start 모드에서는 첫 손실이 발생할 때까지 cwnd 윈도우의 크기를 지수적으로 비율을 늘린다.

그렇다면 이 지수적 증가는 언제 끝나는가?

  1. 타임아웃이 발생하면 윈도우 크기를 1로 초기화하고 새로 슬로우 스타트를 시작한다.
  2. 임계값 ssthresh (마지막 손실 발생시의 cwnd의 절반)와 같아지면 혼잡회피 모드로 들어간다.

TCP congestion avoidance

직전 손실이 발생했을 때의 cwnd의 절반값에 도달 했다면 혼잡회피 모드로 변경된다. 슬로 스타트 방법보다 조심스럽게 선형적으로 증가된다.

마찬가지로 이 선형적 증가는 언제 끝나는가?

  1. 타임아웃이 발생하면 윈도우 크기를 1로 초기화 하고 새로 슬로 스타트를 시작한다.
  2. 3개의 중복 ACK가 검출되면 ssthresh 를 갱신하고 빠른 회복 모드로 들어간다.

TCP fast recovery

혼잡 회피 모드로 계속 증가하다가 손실이 발생할 것이다. fast recovery 모드에서는 3dupack와 timeout의 손실을 구별한다.

  • 3dupack (가벼운 손실)

➡️ fast recovery 빠른 복구를 위해 cwnd를 현재의 절반 + 3 MSS 으로 줄임

3 * MSS 를 더해주는 이유는 당장의 새로운 패킷을 보낼 수 있도록 하기 위함이다.

  • timeout (큰 손실)

➡️ cwnd를 1MSS로 초기화하여 다시 slow start

TCP Tahoe

빠른 회복은 TCP의 구성요소로 권고사항이지만 필수는 아니다.TCP Tahoe 라고 불리는 초기 TCP 버전은 타임아웃으로 표시되거나 3개의 중복 ACK을 받는 경우 모두 무조건 윈도우 사이즈를 1MSS 로 줄이고 슬로 스타트로 들어간다.

TCP CUBIC

TCP CUBICTCP Reno와 약간 다르다. ACK 수신시에만 혼잡 윈도우 cwnd를 늘리고 슬로 스타트 단계와 빠른 복구는 동일하지만 혼잡회피 모드에서 차이점을 보인다.

기존의 TCP Reno에서는 혼잡 회피모드에 들어가게 되면 가장 최신의 손실의 절반 지점을 지나게되면 선형적으로 하나씩 증가하게 된다. 하지만 CUBIC에서는 현재 시작으로 손실이 마지막으로 감지되었을때의 혼잡 제어 윈도우의 크기까지 도달하기 위해 세제곱 함수로 증가한다. 즉 멀리 떨어져있을 수록 빠르게 커지며, 예상 값에 가까워 질 수록 조심스럽게 증가하게 된다.

위 그림은 TCP Reno와 TCP CUBIC 성능을 비교하고 있다.

TCP 큐빅은 최근 널리 보급되고 있으며 최근 측정에서는 인기있는 5000개의 웹서버에서 절반이상이 TCP CUBIC을 실행하고 있는 것을 나타난다고 한다. 또한 리눅스 운영체제의 디폴트 TCP 버전이다.

728x90