네트워크의 혼잡 원인을 해결하기 위해서는 네트워크의 혼잡을 일으키는 송신자를 억제하는 매커니즘이 필요하다.
네트워크의 혼잡이 데이터 송신과 수신속도 그리고 효율에 어떻게 영향을 미칠 수 있는지 알기 위해 세 가지 시나리오를 살펴본다.
비현실적이지만, 라우터가 무한 버퍼를 갖는다고 가정해본다. 그리고 2개의 호스트는 1개의 라우터를 사용하기 위해서 라우터의 Capacity(R)를 나누어서 사용하게 된다. 그러면 연결당 처리량이 R/2 사이일 경우 수신자 측의 처리량은 송신자의 전송률과 같다. 하지만 전송량이 R/2가 넘어갈 경우 처리량은 R/2를 넘을 수 없다. 이 시나리오에서 혼잡 네트워크의 비용은 패킷의 도착률이 링크 용량에 근접함에 따라서 큐잉 지연이 커지게 되는 점이다.
이 경우 문제는 송신자는 버퍼 오버 플로우 때문에 버려진 패킷을 보상하기 위해 재전송을 해야 한다. 즉 처리량은 똑같은데 전송량이 많아지게 되는 것이다. 심지어 버려지지 않았는데 송신자 측에서 일찍 타임아웃이 되어버려 재전송을 하게 되면 큐에서 지연된 패킷 + 재전송된 패킷 두 개가 모두 전달되는 비효율적인 경우도 발생한다.
이 시나리오에서 혼잡 네트워크의 비용은 라우터가 패킷의 불필요한 재전송을 함으로 인해 링크 대역폭을 더 사용하게 되는 것이다.
호스트가 다른 호스트로 데이터를 보내기 위해 2개의 라우터를 거쳐야 하는 경우, 트래픽이 과부하될 수록 B Host->D Host 전송 데이터를 처리하느라 A Host ->C Host 전송 데이터는 라우터에 들어가지 못하고 패킷이 전부 버려지게 된다. 이 경우, 버려지는 지점까지 패킷을 전송하는데 사용된 상위 라우터에서 사용된 전송 용량은 모두 헛된 것이 된다.
TCP의 특징 3가지는 바로 1. Reliability 2. Flow Control 3. Congestion Control이다. TCP는 다른 호스트에서 동작하는 두 프로세스 사이의 신뢰적인 전송 서비스를 제공한다.
TCP 연결의 양 끝 호스트들은 송신버퍼, 수신버퍼로 구성되고 송신 측에서는 혼잡윈도우 (Congestion Window)를 기록한다. 그리고 이 cwnd를 통해 네트워크로 트래픽을 전달할 수 있는 비율을 제한한다. 송신 데이터의 양은 cwnd와 rwnd의 최솟값을 넘어서는 안 된다.
크게 두가지가 있다. 1. 타임아웃 발생 2. 수신자로부터 3개의 중복된 ACK들의 수신이 발생했을 때 감지할 수 있다. 하지만 타임아웃 발생이 네트워크 Congestion의 정도가 더 높다고 예상해볼 수 있다. 왜냐하면 2번의 경우에는 그 뒷 부분의 segment들은 다 도착한 경우겠지만 1번의 경우에는 아예 그 segment 부터 다 막혀있다고 볼 수 있기 때문이다.
이 알고리즘은 세 가지 중요한 구성요소를 가지는데, 1. 슬로우 스타트 2. 혼잡 회피 3. 빠른 회복이 있다.
슬로우 스타트
TCP 연결이 시작될 때, 가장 처음 TCP 전송률은 1MSS에서 시작해서 지수적으로 증가하게 된다. 그리고 지수적 증가가 끝나는 시점은 혼잡이 발생되는 경우이다. 그 때 TCP 송신자는 cwnd의 값을 1로 하고 ssthresh(슬로우 스타트 임계점)의 값을 cwnd/2로 정한다. 그리고 다시 값을 지수적으로 증가시키고 임계점에 도달하면 혼잡 회피 모드로 들어간다.
혼잡 회피
여기서 매 RTT마다 cwnd의 값을 두배로 하기 보다 TCP는 조금 더 보수적인 방법을 채택해서 매 RTT마다 하나의 MSS만큼 cwnd를 증가시킨다. 그리고 타임아웃이 발생하면 시작점은 다시 1MSS로 떨어뜨리고 임계점은 기존 cwnd의 1/2로 줄인다. 그리고 나서 빠른 회복 상태로 들어가게 된다.