TCP의 혼잡 제어는 흐름 제어나 오류 제어와는 다르게 라우터를 포함한 넓은 범위의 전송 문제를 다루게 된다
💬 AIMD(Additive Increase / Multiplicative Decrease)
- 처음엔 패킷을 하나씩 보내고 문제가 발생하지 않는다면 윈도우 크기를 1씩 증가시킨다
- 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷 전송 속도를 절반으로 줄인다.
- 네트워크에 늦게 들어온 호스트가 처음에는 불리하지만, 시간이 흐르면서 평형상태로 수렴한다
- 문제점은 초기에 네트워크의 높은 대역폭을 사용하지 못해서 오랜 시간이 걸리게 되고, 네트워크가 혼잡해지는 상황을 미리 감지하지 못한다. 즉, 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식인 것이다.
💬 Slow Start
- AIMD가 네트워크 수용량 주변에서는 효율적으로 동작하지만, 처음엔 전송 속도를 올리는데 시간이 너무 길다는 단점이 존재한다.
- Slow Start는 AIMD와 마찬가지로 패킷을 하나씩 보낸다. 패킷이 문제 없이 작동하여 ACK패킷마다 WindowSize를 하나씩 늘린다. 떄문에 한 주기가 지나면 WindowSize는 2배가 되는 것이다
- 만약 혼잡 상황이 발생하면 Window Size를 1로 떨어뜨린다
- 혼잡 상황이 발생한 WindowSize 절반까지는 이전처럼 지수 함수 꼴로 증가시키고 그 이후 부터 다시 완만하게 1씩 증가시키는 방식이다.
- 이미 정해진 임계값에 도달 할 때 까지 윈도우의 크기를 2배씩 증가시킨다.
- 임계값에 도달하면 혼잡 회피 단계로 넘어간다.
Congestion Avoidance(혼잡 회피)
- 윈도우의 크기가 임계 값에 도달한 이후에는 데이터의 손실이 발생할 확률이 높다
- 따라서 이를 회피하기 위해 WindowSize를 선형적으로 1씩 증가시키는 방법이 있다.
- 수신측으로부터 일정 시간 동안까지 ACK을 수신하지 못하는 경우
- 타임 아웃의 발생 : 네트워크 혼잡이 발생했다고 인식한다
- 혼잡 상태로 인식된 경우
- 윈도우의 크기 세그먼트 수를 1로 감소시킨다.
- 동시에 임계값을 패킷 손실이 발생했을때의 윈도우 크기의 절반으로 줄인다.
💬 Fast Recovery(빠른 회복)
- 혼잡한 상태가 된다면 Window Size를 절반으로 줄이고 선형 증가시키는 방법이다.
- 빠른 회복 정책까지 적용하면 혼잡 상황을 한 번 겪고 나서 순수한 AIMD 방식으로 동작하게 된다.
💬 Fast Retransit(빠른 재전송)
- 수신 측에서 패킷을 받을 때 먼저 도착해야할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK을 보낸다. 단 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK패킷에 실어 보내는 데 중간에 패킷 하나가 손실되면 송신측에서는 순번이 중복된 ACK 패킷을 받게 된다. 이것을 감지하게 되면 문제가 되는 순번의 패킷을 재전송할 수 있는 것이다.
- 상황으로 설명해보자
- 송신 측은 수신측이 2번의 데이터를 못 받은 상태이더라도 다음 데이터를 보내게 된다
- 그럼 수신측은 계속해서 받지못한 데이터를 보내달라 요청하게 된다.
- 동시에 혼잡 상황이라 판단하며 WindowSize를 절반으로 줄인다
- 3 ACK Duplicated : 송신 측이 3번 이상 중복된 ACK 번호를 받은 상황
Refrence
'CS > 🖥 네트워크' 카테고리의 다른 글
🖥 지연(Delay)과 손실(Loss) - 처리, 큐잉, 전송, 전파 지연 (0) | 2023.09.18 |
---|---|
🖥 TCP 와 UDP의 차이 (0) | 2023.09.16 |
🖥TCP의 흐름제어, 오류제어(Stop-And-Wait, Go-Back-N, Selective Repeat) (0) | 2023.09.16 |
🖥 3-way Handshake / 4-way Handshake (0) | 2023.09.15 |
🖥 RESTful API (0) | 2023.08.03 |