Shine's dev log

TCP congestion control 본문

컴퓨터 네트워크

TCP congestion control

dong1 2021. 2. 26. 17:31

1. congestion control

 

congestion control은 네트워크 상의 혼잡을 줄이기 위해 패킷의 전송량을 조절하는 것이다.

 

혼잡이 발생하는 이유는 라우터의 버퍼가 유한하기 때문이다. 이로인해 패킷 delay나 loss가 일어날 수 있기 때문에 congestion control이 꼭 필요하다.

 

아래 그림에서 라우터의 input link로 들어가는 패킷의 양이 증가함에 따라 output link로 나가는 패킷의 양은 그래프와 같이 나타난다. 그래프에서 가장 최대값 지점을 찾는 과정이 congestion control이라고 보면 된다.

 

congestion control

 

 

 

2. cwnd (congestion window)

 

congestion window (혹은 flight size)는 sender가 ack을 받기 전에 보낼 수 있는 패킷양을 의미한다.

 

예를들어 cwnd가 3으로 설정되어있으면, sender는 한번에 3개의 패킷을 보내고 ack을 기다린다. 물론 cwnd값이 증가하면 더 빠르게 데이터를 전송할 수 있지만, 네트워크 상에서 congestion이 발생할 수 있으므로 적절히 잘 조절하는게 중요하다.

 

TCP congestion control의 핵심도 바로 cwnd값을 잘 조절하는 것이다.

 

 

sender는 전송량을 결정할 때 두가지를 고려해서 보내야 한다.

첫째는 앞서 언급햇던 cwnd값이고, 둘째는 receiver의 flow control을 위한 rwnd 값이다. sender의 window size는 다음과 같이 결정된다.

sender window size = min ( rwnd, cwnd )

 

일반적인 경우, rwnd >> cwnd 이므로 보통 sender의 window size는 cwnd에 의해 결정된다. 따라서 단위시간당 TCP가 보낼 수 있는 데이터의 양은 대략 cwnd / RTT로 계산할 수 있다.

 

 

 

3. Additive increase & multiplicative decrease (AIMD)

 

AIMD는 congestion control을 위한 기본적인 개념이다.

 

아래 그림과 같이 패킷 loss가 발생하지 않는다면, 점진적으로 cwnd값을 증가시키다가, 만약 loss가 감지되면 cwnd값을 반으로 확 줄이는 방식이다.

 

AIMD

 

TCP congestion control을 하는 방식은 다양하게 있지만, 가장 기본이 되는 개념이 AIMD 방식이다.

 

 

 

4. TCP slow start

 

AIMD 방식은 cwnd값이 처음부터 너무 천천히 증가한다는 단점이 있다. 이를 보완하기 위해 TCP slow start 방안이 고안되었다.

 

slow start는 아래 그림과 같이 처음 cwnd값을 1MSS로 시작하여, 매 RTT마다 cwnd값을 두배로 증가시키는 것이다.

 

slow start

 

이 방식은 비교적 여유가 있는 초반에 cwnd값을 확 늘려주어 보다 효율적인 통신을 할 수 있게 해준다.

 

그렇다면 언제까지 slow start과정을 진행할까?

-> cwnd값이 ssthresh(Slow Start threshold)에 도달할 때까지 진행한다.

 

 

 

5. congestion avoidance 

 

앞서 slow start로 cwnd값이 ssthresh까지 증가한다고 하였다. 그 이후로는 congestion avoidance 과정에 돌입하게 된다.

 

congestion avoidance 과정은 매 RTT마다 cwnd값을 cwnd + MSS * (MSS/cwnd) 로 증가시키는 것이다.

수식으로 표현해서 복잡하지 그냥 한마디로 매 RTT마다 cwnd값을 1 증가시킨다는 의미이다.

 

즉 congestion avoidance 과정에서는 굉장히 천천히 cwnd값이 증가한다고 보면 된다. 아래 그림은 "How_are_you_today?" 라는 메시지를 slow start와 congestion avoidance를 적용하여 보내는 과정이다.  (ssthresh = 4)

 

example of slow start & congestion control

 

 

 

 

6. detecting, reacting to loss

 

앞서 slow start와 congestion avoidance로 cwnd값이 점진적으로 증가하다가 loss가 발생했을 경우에, TCP는 어떻게 처리할까?

 

우선 loss가 발생하는 두가지 유형을 생각해보고, 그에 따른 TCP의 대응을 살펴보자.

 

 

  •  유형 1) 3 duplicate ACKs로 인한 loss 판단

유형 1과 같은 경우, 중복된 ACK이 계속 온다는 것은 특정 패킷만 loss되었고 나머지 패킷들은 제대로 전송이 되었음을 의미한다. 이와 같은 경우에 cwnd를 loss가 발생했을 때의 절반으로 줄인다.

이후에는 다시 congestion avoidance 과정을 시행한다.

 

 

  •  유형 2) timeout으로 인한 loss 판단

유형 2와 같은 경우는 비교적 심각한 경우이다. 왜냐하면 전송한 모든 패킷들이 loss되었음을 의미하기 때문이다. 따라서 이와 같은 경우에 cwnd를 1로 확 줄여버리고, ssthresh 값도 아까의 절반으로 줄인다.

이후에는 다시 slow start 과정을 시행한다. 그런데 ssthresh 값도 절반으로 줄었으므로 이전보다 slow start 구간이 좁을 것이다.

 

 

아래 그림에서 C-D 구간유형 1(duplicated ACK)에 해당하는 것이고 E-F 구간유형 2(timeout)에 해당하는 것이다.

 

loss example

 

 

 

7. TCP Tahoe, TCP Reno

 

TCP Tahoe 방식은 slow start, congestion avoidance 과정을 거치다 loss가 발생했을 때, 무조건 유형 2번으로 처리하는 것이다.

 

TCP Reno 방식은 slow start, congestion avoidance 과정을 거치다 loss가 발생했을 때, 유형 1번과 유형 2번을 모두 사용하여 처리하는 것이다.

 

따라서 TCP Tahoe방식보다는 TCP Reno 방식이 더 효율적이라고 볼 수 있다.

 

물론 TCP congestion control 방식이 이 두가지만 있는것은 아니다. 이 두가지 방식은 매우 고전적인 방식이며 TCP-SACK, TCP-New Reno, TCP-Vegas, TCP Cubic, Multipath TCP등 매우 다양한 방식의 congestion control 방식이 개발되고 사용되고 있다.

 

 

 

오늘 배운 내용을 정리해보면,

 

1. 네트워크상의 혼잡을 줄이기위해 cwnd값을 조절해 congestion control을 한다.

 

2. 기본 원리는 AIMD이며, slow start, congestion avoidance 방식을 통해 cwnd를 키워간다.

 

3. loss가 발생했을 경우에는 timeout으로 인한 loss, 3 duplicated ack으로 인한 loss에 따라 각각 처리한다.

 

위 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.

'컴퓨터 네트워크' 카테고리의 다른 글

IP 프로토콜 (IP header, fragmentation)  (0) 2021.03.03
Network layer 개요  (0) 2021.02.28
TCP 연결 (3 way-handshake)  (0) 2021.02.25
TCP Flow Control  (1) 2021.02.24
TCP의 개념 (Transmission Control Protocol)  (0) 2021.02.24