1. 슬로 스타트
점진적으로 cwnd 를 증가시키는 방법 (1→2→4 이렇게 2배씩 cwnd크기를 증가시킨다)
cwnd(혼잡 제어 윈도) : 현재 네트워크로 보내는 데이터의 양이다.
처음에는 1 MSS(Maximum Segment Size) 크기로 cwnd 를 설정
ssthresh(slow start threshold - 슬로스타트 임계값) 같은 경우 손실 발생시(타임 아웃을 상정) 그 발생당한 시점의 cwnd의 절반으로 설정
만약 cend ≥ ssthresh 가 된다면 혼잡회피 단계로 넘어간다.
2. 혼잡 회피
네트워크가 혼잡한걸 파악후 과감히 cwnd를 올리는 슬로 스타트와 달리 보수적으로 cwnd를 올려 혼잡을 회피하는 방식
이 때 증가 크기는 RTT 당 하나의 MSS 크기만큼 전송시킨다 MSS*(MSS/cwnd)→ 보수적으로 올린다는 것만 알면 될 듯? cwnd = cwnd + MSS(MSS/cwnd)
이렇게 올리다가 3 ACK 도착시 다시 슬로스타트로 변경된다 ⇒ 타호(Tahoe) 식
리노(Reno)식은 슬로스타트가 아닌 빠른 회복 단계로 넘어간다.
3. 빠른 회복
혼잡 회피에서 온 단계로 슬로 스타트로 넘어가는 것이 아닌(cwnd = 1) 기존 슬로스타트 임계치에
3 MSS(ACK) 를 더해줘서 ACK를 기다려 보는 방식
이때 재전송한 세그먼트에 대한 ACK가 온다면 다시 혼잡 회피 방식으로 돌아간다.
이래도 타임 아웃(손실)이 발생한다면 슬로스타트(cwnd =1)로 넘어가게 된다.
TCP에서의 필수는 아니나 권장하는 방식이다.
리노 : 빠른회복으로 넘어가기에 좀 더 높은 cwnd를 유지하며 전송할 수 있다.
12 cwnd에서 손실이 발생한 부분에서 ssthresh + 3 MMS 로 cwnd를 설정한 걸 볼수 있다
선형적으로 증가시키는 중
거시적 평균 연결 처리율 : 0.75 * W/RTT
W 최대 윈도 크기
리노의 평균 처리율 범위
1/2 * W / RTT ~ W / RTT
슬로 스타트 타임아웃 시 ssthresh가 cwnd의 절반이 되기 때문에
타호 : 빠른회복없이 바로 슬로스타트로 넘어간다
손실이 발생하면 바로 cwnd를1 로 낮춰 진행한다.
✅ 아래와 같이 그래프가 톱니 모양인 가법적 증가 승법적 감소 방식인 AIMD 혼잡제어 방식으로 TCP의 혼잡 제어 서비스가 제공된다.
4. TCP 큐빅
최근에 많이 쓰기 시작한 TCP 혼잡제어 방식
선형적으로 증가시키는 리노와 다르게 큐빅은 최대 윈도 크기 Wn에 도달하는 시점 K에 보다 빠르게 도달하도록 하는 방식이다.
cwnd + MSS(K-t)^3 → t는 현재시점