※"컴퓨터 네트워킹 하향식 접근 8판" 책을 간단하게 정리한 내용의 글입니다.※
3.7 TCP 혼잡 제어
3.7.1절에서는 네트워크 지원 혼잡 제어보다는 종단 간의 혼잡 제어를 사용하는 전통적인 TCP에 대해 알아보고, 3.7.2절에서는 새로운 네트워크 계층에서 제공하는 명시적 혼잡 지시를 사용하는 TCP에 대해 알아본다.
3.7.1 전통적인 TCP의 혼잡 제어
TCP에서 혼잡 제어를 위해 송신자는 자신(송신자)과 목적지 간의 경로의 혼잡도에 따라 송신율을 조정한다.
이때 다음 세 가지 질문이 생긴다.
TCP 송신자는 연결로 트래픽을 보내는 전송률을 어떻게 제한하는가?
흐름 제어를 위해 수신 윈도(rwnd)가 있다면, 혼잡 제어를 위해서는 혼잡 윈도(congestion window)가 있다. rwnd와 다르게 cwnd는 송신측에 있다.
수신 윈도가 수신 윈도의 제약 조건을 무시할 수 있을 정도로 클 때, 송신자의 확인응답이 안 된 데이터의 양은 오로지 cwnd에 의해 결정된다. 그리고 이때 데이터는 cwnd 바이트만큼 전송할 수 있고, 송신 속도는 대략 cwnd/RTT 바이트/초이다. 그리고 cwnd의 값을 조절하여 송신자는 링크에 데이터를 전송하는 속도를 조절할 수 있다.TCP 송신자는 목적지까지 가는 경로에 혼잡이 존재하는지 어떻게 감지하는가?
빠른 재전송과 마찬가지로, 타임아웃 또는 연속된 3개의 중복 ACK 수신 시에 손실 이벤트를 발생시키고 목적지까지의 경로상에 혼잡이 발생했음 알게된다.TCP에서 혼잡을 감지함에 따라 송신율을 변화시키기 위해 어떤 알고리즘을 사용하는가?
TCP는 확인응답을 통해 윈도 크기를 증가시키고, 송신율을 증가시킨다. 여기서 확인응답은 혼잡 윈도 크기의 증가를 유발하는 트리거 또는 클록으로 사용하므로 TCP는 자체 클로킹(self-clocking)이라고 한다.
TCP는 손실 이벤트가 발생할 때까지는 ACK가 도착함에 따라 전송률을 증가시키고, 손실 이벤트가 발생한 시점에서 전송률을 줄인다.
즉, 네트워크에 의한 혼잡 상태의 어떠한 명시적인 신호도 없다. ACK와 손실 이벤트라는 묵시적 로컬 정보로 송신자의 전송률이 조정된다.
자세한 내용은 아래와 같다.
< 슬로 스타트(slow start) >
TCP 연결에서 TCP 송신자는 가용 대역폭을 빠르게 찾기 위해 처음에 혼잡 윈도의 크기를 1MSS로 설정한다. 그리고 확인응답을 받을 때마다 혼잡 윈도의 크기를 1MSS 증가시킨다.
처음에 1MSS인 혼잡 윈도의 크기는 확인 응답을 받으면 2MSS가 되고, 각 확인응답 세그먼트에 대해 1MSS씩 증가시키면 그 다음 혼잡 윈도의 크기는 4MSS가 된다. 이렇게 혼잡 윈도의 크기는 지수적으로 증가한다.
- 언제 지수적 증가가 끝나는가?
최초로 손실 이벤트가 발생했을 때 지수적 증가가 끝나고 혼잡 윈도의 크기는 다시 1MSS가 된다. - 언제 슬로 스타트가 끝나는가?
최초로 손실 이벤트가 발생한 이후 TCP 송신자는 ssthresh(slow start threshold) 값을 cwnd/2(혼잡이 검출된 시점의 혼잡 윈도 값의 절반)으로 설정한다.
그리고 다시 cwnd를 1MSS에서 지수적으로 증가시키고, ssthresh보다 같거나 커질 때 슬로 스타트는 종료되고 TCP는 혼잡 회피 모드로 전환한다.
< 혼잡 회피(congestion avoidance) >
슬로 스타트의 내용에 따라 혼잡 회피 상태로 들어가는 시점의 cwnd의 값은 혼잡이 마지막으로 발견된 시점에서의 절반이 된다.
혼잡 회피 상태에서는 cwnd 값을 지수적으로 증가시키지 않고 좀 더 보수적으로 증가시킨다. RTT 단위로 MSS를 증가시킨다.
일반적으로 새로운 승인이 도착할 때마다 TCP 송신자는 cwnd를 MSS바이트(MSS/cwnd)만큼 증가시킨다.
즉, MSS가 1460바이트이고 cwnd가 14,600바이트이면, 10개의 세그먼트가 한 RTT내에 송신될 수 있는 것이고, 각 ACK마다 1/10MSS씩(10개의 세그먼트 당 1MSS씩) 혼잡 윈도를 증가시키는 것이다.
- 언제 혼잡 회피의 (RTT당 1MSS의) 선형 증가가 끝나는가?
3개의 중복 ACK를 받으면 cwnd의 값을 반으로 줄이고(그리고 3MSS를 더함) ssthresh 값을 cwnd 값의 반으로 기록한다. 이후 빠른 회복 상태로 들어간다.
< 빠른 회복(fast recovery) >
빠른 회복 상태에서는 TCP를 빠른 회복 상태로 들어가게 했던 세그먼트에 대해 수신된 모든 중복된 ACK에 대해 1MSS만큼 증가시킨다. 그리고 손실된 세그먼트에 대한 ACK가 도착하면 TCP는 다시 cwnd 혼잡 회피 상태로 들어간다.
만약 타임아웃 이벤트가 발생하면, 슬로 스타트로 전이한다. 이때, cwnd 값을 1MSS로 설정하고 ssthresh 값은 손실 이벤트가 발생했을 때의 cwnd 값의 반으로 설정한다.
< TCP 큐빅 >
앞서 말한 방식을 TCP 리노라고 한다. 혼잡 회피 단계에서 TCP 리노는 전송 속도를 선형적으로 증가시킨다.
이와 다르게 TCP 큐빅은 현재와 미래에 도달할 혼잡 윈도 크기가 최대가 되는 시점의 차이의 세제곱 함수로 전송 속도를 증가시켜서 빠르게 손실 전 전송 속도에 도달할 수 있게 해준다.
TCP 큐빅을 활용하면 TCP 리노보다 더 많은 전체 처리량을 누릴 수 있게 된다. 이에 따라 현재 많은 웹 서버에서 TCP 큐빅을 사용하고 있고, 리눅스의 경우 TCP의 디폴트가 TCP 큐빅이다.
3.7.2 네트워크 지원 명시적 혼잡 알림과 지연 기반 혼잡 제어
< 명시적 혼잡 알림 >
명시적 혼잡 알림(Explicit Congestion Notification, ECN)은 TCP와 IP가 모두 관련되어 있다. 네트워크 계층에서 IP 데이터그램 헤더의 서비스 유형(Type of Service) 필드에 있는 2비트가 ECN에 사용된다.
라우터는 직관적으로 손실이 발생하기 전에 ECN을 체크하여 데이터그램을 전달하고, 목적지에서는 이를 송신자에게 알린다.
ECN의 나머지 비트로는 발신 호스트가 라우터에세 송신자와 수신자가 ECN을 사용할 수 있음을 알리는 데 사용된다.
ECN 비트를 통한 명시적 혼잡 알림을 통해 실제 패킷이 손실되고 재전송하는 과정이 일어나기 전에 송신자는 사전에 혼잡 시작을 감지하고 혼잡 윈도를 줄일 수 있다.
< 지연 기반 혼잡 제어 >
지연 기반 혼잡 제어는 모든 확인응답된 패킷에 대한 출발지에서 목적지까지 경로의 RTT를 측정하고, 측정한 RTT 값 중의 최솟값에 대한 전송률 대비 현재의 전송률을 비교해서 정송 속도를 조절하는 방식이다.
3.7.3 공평성
모두 R bps의 전송률이 K개의 TCP 연결이 하나의 병목 링크(라우터 등)를 지나갈 때, 각 연결의 전송률이 R/K에 가깝다면 혼잡 제어 메커니즘이 공평하다고 한다.
< TCP 알고리즘의 공평성 >
위의 그림처럼 2개의 TCP 연결이 전송률이 R인 하나의 병목 라우터를 지나간다고 하자. 이때 두 연결의 처리율의 합은 처음에 R보다 작을 것이다.
위의 그림에서 최초에 두 연결의 처리율은 A지점이라고 하자. 이때 TCP 알고리즘에 의해 각 연결의 처리율은 증가하여 45도로 B지점 쪽으로 이동하게 되고 합이 R보다 커지면서 TCP 알고리즘에 의해 원점와 B지점의 절반 위치(C지점)로 이동한다. 이를 반복하면서 두 연결의 처리율은 수렴하게 된다.
위는 같은 MSS와 RTT를 가지는 이상적인 예시지만, 이 설명은 왜 TCP가 연결 사이에서 대역폭을 똑같이 공유하는지에 대한 직관적인 느낌을 제공한다.
< 공평성과 UDP >
UDP 연결은 TCP와 다르게 혼잡 제어 메커니즘이 존재하지 않는다. UDP는 속도를 보장하기 위해 패킷을 잃더라도 일정한 속도로 데이터를 전송한다. 그렇기 때문에 UDP 송신자들은 TCP 트래픽을 밀어낼 가능성이 있다.
< 공평성과 병렬 연결 >
UDP 트래픽이 공평하게 행동하도록 강요하더라도, 공평성 문제는 여전히 완전하게 해결되지 못한다.
TCP를 하나의 애플리케이션에서 병렬로 여러 개의 연결을 사용한다면, 공평성을 보장할 수 없다.
'CS > 컴퓨터네트워크' 카테고리의 다른 글
[하향식 접근 8판] Chapter 3 - 3.5 연결지향형 트랜스포트: TCP (1) | 2024.11.09 |
---|---|
[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.4.3 GBN, 3.4.4 SR) (0) | 2024.11.08 |
[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.4 신뢰적인 데이터 전송의 원리) (0) | 2024.11.07 |
[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.3 비연결형 트랜스포트: UDP) (1) | 2024.11.02 |
[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.1 ~ 3.2) (0) | 2024.11.01 |