네트워크/개념

[NW]#13. TCP 혼잡 제어 ( TCP Congestion Control )

코딩하는상후니 2022. 12. 12. 18:26

 

 

 

 


 

 

* TCP 혼잡 제어

 
 
 
TCP 에서의 제어 (=Control) 란 용어는 앞 단원에서 설명했듯이,
어떤 상황을 고려해 자신의 데이터를 통제한다는 의미이다.
 
한마디로 혼잡제어는 '전체 네트워크 상황을 고려한 통신 방식' 이라고 볼 수 있겠다.
 
여기까지만 들었을 때 궁금한 부분은 크게 2가지 정도일 것이다.
 
1. 어떻게 전체적인 네트워크 상황을 고려할 수 있을까 ??
2. 상황이 나쁘다면 어떻게 자신의 데이터를 통제할까 ??
 
 
1번 질문에 대한 답은 이제까지 배운 것으로 대답할 수 있겠다.
 
네트워크 상황을 감지하는 곳이 End-point 이라 가정할 때, 해당 종단 기준으로
패킷 전송을 보냈지만 전송 패킷이 유실되거나 상대 측에서 보낸 ACK 가 유실되었을 때, Timeout 이 발생한다.
또,
계속해서 중복된 ACK 를 받는다면 현재 자신이 보내고 있는 패킷이 계속 상대방에게 전달되지 않음을 뜻한다.
 
TCP 는 항상 응답을 받음으로써 상대방과의 '논리적 연결' 을 지향하기 때문에
상대방에게 받은 데이터를 통해서 전체적인 상황까지 고려할 수 있다는 장점이 있다.
 
하지만, 응답 데이터만을 보고 전체를 판단하는 것이므로 예외적인 상황들이 존재할 수 있다.
이 때문에 오류인 상황처럼 확실하게 전체 네트워크가 느려진다고 판단하는 기준이 필요할 것이다.
 
네트워크 상황을 판단하는 기준들과 자신의 데이터 송신을 제어하는 방식들이 여러가지 존재한다.
 
결국,
얼마나 면밀하게 네트워크 상황을 판단 가능한 것과 얼마나 효율적으로 데이터 송신을 관리하는 것이
TCP 발전의 지향점될 수 있겠다.
 
 
보통, 송신 측에서 자신의 데이터 송신률을 윈도우 크기를 조정함으로써 조절한다.
구체적으로 어떤 방식으로 윈도우 크기를 조절하는지 살펴보자.
 
 
 
 
 
 
 

* AIMD ( Additive Increase Multicative Decrease )

 
영어 그대로 해석하면
윈도우 크기는 1씩 증가 ( 합 증가 ) 시키면서 혼잡을 감지한다면 크기를 절반으로 줄이는 ( 곱 감소 ) 방법이다.
즉,
AIMD 방식은 패킷을 보내는 윈도우 단위마다 1씩 증가시킨다.
 
시간이 흐르면 결국엔 평행 상태로 수렴하는 특징을 가진다.
AIMD 의 단점은 증가 폭이 크지 못해 초기 연결 시에 불안정하다.
 
 

* Slow Start ( 느린 시작 )

 

 

 

AIMD 방식보다 조금 향상된 버전이다.
초기에 불안정한 AIMD 방식의 단점을 조금 보완한 방식이라 볼 수 있다.
 
Slow Start 방식은 윈도우 크기를 받은 ACK 마다 1씩 늘린다.
 
 
앞서 TCP 방식은 GBN 방식과 SR 방식을 혼합해서 사용한다고 했다.
따라서 보내는 패킷마다 ACK 를 받을 수 있는데 이 때, cwnd 크기를 1씩 늘린다는 말이다.
 
결과적으로,
각 패킷마다 1씩 늘리게 되므로 1, 2, 4, 8, 16, 32 ... ( 2 의 x 승 ) 지수함수 꼴로 늘어나게 된다.
 
 
AIMD 와 Slow Start 의 단점은 혼잡 상황을 미리 감지하지 못하는데에 있다.
 
 
 
 
 
 
추가적으로 알아야할 개념으론 'ssthresh ( Slow Start Threshhold )' 가 있다.
느린 시작이 적용될 방지턱 정도의 의미이며 해당 지점까지 Slow Start 가 수행된다.
 
한 번 혼잡이 발생하고 나면 네트워크 수용량을 예상할 수 있기 때문에
보통 이전에 혼잡이 발생한 창 크기의 절반이 ssthresh 로 설정되어진다.
이 후 혼잡이 감지되면 cwnd 를 1로 줄이고 설정된 ssthresh 까지 Slow Start 과정이 진행된다.
 
ssthresh 이 후의 과정을 혼잡 회피 과정이라 불리며 이 과정은 앞서 말한 AIMD 방식을 사용한다.
 
 
 
 
 
 

왜 느린 시작이란 이름을 지었을까 ??

 
처음 등장했을 당시의 상황을 고려해야한다.
당시 TCP 는 처음부터 송신자의 윈도우 크기를 최대 크기로 설정한 후 보내면서
네트워크 혼잡을 유발할 가능성이 굉장히 컸고 연쇄적으로 다른 곳에 영향을 미칠 수 있었다.
이로 인해 패킷이 손실될 확률이 높아지고 여러 곳에 재전송이 발생하며 '혼잡 붕괴' 를 야기할 수 있다.
 
이 문제를 해결하기 위해서
송신자 윈도우 크기 ( cwnd, Congestion Window ) 를 1부터 점차 늘려간다는 의미로
느린 시작 ( Slow Start ) 란 이름이 붙여졌다고 한다.
 
 
 
 
 
 
 
 
 
 

* 송신자의 혼잡 윈도우를 통한 전송 비율 제어

 
지금까지 봤을 때 cwnd 를 늘리는 방식은 합 방식인 AIMD 방식,
지수적으로 늘어나는 Slow Start 방식이 있었다.
반대로 cwnd 를 줄이는 방식은 총 2가지이다.
 
1. 크기를 1로 줄인다
2. 크기를 절반으로 줄인다.
 
크기를 1로 줄인 1번 상황에서 AIMD 방식을 사용하는 것은 비효율적이라고 볼 수 있다.
이 때, Slow Start 를 사용해서 초기에 전송 속도를 올리는데 효과적으로 대응할 수 있다.
 
크기를 절반으로 줄이는 경우,
크기가 절반 이상인 경우까지 Slow Start 를 적용하기에는 다시 혼잡을 유발할 수 있으므로 적합하지 않다.
또, ssthresh 의 크기도 너무 크다.
이 상황에서는 AIMD 방식을 사용해서 점차적으로 회복하는 방식이 효과적일 수 있다.
이 방식을 '빠른 회복 ( Fast Recovery )' 라고 한다.
 
이렇게 송신자의 혼잡 윈도우를 ( cwnd ) 늘리고 줄이는 방식을 통해서
트래픽의 전송 비율을 제한하는 특징을 볼 수 있다.
 
또한 상황에 따라서 효과적으로 처리해야할 방식이 서로 다를 수 있다.
정도의 차이는 있겠지만 결과적으로,
TCP 는 AIMD / Slow Start 를 혼합적으로 사용하는 방식으로 발전해왔다고 볼 수 있다.
 
 
 
 
 
 
 
 
 

* 혼잡 감지

 
TCP 에서 네트워크 혼잡이 발생되었다고 판단되는 기준은 무엇일까 ??
 
송수신자 이외의 외부에서 사용될 수 있는 기능 중 하나는 'ECN ( Explicit Congestion Notification )' 이 있다.
 
간단하게 설명하자면,
혼잡 제어의 효율성을 높이기 위해서 라우터 단에서 관리되는 네트워크 정보를 통해
혼잡을 미리 감지할 수 있는 기능이다.
IP / TCP Header 각각 ECN 필드가 존재하며 Router 도 ECN 을 지원해야 사용할 수 있다.
( 일반적으론 비활성화되어있다. )
 
또 한가지는 '지연 기반 TCP' 이다.
간단하게 RTT ( Round Trip Time ) 을 통해서 네트워크 혼잡을 예측하는 방식이다.
이를 통해 RTO ( Retransmission Timeout ) 을 설정하며 여러 가지 계산 알고리즘들이 존재한다.
( 대표적 예시로 1994, Vegas 버전이 있다. )
 
 
마지막으로 패킷 손실이 발생됨에 따라서 혼잡을 판단하는 경우이다.
패킷이 손실되었다고 여겨지는 경우는 2가지이다.
 
1. 3개의 중복된 ACK
2. ACK Timeout
 
이전부터 우리가 자주 마주한 상황이다.
2번 상황은 ACK 가 하나도 오지 않아서 ACK 의 Timeout 이 발생한 상태라면
1번 상황보다는 심각한 상황이라고 판단할 수 있다.
 
 
1번 상황에서 우리는 '빠른 재전송 ( Fast Retransmit )' 을 상기할 수 있다.
 
앞서 설명한 GBN 동작 방식에 나왔던 빠른 재전송 방법이다.
이 방식은 중복된 ACK 세그먼트를 총 3 개 받았을 때, 빠르게
송신자 측에서 수신자에게 해당 ACK 세그먼트 이후부터 데이터를 전송하게 된다.
 
중복된 ACK 세그먼트를 받음에도 빠른 재전송을 하지 않는다면
송신자 측에서 ACK 를 받아야하는 시간이 초과되는 Timeout 이 되기 전까지는
수신자는 송신자가 보낸 세그먼트를 계속 버리게 되는 낭비가 발생한다.
 
중복된 ACK 세그먼트를 받자마자 재전송을 수행하는 것도 문제가 된다고 했었다.
패킷 순서가 잠깐 뒤바뀌었을 뿐 패킷은 손실되지 않아 이 후 정상적으로 받을 수 있음에도 불구하고
다시 재전송하게 되는 낭비가 발생한다고 설명했다.
 
즉,
되도록 패킷이 손실되었다는 확실한 상황을 근거로 효율적으로 수행하기 위해서
중복된 ACK 세그먼트 3개를 받았을 때 빠른 재전송을 수행한다고 볼 수 있다.
 
재전송 이 후, 송신자의 윈도우 크기는 쓰여지는 혼잡제어 정책에 따라 제어된다.
 
 
 
 
 
 
 

* 결론

 
혼잡을 감지할 수 있는 상황은 RTT 를 통한 예측 방식, 패킷 손실을 통해 판단하는 경우 등 이 존재한다.
이 때,
전송 속도를 조절하거나 송신자의 윈도우 ( cwnd ) 의 크기 조절을 통해 트래픽을 조절할 수 있다.
 
송신자 윈도우 크기 조절 방식에는 AIMD / Slow Start 가 있었다.
AIMD 는 크기를 1씩 늘리고 절반으로 줄이는 방식,
Slow Start 는 지수적으로 늘리고 크기를 1로 줄이는 방식이었다.
 
 
TCP 에는 위에서 설명한 여러 가지 상황들 이외의 상황들을 포함한 환경에서
어떻게 혼잡을 대처할 것인지에 대한 다양한 정책들이 있다.

 

 

 

 

 

 

 


 

참고 자료