한 라우터에 데이터가 몰리게 되면 오버 플로우로 데이터 손실이 발생할 수 있다.
이를 해결하기 위해 데이터 전송속도를 강제로 줄이게 되는데 이러한 작업이 혼잡제어이다.
먼저 용어 정의
cwnd : TCP 송신 측이 네트워크 혼잡 상태를 고려하여 한 번에 전송할 수 있는 데이터 양
ssthresh : Slow Start를 종료하고 Congestion Avoidance로 전환하는 기준값이다.
→ 너무 느림 → SS필요성
1, 2, 3, 4, 5를 보냈는데 3이 손실되었다고 하면, 수신자는 4, 5를 받아도 아직 3이 없기 때문에 “ACK 3”(3번 주세요) 을 계속해서 송신자게에 보낸다.cwnd를 줄인다.| 기능 | 역할 |
|---|---|
| Slow Start | 초기 cwnd를 지수적으로 빠르게 증가 |
| Congestion Avoidance (AIMD) | ssthresh 이후 선형 증가, 혼잡 발생 시 cwnd를 절반 감소 |
| Fast Retransmit | 중복 ACK 3개 발생 시 즉시 재전송 |
| Fast Recovery | cwnd를 1로 줄이지 않고 절반 수준에서 빠르게 회복 |
[전체 요약]
연결 시작
→ Slow Start
→ ssthresh 도달
→ Congestion Avoidance(AIMD)
→ 혼잡 감지
혼잡 감지 방식 1: 중복 ACK 3개
→ Fast Retransmit
→ Fast Recovery
→ Congestion Avoidance 복귀
혼잡 감지 방식 2: Timeout
→ cwnd = 1
→ Slow Start 재시작
→ Congestion Avoidance 복귀
[정상 시작]
연결 시작
→ cwnd = 1
→ Slow Start
→ ACK를 받을 때마다 cwnd 지수 증가
→ cwnd >= ssthresh
→ Congestion Avoidance(AIMD)
→ cwnd 선형 증가
[Case 1. 혼잡 없음]
Congestion Avoidance
→ ACK 정상 수신
→ cwnd 조금씩 증가
→ 계속 전송
[Case 2. 중복 ACK 3개로 손실 감지]
패킷 일부 손실
→ 수신자가 같은 ACK를 반복 전송
→ 송신자가 중복 ACK 3개 수신
→ Fast Retransmit
→ 손실 세그먼트 즉시 재전송
→ ssthresh = cwnd / 2
→ cwnd를 절반 수준으로 감소
→ Fast Recovery
→ Congestion Avoidance로 복귀
[Case 3. Timeout으로 손실 감지]
패킷 손실
→ ACK가 일정 시간 동안 오지 않음
→ Timeout 발생
→ 손실이 더 심각한 혼잡이라고 판단
→ ssthresh = cwnd / 2
→ cwnd = 1
→ Slow Start 다시 시작
→ cwnd가 ssthresh에 도달
→ Congestion Avoidance로 전환