공부하는 스누피
[네트워크] 혼잡 제어 본문
네트워크가 혼잡해짐에 따라 라우터 버퍼에 오버플로우가 발생해 패킷 지연, 손실 등 문제가 발생한다. 패킷 재전송으로 손실 문제는 해결할 수 있지만, 근본적인 문제(혼잡 원인)는 해결하지 못한다. 그래서 네트워크 혼잡을 일으키는 송신자를 제어하는 방법이 필요하다.
네트워크 혼잡에 대한 예시는 다음과 같다.
1) 라우터가 무제한의 버퍼 공간을 가질 때에도 패킷 도착률이 링크 용량에 가까워짐에 따라 큐잉 지연이 커진다.
=> 라우터 버퍼에 큐잉된 패킷 수의 제한이 없어 평균 지연도 무제한이 되기 때문.
2) 라우터가 유한한 버퍼 공간을 가질 때, 버퍼 오버플로 때문에 패킷이 손실될 경우 재전송을 수행해야 한다.
=> 수신측은 패킷을 받았으나 송신측에서 일찍 타임아웃 되어버리면 불필요한 재전송을 수행한다.
3) 과도한 트래픽으로 패킷이 경로 상에서 버려질 때, 버려지는 지점까지 패킷을 전송하는데 사용된 전송 용량은 헛된 것이 된다.
=> 전송될때 여러 상위 라우터들을 거친 패킷에게 우선순위를 주어야 한다.
혼잡제어 접근법
종단간의 혼잡제어(네트워크 지원 x)
네트워크 계층에서 혼잡이 일어나는지는 종단 시스템이 추측해야 한다. 예를 들어 TCP 세그먼트 손실로 혼잡이 발생한 것을 알 수 있고, TCP는 그에 따라 윈도우 크기를 줄여 제어한다.
네트워크 지원 혼잡제어
네트워크 안에서 혼잡 상태와 관련하여 송신자에게 직접적인 피드백을 주는 것이다. 피드백은 비트 형식으로 줄 수도 있고, 라우터가 자신이 출력 링크에 제공할 수 있는 전송률로 알려 줄 수 있다. 이런 형태의 알림이 왕복하는데 시간이 걸린다는 단점이 있다.
TCP 혼잡제어 매커니즘
TCP에서는 네트워크 혼잡에 따라 각 송신자가 전송률을 제어하는 방법을 사용한다. 혼잡이 없으면 송신율을 높이고, 혼잡이 있으면 송신율을 줄이는데, 혼잡을 감지하기 위해 TCP 혼잡제어 알고리즘을 사용한다.
송신자는 혼잡 윈도우(congestion window)라는 변수를 사용한다. 이 변수는 송신자가 전송할 수 있는 비율을 제한하도록 한다. TCP에서 송신자가 혼잡을 감지하는 방법을 간단히 정리해보았다.
1) 라우터 버퍼가 오버플로우되면 데이터그램이 버려진다.
2) 버려진 데이터그램은 송신측에 손실 이벤트(타임아웃 or 중복된 ACK 3개 수신)를 발생시킨다.
3) 손실 이벤트가 발생하지 않을 경우, TCP는 혼잡 윈도우 크기를 증가시키기 위해 확인응답을 사용한다.
=> 확인응답이 늦게 오면 윈도우를 조금씩 증가시킨다. 반대의 경우 많이 증가시킨다.
=> 이 작업을 자체 클로킹(self-clocking)이라고 한다.
4) 손실 이벤트가 발생하면 TCP 전송률을 줄인다.
TCP 혼잡제어 알고리즘은 슬로 스타트, 혼잡 회피, 빠른 회복이라는 세 가지 구성요소를 가지고 있다.
슬로 스타트 slow start
혼잡 윈도우 크기를 적은 값(1MSS)부터 시작하여 확인 응답을 받을 때마다 지수적으로 증가시키는 것이다. 처음에는 1만큼 증가되지만, 확인 응답을 잘 받을 수록 2, 4, 8, 16,,, 만큼 보내는 세그먼트 수를 증가시킨다.
손실 이벤트가 발생한 경우에는 혼잡 윈도우 크기를 1로 정하고 새로운 슬로 스타트를 시작한다. 이때 혼잡 윈도우 크기의 한계치를 손실 이벤트가 발생했을때의 혼잡 윈도우 크기의 절반으로 정한다.
혼잡 윈도우 크기의 한계치를 초과했을 경우에도 슬로 스타트는 종료된다.
혼잡 회피 congestion avoidance
혼잡 윈도우 크기의 한계치는 마지막으로 혼잡이 발견되었을때의 윈도우 크기의 절반으로 된다. 이때 혼잡 윈도우 크기를 증가 시킬 경우 지수적으로 증가시키기에는 위험 부담이 있어 어느 정도까지는 선형적으로 증가시킨다.
선형 증가는 잃었던 세그먼트에 대한 ACK을 모두 수신한 시점에서 종료된다.
빠른 회복 fast recovery
손실 이벤트가 발생한다면 빠른 회복은 슬로 스타트, 혼잡 회피에서와 같은 동작을 수행한 후 새로운 슬로 스타트로 전이한다. 초기 TCP에서는 무조건 손실 이벤트 발생시 1MSS로 윈도우를 줄이고 1씩 증가시키지만, 새로운 버전에서는 빠른 회복을 사용해 혼잡 윈도우 크기의 절반(손실이벤트가 발생했을때 윈도우 크기 절반)까지 지수적으로 빠르게 증가할 수 있게 한다.
+ TCP 분할
동적인 콘텐츠를 제공하는 데이터센터로부터 사용자가 멀리 떨어져 있을 경우 슬로 스타트때문에 성능 저하가 발생한다.
그래서 성능을 개선하기 위해 (1) 프론트 엔드 서버를 사용자에게 가까이 구축하고, (2) 프론트 엔드 서버에서 TCP 연결을 분할한다. TCP 분할을 이용하여 클라이언트는 근처의 프론트엔드로의 TCP 연결을 설정하고, 프론트엔드는 데이터센터로의 지속적인 TCP 연결을 유지한다.
슬로 스타트는 클라이언트와 프론트엔드 서버 사이의 통신 과정에서 발생하므로 통신 거리를 줄여 성능 저하를 줄이는 방식이다. 구글에서 이 방법을 사용한다고 한다.
(참고) James F. Kurose. Computer networking a top-down approach. 7th edition
'CS > 네트워크' 카테고리의 다른 글
[정보처리기사] 네트워크 관련 장비 (0) | 2020.11.02 |
---|---|
[네트워크] IPv4, IPv6 (0) | 2020.11.01 |
[네트워크] Go-Back-N, Selective Repeat (0) | 2020.10.28 |
[네트워크] 콘텐츠 분배 네트워크 (CDN) (0) | 2020.10.23 |
[네트워크] DNS (0) | 2020.10.23 |