TCP 혼잡 제어

컴퓨터공부·2023년 11월 6일

network

목록 보기
6/6

TCP가 취한 혼잡 제어 방식은 네트워크 혼잡에 따라 연결에 트래픽을 보내는 전송률을 각 송신자가 제한하도록 하는 것이다.
즉, 송신자가 경로에서 혼잡이 없음을 감지하면 송신율을 높이고 혼잡을 감지하면 송신율을 낮춘다.
그러면 어떻게 혼잡을 감지하고 어떻게 전송률을 제한할까?

송신측에서 동작하는 TCP 혼잡 제어 메커니즘은 새로운 변수인 혼잡 윈도(congestion window)를 추적한다.
앞으로 이 변수를 cwnd라고 사용하겠다.
혼잡윈도는 송신자가 네트워크로 트래픽을 전송할 수 있는 속도에 제약을 가한다.

이 글에서는 수신윈도의 제약조거을 무시할 수 있을 정도로 수신 버퍼가 크다고 하겠다.
따라서 송신자의 확응답이 안 된 데이터가 있다고 가정 해 혼잡위도의 모든 세그먼트는 전송 될 것이다.

전송 속도 조절

송신자는 RTT의 시작 때 cwnd바이트 만킁의 데이터를 전송할 수 있고 RTT의 끝나는 시점에 데이터에 대한 ACK를 수신한다. 따라서 송신 속도는 대략 cwnd/RTT라고 할 수 있다. 그러면 cwnd값을 조절 해 송신자는 전송 속도를 조절 할 수 있다.

경로 상 혼잡 감지

타임아웃이나 수신자로부터 3개의 중복 ACK를 수신했다면 송신자 측에 손실 이벤트가 발생했다고 했었다. 과도한 혼잡이 발생하면, 경로상의 하나 이상의 라우터 버퍼들이 오버플로되고 데이터그램이 손실된다. 따라서 손실 이벤트를 발생시키고 이를 통해 경로상의 혼잡이 발생했음을 알게된다.

그럼 TCP 송신자들은 가용 대역폭을 모두 사용하면서 네트워크를 혼잡시키지 않는 전송률을 어떻게 결정 할 수 있을까?
다음과 같은 처리 원칙에 따라 이 질문에 대한 답을 할 수 있다.

1. 손실된 세그먼트는 혼잡을 의미하며 TCP전송률은 한 세그먼트를 손실했을 때 줄여야한다

2. 확인응답된 세그먼트는 네트워크가 송신자의 세그먼트를 수신자에게 전송된다는 것이다. 이에따라 이전에 확인응답되지 않은 세그먼트에 대해 ACK가 도착하면 송신자의 전송률은 증가할 수 있다.

3. 대역폭 탐색 - 송신자는 혼잡이 발생하는 시점까지 전송률을 증가시키고 그 시점 이후부터는 주링ㄴ 후 다시 탐색을 시작한다.

TCP 혼잡 제어 알고리즘

슬로스타트

TCP 연결이 시작될 때 cwnd값은 일반적으로 1MSS로 초기화된다.
그러면 초기 전송률은 대략 MSS/RTT가 된다.
TCP송신자에게 가용 대역폭은 MSS/RTT보다 훨씬 클 것이므로 송신자는 가용 대역폭 양을 찾으려 할 것이다. 그러므로 슬로 스타트 상태에서는 cwnd값을 1MSS에서 시작해 한 전송 세그먼트가 첫 번째로 ACK를 받을 대마다 1MSS씩 증가한다.

따라서 TCP전송률은 작은 값으로 시작하지만 슬로스타트 단계동안 지수적으로 증가하게 된다.
그러면 이 증가는 언제까지 계속될까?
만약 타임아웃으로 표시되는 손실이벤트(혼잡)이 있을 경우 송신자는 cwnd값을 1로 설정하고 새로운 슬로 스타트를 시작한다.
송신자는 ssthresh(슬로스타트 임계값)을 혼잡이 검출되었을 시점에서의 cwnd의 반으로 정한다.
cwnd값이 ssthresh와 같으면 슬로 스타트는 종료되고 혼잡 회피모드로 전환한다.
TCP는 혼잡 회피 모드에서 cwnd를 좀 더 적게 증가시킨다.
마지막으로 만약 3개의 중복ACK가 검출되면 TCP는 빠른 재전송을 수행해 빠른 회복상태로 들어간다.

혼잡 회피

혼잡 회피 상태로 들어가는 시점에서 cwnd값은 대략 혼잡이 마지막으로 발견된 시점에서의 반값이 된다. 그러므로 RTT마다 cwnd를 두배로 하기보다는 RTT마다 하나의 MSS만큼 cwnd 값을 증가시킨다.
일반적으로 새로운 승인이 도착할 때마다 송신자가 cwnd를 MSS바이트만큼 증가시킨다.(MSS/cwnd)
그러면 언제 혼잡 회피의 선형 증가가 끝날까?
타임아웃이 발생했을 때 슬로 스타트의 경우와 같이 동작한다.
cwnd값은 1MSS로 설정하고 ssthresh값은 손실 이벤트가 발생한 때의 cwnd/2로 정한다.
하지만 3개의 중복된 ACK에 의해 손실 이벤트가 발생했을 때는 그 시점에서 cwnd의 값을 반으로 줄이고 ssthresh값을 cwnd값의 반으로 기록한다. 그리고 빠른 회복 상태로 들어간다.

빠른 회복

빠른 회복에서는 cwnd값을 손실된 세그먼트에 대해 수신된 모든 중복된 ACK에 대해 1MSS만큼씩 증가시킨다. 손실된 세그먼트에 대한 ACK가 도착하면 TCP는 cwnd 혼잡 회피 상태로 들어간다.

TCP의 혼잡 제어는 RTT마다 1MSS씩 cwnd의 선형 증가와 3개의 중복 ACK 이벤트에서 cwnd의 절반감소로 구성된다. 따라서 TCP는 가법적 증가 승법적 감소(additive-increase multiplicative decrease, AIMD)의 혼잡 제어 형식이라고 불린다.

즉 TCP는 3개의 중복 ACK가 발생 할 때까지 선형으로 cwnd(전송률)을 증가시키고 반으로 감소시키지만 다시 추가적 가용 대역폭의 탐색을 위해 선형으로 증가시킨다.

TCP 큐빅

이전까지에서 TCP는 AIMD에 의해 전송속도를 절반으로 줄인다음 천천히 증가시키는 것은 너무 신중을 가하는 것일 수 있다. 혼잡한 링크의 상태가 많이 변경되지 않은 경우 전송 속도를 더 빠르게 높여 손실 전 전송 속도에 근접한 다음 대역폭을 신중하게 조사하는 것이 더 좋을 수 있다.
이것이 TCP 큐빅의 개념이다.
TCP 큐빅에서는 ACK 수신 시에만 혼잡 윈도를 늘리고 슬로 스타트 단게와 빠른 복구 단계는 동일하지만 혼잡 회피 단계에 차이가 있다.

Wmax:손실이 마지막으로 감지되었을 때의 cwnd
K:손실이 없다고 가정할 때 윈도 크기가 다시 Wmax에 도달하는 미래 시점
t:현재 시점
큐빅은 혼잡 윈도를 t와 K 사이 거리의 세제곱 함수로 증가시킨다.
따라서 Wmax에 가까워 지도록 전송속도를 빠르게 증가시키고 Wmax에 가까워지면 속도를 줄여 대역폭을 조심스럽게 탐지한다.

윈도 크기가 w바이트이면 전송률은 대략 w/RTT라고 말했었다. TCP는 손실 이벤트가 발생할 때까지 RTT당 하나의 MSS만큼 w를 증가시켜서 추가 대역폭을 얻는다. 손실이 발생하는 시점의 w를 W라고 하면 전송률은 W/(2RTT)부터 W/RTT까지의 범위를 갖는다.
따라서 평균 처리율은 0.75W/RTT가 된다.

0개의 댓글