///////
Search
🦀

TCP Congestion Control은 무엇을 해결하기 위한 기능의 집합인가요?

혼잡 제어

데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못해 연착되거나 손실이 난다. 혼잡 제어는 이런 상황을 네트워크 내의 패킷 수를 조절하여 방지하는 방법이다

cwnd (congestion window)

송신자가 ACK를 받기 전에 보낼 수 있는 패킷양
예를들어 cwnd가 3으로 설정되어있으면, 송신자는 한번에 3개의 패킷을 보내고 ack을 기다린다
cwnd값이 증가하면 더 빠르게 데이터를 전송할 수 있지만, 네트워크 상에서 congestion(혼잡) 이 발생할 수 있으므로 적당히 조절하는게 중요하다

혼잡 제어 알고리즘

1.
AIMD (Additive/Multicative Decrease)
2.
Slow start (느린 시작)
3.
Fast Retransmit (빠른 재전송)
4.
Fast Recovery (빠른 회복)

1. AIMD (Additive Increase / Multicative Decrease)

가장 기본적인 방식
점진적으로 cwnd값 1씩을 증가시키다가 (additive increase), 만약 패킷의 손실이 감지되면 cwnd값을 반으로 줄인다 (multiplicative decrease)
단점: 네트워크 대역이 많이 남아도는 상황에도 윈도우 크기를 너무 조금씩 늘리기 때문에 모든 대역을 활용하여 제대로 된 속도로 통신하기까지 시간이 조금 걸린다

2. Slow start (느린 시작)

네트워크의 발전으로 인해 네트워크의 혼잡 상황이 발생하는 빈도가 많이 줄어들었다. 이에 따라 혼잡이 발생하지도 않았는데 제대로 속도를 내는 데까지 오래 걸리는 AIMD 방식의 단점이 점점 부각되었다. 이를 해결하기 위해 Slow Start의 개념이 등장한다.
Slow Start는 cnwd의 크기를 2배씩 증가시키다가 혼잡이 감지되면 1로 줄인다
ACK가 도착할 때마다 윈도우 크기를 증가시키기 때문에 처음에는 윈도우 크기가 조금 느리게 증가할지 몰라도, 시간이 가면 갈수록 ACK의 수도 늘어나기 때문에 윈도우 크기가 점점 빠르게 증가한다
Slow Start 임계점
Slow Start Threshold (ssthresh)
윈도우 크기가 기하급수적으로 늘어나면 제어가 힘들어지고 네트워크의 혼잡 또한 빈번하게 발생하게 된다. 그럴 때마다 계속 윈도우 사이즈를 1로 줄이는 것이 효율적이지 않고오히려 조금씩 증가시키는 편이 훨씬 안전할 것이다. 이때 나오는 개념이 Slow start 임계점이다.
특정한 임계점(Threshold)을 정해놓고, 임계점을 넘어가게 되면 AIMD 방식을 사용하여 cwnd값을 1 증가시킨다

3. Fast Retransmit (빠른 재전송)

패킷을 받을 때, 세그먼트로 분할된 내용들이 순서대로 도착하지 않을 수 있다. 이 때, 수신 측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보낸다 (중복 ACK)
그리고 이런 증복 ACK를 받으면 이를 손실인지 지연인지를 구분키 위해 3개가 올 때까지 기린다. 3개를 받드면 재전송을 하고 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 cwnd를 줄이게 된다

4. Fast Recovery (빠른 회복)

혼잡한 상태가 되면 window size를 1로 줄이지 않고 반으로 줄이고 선형증가시키는 방법
혼잡 상황을 한번 겪고 나서부터는 순수한 AIMD 방식으로 동작