-
TCP의 혼잡제어Computer Science/Network 2020. 10. 6. 02:47
혼잡제어 : 송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법
혼잡제어
- AIMD(Additive Increase / Multicative Decrease),
- Slow Start,
- Fast Retransmit(빠른 재전송),
- Fast Recovery(빠른 회복)
혼잡 방지 알고리즘
- TCP 타호와 TCP 리노
- TCP 베이거스
배경
- 각 호스트는 보낼 수 있는 최대의 패킷을 보내고
일부 라우터는 정해진 시간내에 받은 패킷을 처리하지 못했다
정해진 시간내에 패킷이 처리되지 못하면
호스트는 패킷을 재전송하였고, 라우터는 더 많은 패킷을 받게되어 혼잡현상이 더 심해졌다.
TCP 혼잡제어는 보내는 측에서 네트워크 수용량을 결정하는 방식으로 동작한다.
네트워크 수용량은 시시때때로 바뀌기 때문에
보내는 측에서 네트워크 상황에 따라 전송속도를 조절해야 한다.
혼잡제어
- AIMD(Additive Increase / Multicative Decrease)
합증가/곱감소 방식이다.
처음에 패킷을 하나씩 보내고 이것이 문제없이 도착하면 창 크기(단위 시간 내에 보내는 패킷의 수)를 1씩 증가시켜가면서 전송하는 방법이다. 만일 패킷 전송을 실패하거나 일정한 시간을 넘으면 패킷을 보내는 속도를 절반으로 줄이게 된다.
특징
공평한 방식이다.
여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽에 불리하지만
시간이 흐르면 평형상태로 수렴하게 된다.
문제점
초기에 높은 대역폭을 사용하지 못하고,
그렇게 되기까지 시간이 오래 걸린다.
네트워크가 혼잡해지는 상황을 미리 감지하지는 못한다.
즉, 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식
- Slow Start,
합증가/곱감소는 시간이 너무 오래 걸린다.
합증가/곱감소와 같이 패킷 하나씩 보내는 것으로 시작.
패킷이 문제없이 도착하면 각각의 ACK 패킷마다 창 크기를 1씩 늘린다.
즉, 창 크기를 한 주기마다 2배씩 증가 시킨다.
혼잡 현상이 발생하면 창 크기를 1로 떨어뜨린다. 처음에는 네트워크의 수용량을 예상할 수 있는 정보가 없지만 한번 혼잡 현상이 발생하고 나면 네트워크의 수용량을 어느 정도 예상할 수 있으므로 혼잡 현상이 발생하였던 창 크기의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가시킨다.
초기에 지수 함수꼴로 창 크기를 빠르게 증가시키는 방식의 이름이 느린 시작인 것이 어울리지 않는 것이라고 생각할 수도 있다. 하지만 느린 시작의 의미는 선형 증가 방식과 비교해서는 안 되고 느린 시작이 발명되었을 당시 TCP의 동작 방식과 비교해야 한다. 이전의 TCP 동작은 처음에 최대한 보낼 수 있는 만큼의 패킷을 보내는 것으로 시작하고, 느린 시작은 이것과 달리 창 크기를 1에서부터 시작하여 지수함수 꼴로 증가시켜가면서 네트워크의 수용량을 감지한다.
이 방식은 합 증가/곱 감소 방식보다 더 효율적인 방법이지만 마찬가지로 혼잡한 상황이 된 경우에는 타임아웃이 될 때까지 기다리는 동안 큰 시간의 공백이 있다.
- Fast Retransmit(빠른 재전송),

재전송 타이머 값이 종종 상대적으로 길어지므로, 손실된 패킷의 재전송 전에 지연시간이 커진다.
위의 상항을 해결하고자 중복 ACKs를 통해 손실된 세그먼트를 검출한다.
"타임아웃 전에 송신측에서 중복 ACK를 3번받게 되면 세그먼트를 즉시 전송한다"
패킷을 받는 쪽에서 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보낸다. 단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보낸다. 따라서 중간에 패킷하나가 손실되게 되면 보내는 측에서는 순번이 중복된 ACK 패킷을 받게 되고, 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송해 줄 수 있다. 빠른 재전송은 중복된 순번의 패킷을 3개 받으면 재전송을 한다. 그리고 이런 현상이 일어나는 것은 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 창 크기를 줄이게 된다.
- Fast Recovery(빠른 회복)
빠른 회복 정책(Fast Recovery)은 혼잡한 상태가 되면 창 크기를 1로 줄이지 않고 반으로 줄이고 선형 증가시키는 방법이다. 빠른 회복 정책까지 적용하면 혼잡 상황을 한번 겪고 나서부터는 순수한 합 증가/곱 감소 방식으로 동작한다.
TCP 혼잡 방지 알고리즘
사전참고
혼잡 윈도우(Congestion Window, CWND)
송신 측은 자신의 최종 윈도우 크기를 정할 때 수신 측이 보내준 윈도우 크기인 수신자 윈도우(RWND), 그리고 자신이 네트워크의 상황을 고려해서 정한 윈도우 크기인 혼잡 윈도우(CWND) 중에서 더 작은 값을 사용한다.
MSS는 한 세그먼트에 최대로 보낼 수 있는 데이터의 양을 나타내는 값인데, 대략 다음과 같은 계산을 통해 구할 수 있다.
MSS = MTU - (IP헤더길이 + IP옵션길이) - (TCP헤더길이 + TCP옵션길이)
여기서 등장하는 MTU(Maximum Transmission Unit)라는 친구는 한번 통신 때 보낼 수 있는 최대 단위
OSX 같은 경우는 MTU 기본 값으로 이더넷 표준인 1500 bytes가 설정되어있다. 이때 TCP와 IP의 헤더크기가 각각 20 bytes라고 하면 MSS는 1500 - 40 = 1460 bytes가 되는 것이다.
송신 측은 처음 통신을 시작할 때 이렇게 계산한 MSS를 사용하여 혼잡 윈도우의 크기를 1 MSS로 설정한다. 이후 통신을 하면서 네트워크의 혼잡 상황을 고려하며 혼잡 윈도우 크기를 증가시키거나 감소시키는 것이다.
- TCP 타호와 TCP 리노
네트워크 혼잡으로 인한 붕괴 상황(congestive collapse)를 방지하기 위해서, TCP는 다양한 혼잡 제어 방법을 활용한다. TCP는 각 연결마다 혼잡 창을 관리하는데, 혼잡 창은 ACK 패킷이 수신되지 않은 패킷의 최대 개수를 제한하게 된다. 이러한 방법은 TCP가 흐름 제어를 위해 슬라이딩 윈도를 사용하는 것과 유사하다. TCP는 연결이 시작되었을 때와 시간 초과가 발생했을 때, 느린 시작[1] 이라는 상태에 진입하며, 작은 값에서 시작하여 점차 혼잡 창의 크기를 늘린다. 처음 혼잡 창의 크기는 최대 세그먼트 크기(MSS)의 두 배이다. 비록 작은 값으로 시작하지만, 혼잡 창 크기의 증가 속도는 굉장히 빠르다. 각 패킷에 대해 ACK 패킷을 받을 때마다, 혼잡 창의 크기는 MSS의 크기만큼 늘어난다. 따라서, 실질적으로 매 왕복 지연 시간(RTT)마다 혼잡 창의 크기는 두 배가 된다.
혼잡 창의 크기가 느린 시작 한계(ssthresh)라고 불리는 한계점을 초과하면, TCP는 혼잡 방지라고 불리는 새로운 상태에 진입한다. 리눅스를 비롯한 몇몇 구현에서는 초기 ssthresh 값이 크기 때문에, 첫 느린 시작은 대개 패킷 손실이 일어난 후에야 끝난다. 그러나 느린 시작이 끝나면 ssthresh 값이 더 작은 값으로 조정되고, 이후의 느린 시작에 영향을 미치게 된다.
혼잡 방지 상태에서 TCP는 ACK 패킷이 중복으로 수신되지 않는 한 매 왕복 지연 시간마다 혼잡 창의 크기를 MSS만큼 늘린다. 패킷 손실이 발생하면 패킷이 중복 수신될 확률이 매우 높다. (이론적으로는 극단적인 패킷 재정렬로 인해 ACK 중복 수신이 발생할 수도 있다.) 타호와 리노는 패킷 손실의 감지와 대응에 있어서 다른 전략을 취한다.
- 타호(Tahoe): ACK 중복 수신이 3회 발생하면 시간 초과가 발생한 것과 똑같이 처리한다. 타호는 시간 초과가 발생하면 "빠른 재전송"을 수행하는데, 우선 느린 시작 한계를 현재 혼잡 창 크기의 반으로 설정하고, 혼잡 창의 크기는 MSS의 크기와 같게 설정한 후, 다시 느린 시작 상태로 진입한다.
- 리노(Reno): ACK 중복 수신이 3회 발생하면 리노는 혼잡 창의 크기를 반으로 줄이고 느린 시작 한계 또한 줄어든 혼잡 창의 크기와 같게 설정한 후, 빠른 회복을 수행하고, 빠른 회복에 진입한다. ACK 시간 초과 시에는 타호에서와 똑같은 방법으로 느린 시작을 한다.
빠른 재전송 상태는 타호에만 있는 상태로, 이 상태에서 TCP는 중복 수신된 ACK가 가리키는 패킷을 재전송하고, 전송 창에 있는 모든 패킷에 대한 ACK가 수신될 때까지 기다린다. 모든 ACK가 수신되면 비로소 TCP는 다시 혼잡 방지 상태로 돌아간다. 만약 ACK가 수신되지 않으면 시간 초과가 발생하고, TCP는 느린 시작을 하게 될 것이다.
두 알고리즘 모두 시간 초과 시에는 혼잡 창의 크기를 MSS로 줄인다.
두 알고리즘 모두 간혹 혼잡 창의 크기가 0으로 설정되는 경우 동결 상태에 빠져 버릴 수 있다.
여기서 혼잡창이라는게 아마 송신측의 윈도우 사이즈일 것이고
중복 수신 3회 발생시 혼잡창의 크기를 MSS크기와 같게한다는 것은
패킷을 1개부터 다시 보내겠다는 이야기인 것 같다.
->맞다
- TCP 베이거스
1990년대 중반까지 모든 TCP는 오직 전송 버퍼에 있는 마지막으로 전송된 패킷을 통해서 시간 초과를 감지하거나 왕복 지연 시간을 측정했다. 애리조나 대학교 소속의 래리 피터슨과 로렌스 브라크모는 네바다 주 최대의 도시 라스베이거스의 이름을 딴 TCP 베이거스(TCP Vegas)를 소개했다. 이 알고리즘에서 시간 초과의 감지와 왕복 지연 시간의 측정은 전송 버퍼에 있는 모든 패킷에 대해서 이루어졌다. 또한 TCP 베이거스는 혼잡 창에 대해서 합 증가 방식을 사용한다. 이 알고리즘은 피터슨의 연구실 바깥에서는 널리 구현되지 못했다. 다양한 TCP 혼잡 제어 알고리즘에 대한 비교 연구에서 TCP 베이거스는 TCP 큐빅과 함께 가장 부드러운 동작을 보여 주었다.
TCP 베이거스는 DD-WRT 펌웨어 v24 SP2의 기본 혼잡 제어 알고리즘으로 사용되었다.[2]
참고
evan-moon.github.io/2019/11/26/tcp-congestion-control/
사이 좋게 네트워크를 나눠 쓰는 방법, TCP의 혼잡 제어
혼잡 제어란, 말 그대로 네트워크의 혼잡 상태를 파악하고 그 상태를 해결하기 위해 데이터 전송을 제어하는 것을 이야기한다. 네트워크는 워낙 광대한 블랙박스이기 때문에 정확히 어디서 어��
evan-moon.github.io
ko.wikipedia.org/wiki/%ED%98%BC%EC%9E%A1_%EC%A0%9C%EC%96%B4
혼잡 제어 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 혼잡 제어(congestion control)는 전자 통신 네트워크로 들어가는 정보 소통량을 조절하여 네트워크가 혼잡해지지 않게 조절하는 것을 말한다. 예를 들어, 정보 소통
ko.wikipedia.org
ko.wikipedia.org/wiki/TCP_%ED%98%BC%EC%9E%A1_%EB%B0%A9%EC%A7%80_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
TCP 혼잡 방지 알고리즘 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 전송 제어 프로토콜(TCP)은 네트워크 혼잡 방지 알고리즘을 사용하여 네트워크에서 부하로 인해 패킷 손실이 발생하는 것을 줄인다. 이 문서에서는 TCP에서 사용
ko.wikipedia.org
'Computer Science > Network' 카테고리의 다른 글
TCP Keepalive 와 HTTP Keepalive (0) 2024.02.10 TCP 소켓 옵션 (0) 2023.01.28 TCP의 흐름제어, 오류제어 (0) 2020.10.03 로드밸런서(Load Balancer)란?? (0) 2020.09.30