{{위키데이터 속성 추적}}
'''혼잡 제어'''(congestion control)는 전자 통신 [[네트워크]]로 들어가는 정보 소통량을 조절하여 네트워크가 혼잡해지지 않게 조절하는 것을 말한다. 예를 들어, 정보 소통량이 과다한 것을 감지하여 [[패킷]]을 적게 보내면 [[혼잡 붕괴]] 현상이 일어나는 것을 막을 수 있다.

== TCP의 혼잡 제어 ==
[[전송 제어 프로토콜|TCP]]의 혼잡 제어는 [[1980년대]] [[반 제이콥슨]]이 도입하였다. 그 당시의 [[인터넷]] 환경은 혼잡 붕괴 현상이 큰 문제거리였다. 각 호스트는 정보를 빨리 보내기 위하여 정해진 시간 내에 보낼 수 있는 최대의 패킷을 보냈고, 일부 [[라우터]]에서는 혼잡 현상이 발생하여 정해진 시간 내에 받은 패킷들을 모두 처리하지 못하였다. 정해진 시간 내에 패킷이 처리되지 않으면 호스트는 패킷을 재전송하였고, 라우터는 더 많은 패킷을 받게 되어서 혼잡 현상이 더 심해졌다..

TCP의 혼잡 제어는 패킷을 보내는 쪽에서 네트워크의 수용량을 결정하는 방식으로 동작한다. 패킷을 보내는 측에서 안전하게 보낼 수 있는 패킷의 수를 알고 있고, 패킷이 잘 도착하면 [[ACK 패킷]]을 받는다. 즉 이전에 보낸 패킷이 잘 도착되었다는 것을 ACK 패킷을 받은 것으로 알 수 있고, ACK 패킷을 받으면 안전하게 새 패킷을 더 보낼 수 있기 때문에 TCP의 혼잡 제어를 셀프클록 방식(self-clocking)이라고 한다. 물론 처음부터 네트워크의 수용량을 아는 것은 어렵다. 설상가상으로 네트워크의 수용량이라는 것은 시시때때로 바뀐다. 이것은 보내는 측에서 네트워크의 상태에 따라서 전송 속도를 조절해야 한다는 뜻이다.

=== 합 증가/곱 감소 ===
이 방식은 AIMD(Additive Increase/Multiplicative Decrease)라고 불리는 방식이다. 처음에 패킷을 하나씩 보내고 이것이 문제없이 도착하면 창 크기(단위 시간 내에 보내는 패킷의 수)를 1씩 증가시켜가면서 전송하는 방법이다. 만일 패킷 전송을 실패하거나 일정한 시간을 넘으면 패킷을 보내는 속도를 절반으로 줄이게 된다.

이 방식은 공평한 방식이다. 이 방식을 사용하는 여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음에는 불리하지만 시간이 흐르면 평형 상태로 [[수렴]]하게 되는 특징이 있다.

문제점은 초기에 네트워크의 높은 [[대역폭]]을 사용하지 못하여 오랜 시간이 걸리게 되고, 네트워크가 혼잡해지는 상황을 미리 감지하지는 못한다. 즉, 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식이다.

=== 느린 시작 ===
합 증가/곱 감소 방식이 네트워크의 수용량 주변에서는 효율적으로 작동하지만 처음에 전송 속도를 올리는 데 걸리는 시간이 너무 길다는 단점이 있다. 느린 시작(Slow Start) 방식은 합 증가/곱 감소 방식과 마찬가지로 패킷을 하나씩 보내는 것부터 시작한다. 그러나 이 방식은 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 창 크기를 1씩 늘린다. 즉, 한 주기가 지나면 창 크기가 2배로 된다. 따라서 전송 속도는 합 증가/곱 감소와는 다르게 [[지수 함수]] 꼴로 증가한다. 대신에 혼잡 현상이 발생하면 창 크기를 1로 떨어뜨린다. 처음에는 네트워크의 수용량을 예상할 수 있는 정보가 없지만 한번 혼잡 현상이 발생하고 나면 네트워크의 수용량을 어느 정도 예상할 수 있으므로 혼잡 현상이 발생하였던 창 크기의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가시킨다.

초기에 지수 함수꼴로 창 크기를 빠르게 증가시키는 방식의 이름이 느린 시작인 것이 어울리지 않는 것이라고 생각할 수도 있다. 하지만 느린 시작의 의미는 선형 증가 방식과 비교해서는 안 되고 느린 시작이 발명되었을 당시 TCP의 동작 방식과 비교해야 한다. 이전의 TCP 동작은 처음에 최대한 보낼 수 있는 만큼의 패킷을 보내는 것으로 시작하고, 느린 시작은 이것과 달리 창 크기를 1에서부터 시작하여 지수함수 꼴로 증가시켜가면서 네트워크의 수용량을 감지한다.

이 방식은 합 증가/곱 감소 방식보다 더 효율적인 방법이지만 마찬가지로 혼잡한 상황이 된 경우에는 타임아웃이 될 때까지 기다리는 동안 큰 시간의 공백이 있다.

=== 빠른 재전송 ===
빠른 재전송(Fast Retransmit)은 TCP의 혼잡 조절에 추가된 정책이다. 패킷을 받는 쪽에서 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보낸다. 단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보낸다. 따라서 중간에 패킷하나가 손실되게 되면 보내는 측에서는 순번이 중복된 ACK 패킷을 받게 되고, 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송해 줄 수 있다. 빠른 재전송은 중복된 순번의 패킷을 3개 받으면 재전송을 한다. 그리고 이런 현상이 일어나는 것은 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 창 크기를 줄이게 된다.

=== 빠른 회복 ===
빠른 회복 정책(Fast Recovery)이란, 혼잡의 특성을 보다 잘게 분류하기 위해 나온 기법이다. 빠른 재전송만 적용하는 경우, 혼잡이 발생할 때마다 윈도우는 1로 설정되기 때문에 혼잡의 강약 척도에 상관없이 성능 병목이 발생하게 된다. 하지만 일반적으로 중복된 3개의 패킷을 받는 경우는 네트워크 혼잡이 그렇게 크지 않은 경우로 판단되는데, 이 경우 빠른 회복 정책(Fast Recovery)를 통해 윈도우 사이즈를 일부분만 줄이게 된다.<ref>{{저널 인용|제목=TCP Slow Start, Congestion Avoidance, Fast Retransmit, and Fast Recovery Algorithms|성=Stevens|이름=W. Richard|url=https://datatracker.ietf.org/doc/rfc2001/|날짜=1997-01}}</ref> 

보통 빠른 재전송과 빠른 회복은 같이 구현되는 편이며, 대표적인 TCP 구현체인 [[TCP Reno]] 방식 역시 느린 시작, 빠른 재전송, 빠른 회복 셋을 모두 구현한다. [[마이크로소프트 윈도우]] 운영체제도 이 방식으로 동작한다.

== 참고자료 ==
* Patterson, Larry L. and Bruce S, Davie, Computer Networks 3rd edition, Morgan Kaufmann, 2003, pp. 468-478.

{{전거 통제}}

[[분류:컴퓨터 네트워크]]
[[분류:패킷]]
[[분류:네트워크 성능]]