77~
다시 돌아온 TCP! TCP의 혼잡 제어 메커니즘 알아보자.
IP 계층은 종단에게 아무런 직접적 피드백이 없으니 전통적인 TCP는 네트워크 지원 혼잡 제어보다는 종단 간의 혼잡 제어를 사용한다.
3.7.1 전통적인 TCP 혼잡 제어
- TCP 취한 접근 방식은 네트웍 혼잡에 따라 연결에 트래픽이 보내는 전송률을 각 송신자가 제한하도록 하는 것
- 혼잡이 없다 판단하면, 송신자는 송신률 높인다.
- 의문이 떠올라야 되는데 3가지다!
-
- TCP 송신자는 어떻게 자기의 전송 트래픽 전송률을 제한하나?
-
- TCP 송신자는 어떻게 목적지간의 혼잡을 감지하나?
-
- TCP 송신자는 송신율 변화시키기 위해 어떤 알고리즘을 써야하나?
-
전송률 제한 방법
- 송신 측에서 동작하는 TCP 혼잡 제어 메커니즘은 추가적 변수인 **혼잡 윈도(congestion window)**를 추적한다.
- cwnd 로 표시됨
LastByteSent - LastByteAcked <= min(cwnd, rwnd)
혼잡 존재 감지하는 방법
- 과도한 혼잡 발생 시 경로에 있는 하나 이상의 라우터 버퍼들이 오버플로되고, 그 결과(TCP가 포함된) 데이터그램이 버려짐
- 이 버려진걸로 손실 이벤트가 발생되니, 이걸로 혼잡 발생을 알아차림
- TCP는 확인응답을 혼잡 윈도 크기를 증가를 유발하는 트리거 or 클록 으로 쓴다.
TCP 송신자들은 가용한 대역폭 모두 쓰면서 네트워크를 혼잡시키지 않는 전송률을 어떻게 결정할 수 있을까?
- 손실된 세그먼트 == 혼잡, 따라서 TCP 전송률은 한 세그먼트를 손실했을 때 줄여야한다.
- 확인응답된 세그먼트는 수신자까지 성공적으로 도달했고 네트워크는 혼잡하지 않다는, 즉 모든 것이 좋다는 묵시적 표시로 받아들여진다. 따라서 혼잡 윈도 크기가 증가할 수 있다.
- 대역폭 탐색. TCP 송신자는 혼잡 발생하는 시점까지 전송률 증가시키고(전송률 탐색) 그 시점 이후 부터는 줄인뒤, 다시 혼잡이 되는지 보기위한 탐색을 시작한다.
- 네트워크에 의한 혼잡 상태는 어떠한 명시적 신호도 없다. ACK와 손실 이벤트는 묵시적 신호.
혼잡 제어 알고리즘은 다음과 같은 3가지 중요한 요소 갖는다.
- 슬로 스타트
- 혼잡 회피(congestion avoidance)
- 빠른 회복(fast recovery)
1,2는 필수다.
슬로 스타트
- 슬로 스타트 단계에서 전송률은 지수적으로 상승
- 이 지수적 상승은 언제 멈추나?
-
- 타임아웃으로 표시되는 손실 이벤트(즉, 혼잡)이 있을 경우 cwnd를 1로 설정하고 다시 슬로스타트 시작
-
- cwnd값이 ssthresh와 같으면 슬로 스타트 끝나고 TCP는 혼잡 회피 모드로 간다
-
- 3개의 중복 ACK가 검출되면 빠른 재전송을 수행하여 빠른 회복 상태로 들어간다.
-
혼잡 회피
- 혼잡 회피로 들어가는 시점에서 cwnd의 값은 대략 혼잡이 마지막으로 발견된 시점에서 값의 반이 된다.
빠른 회복
- cwnd값을 손실된 세그먼트(TCP를 빠른 회복 상태로 들어가게 했던 세그먼트)에 대해 수신된 모든 중복된 ACK에 대해 1 MSS씩 증가시킨다.
TCP 혼잡 제어: 복습
TCP 큐빅
-
TCP 리노의 혼잡 제어에 대한 가법적 증가, 승법적 감소 접근 방식 고려할때 이것이 패킷 손실 발생 임계값보다 바로 아래의 패킷 전송 속도를 탐색하는게 좋은 방법인지 자연스럽게 궁금해할 수 있다.
-
패킷 손실이 발생한 혼잡한 링크의 상태가 많이 변경되지 않은경우 정송 속도 빨리 높여 손실 전 전송 속도에 근접한 다음 대역폭을 신중히 조사하는게 좋을것. 이게 TCP 큐빅으로 알려진 TCP의 특징
-
큐빅은 널리 쓰인다.
-
최근 50%넘는 점유율(현재는 더 클 듯)
-
리눅스의 기본 TCP 버전
TCP 리노 처리율의 거시적 설명
3.7.2 네트워크 지원 명시적 혼잡 알림과 지연 기반 혼잡 제어
비교적 최근 네트워크가 TCP 송신자, 수신자에게 명시적으로 혼잡 신호 호낼 수 있도록 IP 및 TCP에대한 확장이 제안, 구현, 배포됨.
명시적 혼잡 알림
ECN 비트 등장
지역 기반 혼잡 제어
3.7.3 공평성
89~