네트워크 내에서 전송을 하면서 항상 잔잔한 상태는 아닙니다. 어떤 때에는 데이터의 수가 과도하게 증가하기도 하고 데이터가 유실되기도 합니다. 이러한 상황을 혼잡상황이라고 합니다.
그리고 TCP는 이 혼잡 상황을 방지하거나 해결하는 혼잡제어 기능을 제공합니다.
TCP는 혼잡이 발생하기 전과 혼잡이 발생한 후의 제어방식이 각기 다른데
혼잡이 발생하기 전에는 slow Start와 Additive Increase방식을 사용하면서 혼잡을 회피합니다.
그리고 혼잡이 발생한 후에는 Multiplicative Decrease 방식으로 혼잡 상황을 해결합니다.
TCP가 혼잡 상황을 인식하는 경우
데이터를 송신하고 타임아웃되어 재전송해야 할 경우 혹은 3개 이상의 중복된 ack를 수신했을 경우입니다.
이러한 상황을 인식하고 나면 TCP는 혼잡 상황으로 감지합니다.
TCP가 혼잡 상황을 인식했을 경우의 동작
TCP는 세그먼트들을 Slow Start방식으로 지수적으로 전송하게 됩니다. cwnd의 값은 1입니다.
지수적 증가 방식을 통해 세그먼트를 임계값까지 전송하게 됩니다. 여기서 임계값 ssthresh(slow start threshold)라는 단어를 사용합니다.
임계값에 도달하게 되면 TCP는 혼잡 상황으로 갈 위험이 높다고 여겨져서 Additive Increase기법을 사용하여 혼잡을 회피합니다.
cwnd를 하나씩 증가하면서 혼잡을 회피하게 되는데 결국 혼잡이 발생한 상황을 감지하게 되면 Multiplicative Decrease 방식을 수행합니다.
혼잡이 발생한 상황에 따라 다르게 동작하는데
세그먼트 전송 후 타임아웃 되어서 재전송해야 하는 상황
cwnd의 크기를 1로 재설정하여 기존 임계값(ssthresh)보다 낮은 임계값을 설정하고 이후에는 slow start와 addtive increase기법을 계속해서 수행합니다.
3개 이상의 중복된 ACK를 수신한 경우
기존 임계값(ssthresh)보다 낮은 임계값을 설정하고 cwnd의 크기도 임계값과 같게 설정합니다. 그리고 Additive Increase기법으로 혼잡 회피만 수행합니다.