Post

TCP 혼잡제어

TCP 혼잡제어

혼잡제어(Congestion Control)

혼잡제어(Congestion Control)는 네트워크 내의 패킷 수를 조절하여
네트워크의 오버플로우를 방지하는 방법입니다.

TCP에서 혼잡제어를 사용하는 이유는
송신 측에서 데이터를 라우터가 처리할 수 있는 양을 초과하여 전송하게 되면
라우터에서 초과된 데이터를 처리하지 못하는 문제가 발생합니다.
그렇기에 혼잡제어를 사용하여 송신 측의 전송 속도를 적절히 이러한 상황을 예방합니다.

혼잡제어의 상태로는 슬로우 스타트(Slow Start),
혼잡 회피(Congestion Avoidance), 빠른 회복(Fast Recovery)이 있습니다.

혼잡 윈도우

송신 측이 자신의 송신 윈도우 크기를 정할 때 사용됩니다.
송신자는 송신 윈도우 크기를 정할 때 수신측이 보내준 윈도우 크기인 수신자 윈도우(RWND) 와
자신이 네트워크 상황을 고려해 정한 혼잡 윈도우(CWND) 중에서 더 작은 값을 택합니다.

슬로우 스타트(Slow Start)

슬로우 스타트는 연결 시작 또는 타임아웃 발생 시에 혼잡 윈도우를 1부터
전송률을 낮게하여 천천히 시작하는 상태입니다.

슬로우 스타트 상태에서는 ACK를 수신할 때마다 혼잡 윈도우를 1씩 증가시킵니다.
(RTT마다 혼잡 윈도우를 2배씩 증가)

슬로우 스타트 상태에서 혼잡 윈도우가 임계치(ssthresh)에 도달하면 혼잡 회피 상태로 전환됩니다.

또한, 타임아웃이 발생한다면 ssthresh를 혼잡 윈도우 / 2로 정하고
혼잡 윈도우의 값을 1로 한 뒤 새로운 슬로우 스타트 상태가 됩니다.

또한, 3개의 중복 ACK를 받으면 ssthresh를 혼잡 윈도우 / 2으로 정하고
혼잡 윈도우의 값을 ssthresh + 3MSS로 하고 빠른 회복 상태가 됩니다.

ssthresh (Slow Start Threshold)는 슬로우 스타터에서의 혼잡 윈도우 임계치입니다.

Desktop View

혼잡 회피(Congestion Avoidance)

혼잡 회피 상태에서는 RTT마다 혼잡 윈도우를 1씩 증가하여 선형적으로 증가하도록합니다.

혼잡 회피 상태에서 타임아웃이 발생한다면 ssthresh를 혼잡 윈도우 / 2로 정하고
혼잡 윈도우의 값을 1로 한 뒤 슬로우 스타트 상태가 됩니다.

또한, 3개의 중복 ACK를 받으면 ssthresh를 혼잡 윈도우 / 2으로 정하고
혼잡 윈도우의 값을 ssthresh + 3MSS로 하고 빠른 회복 상태가 됩니다.

Desktop View

빠른 회복(Fast Recovery)

빠른 회복은 필수적인 TCP 요소가 아닙니다.
빠른 회복은 TCP Reno라고 불리는 새로운 버전에서부터 채택된 방법입니다.
빠른 회복이 없는 초기 버전인 TCP Tahoe에서는 빠른 회복 없이 슬로우 스타트 상태가 됩니다.

빠른 회복 상태에서는 중복 ACK가 올 때마다 혼잡 윈도우를 1씩 증가시킵니다.

빠른 회복 상태에서 정상 ACK를 수신한다면 혼잡 윈도우 값을 ssthresh으로
정하고 혼잡 회피 상태가 됩니다.

또한, 타임아웃이 발생한다면 ssthresh를 혼잡 윈도우 / 2로 정하고
혼잡 윈도우의 값을 1로 한 뒤 슬로우 스타트 상태가 됩니다.

중복 ACK가 올 때마다 혼잡 윈도우를 증가시키는 이유는
손실된 세그먼트를 전송해주기 위해서는 윈도우의 크기가 여유로워야 하기 때문에
혼잡 윈도우의 크기를 증가시키는 것입니다.

혼잡 제어 과정

Desktop View

혼잡 제어는 위 사진과 같이
슬로우 스타트, 혼잡 회피, 빠른 회복의 상태로 계속해서 변합니다.

This post is licensed under CC BY 4.0 by the author.