⚠️ 들어가기 앞서
경북대학교 컴퓨터학부 COMP0414-001 컴퓨터망 과목을 공부하며 정리한 글입니다.
본격적으로 혼잡 제어를 하는 방법 여러 가지를 알아보자.
maximum segment size(window size)를 점진적으로 증가시키다가 congestion이 발생하면 window size를 절반으로 줄인다.
Additive Increasse, Multiplicative Decrease
의 앞글자를 따와 AIMD 방식이라고 한다.
그리고 window size를 cwnd
라고 하기도 한다. (congestion window)
위 그림은 AIMD 방식 하에 시간에 따라 sending rate를 나타낸 것인데, 그래프를 보면 알 수 있듯이 sending rate가 증가할 때는 linear하게 점진적으로 증가하다가, 일정 수준을 만났을 때는 그 절반으로 팍 떨어지는 것을 볼 수 있다.
cwnd를 줄일 때 프로토콜 표준에 따라 구현 방식이 조금씩 다르다.
절반
으로 줄이는 방식이 TCP Reno
라고 한다.1
로 줄이는 방식은 TCP Tahoe
이다.AIMD는 감소할 때는 큰 폭으로 감소하는데 증가할 때는 느리게 증가되므로 성능의 복원이 오래 걸린다. 이러한 단점을 개선한 것이 slow start 방식이다.
slow start 방식은 시작
cwnd
를 1로 설정하고, 매 RTT마다cwnd
를 2배씩, 지수적으로 증가시키는 방식이다.
slow start 방식은 시작 cwnd가 1이라서 처음에는 느릴 수 있지만, 지수적으로 성능이 향상될 수 있다.
segment 1개에 대한 응답이 잘 돌아오면 2개를, 그 다음에는 4개를 보낸다.
slow start에 의해 지수적으로 증가하면, 다시 감소 직전 상태까지 복원하는 것은 빠를지라도, 너무 빠르게 증가되기 때문에 얼마 안 있어 다시 congestion이 발생하여 다시 rate가 떨어진다.
'임계치(threshold)' 라는 개념을 도입하고 AIMD와 slow start 방식을 적절히 섞어서 어느 정도 임계 지점까지는 slow start 방식으로 exponential하게 증가시키고, 임계 지점 이후부터는 AIMD처럼 linear하게 증가시킬 수 있다.
임계치는 slow start threshold
라는 뜻으로 ssthresh
라고 주로 표현한다.
그리고 congestion을 만났을 때 TCP Reno
인지 TCP Tahoe
인지에 따라서 cwnd가 절반, 또는 1로 줄어들 것이고, ssthresh
는 congestion을 만났을 당시 cwnd의 절반으로 재설정된다.
window size가 감소할 시점의 W
의 절반인 W/2
로 ssthresh가 재설정되어 이 지점부터 linear한 증가를 하는 것을 볼 수 있다.
AIMD와 비슷한 매커니즘을 가지고 있으나 증가할 때 점진적으로 증가하는 것이 아니라 위로 볼록한 곡선형으로 증가시킨다.
빨간 선이 기존 AIMD 방식이고, 파란 선이 CUBIC 방식이다.
congestion 발생 직후 빠르게 성능을 올릴 수 있고, congestion이 발생한 부분 인근에서는 linear하게 증가하는 것보다 느리게 증가하여 높은 rate를 오래 유지할 수 있다. 따라서 전반적인 성능이 향상된다.
수신자의 ACK가 아닌 RTT를 기반으로 congestion을 탐지 및 제어하는 방법도 있다.
먼저 혼잡이 발생하기 전의 RTT
를 구해 놓는다. 아무 지장 없이 클린한 상태에서 순수 RTT가 어느 정도인지를 측정해 두는 것이다. 그리고 매번 RTT를 계산하여, 이 값과 비교한다.
만약 최근에 측정한 RTT가 이상적인 RTT 값과 비슷하면, 아직 congestion이 발생하지 않은 원활한 상태라고 판단하고 cwnd를 linear하게 증가시키고, 만약 이상적 RTT값보다 현저히 낮다면 congestion이 발생했다고 간주하고 cwnd를 감소시킨다.
명시적 혼잡 통보는 네트워크 라우터의 도움을 받아서 혼잡이 발생했다는 것을 표현하는 것이다.
IP 헤더에는 ECN bit marking
이라는 2비트짜리 필드가 있는데, 이 필드가 10
또는 01
로 설정되어 있으면ECN 기능을 지원한다
라는 뜻이다. 그리고 전송 도중에 네트워크 라우터가 혼잡을 감지하면 이 필드를 11
로 수정하여 수신자에게 보낸다.
그러면 수신자는 혼잡이 발생하고 있다는 것을 인지하고, TCP 헤더의 E
필드를 1로 만들어서 "지금 혼잡이 발생하고 있으니 데이터 양을 줄여서 보내라"
는 뜻을 송신자에게 되돌려준다.
송신자는 TCP 헤더의 E
필드를 보고 혼잡이 발생하고 있음을 인지하면 데이터의 양을 줄이고 이를 알려주는 용도로 C
필드를 1로 설정하여 보낸다.
k
개의 TCP 세션이 R
의 대역폭을 가지고 있을 때, 각각은 k/R
만큼의 대역폭을 공평하게 나누어 가져야 한다.
만약 어떤 connection이 k/R
보다 많은 자원을 사용하고 있다면 congestion control 과정에서 이를 공평하게 재분배할 수 있다.
만약 한 회선을 connection 1, 2가 양분하여 사용하고 있다고 가정했을 때 검은 점선은 두 connection이 서로 같은 양만큼을 배분받고 있을 때를 나타낸다. 그리고 파란 선은 대역폭 R
을 나타내며 이 곳보다 위에 존재하는 점의 경우 congestion이 발생한다.
이 때 빨간색 점의 위치를 보면, 점선보다 오른쪽에 있다. 즉 connection 2에 비해 connection 1이 더 많은 throughput을 차지하고 있다는 뜻이다.
이 상태가 유지되며 두 connection이 각자의 cwnd를 증가시키다가 파란 선을 넘어 congestion이 발생하게 되면, 두 connection 모두의 cwnd를 절반으로 줄인다.
이 과정을 반복하다 보면 검은 점선, 즉 서로 동등하게 대역폭을 나누어 가지는 상태에 수렴하게 된다.
TCP는 혼잡 제어를 지원하기 때문에 위와 같이 cwnd를 늘리고 줄이고 하는 과정을 자기네들끼리 거친다. 그런데 UDP는 그러한 기능이 없다. 즉 UDP는 TCP들끼리 혼잡 제어를 하든 말든 슉슉 지나갈 수 있다. 이러면 공평성이 깨지게 된다.
TCP connection끼리 대역폭을 나눌 때, connection의 개수로 /k
하여 일정하게 나눈다. 그러면 한 프로세스가 편법으로 여러 개의 TCP connection을 열면, 그만큼 더 많은 대역폭을 할당받을 수 있다. 만약 10개의 프로세스가 1개씩을 열었는데, 새로 들어온 프로세스가 1개를 열면 1/11
을 할당 받겠지만, 10개를 열어버리면 10/20
으로 1/2
나 차지할 수 있다.