이전 글에서는 congestion control을 해야 하는 이유에 대해서 설명했습니다.
중요 단어를 짚고 넘어가자면,
cwnd (congestion window)
sender가 ack를 받기 전에 보낼 수 있는 패킷양을 의미합니다.
cwnd값이 증가하면 더 빠르게 데이터를 전송할 수 있다.
이 값을 적절하게 잘 조절하는 것이 congestion control의 목표이다!
이번 글에서는 어떤 식으로 혼잡을 회피하는지에 대해서 설명하겠습니다.
AIMD (Additive Increase & Multiplicative Decrease)
말 그대로 합 증가, 곱 감소 알고리즘이다.
패킷 로스가 발생하지 않는다면 전송률을 점진적으로 증가시키다가, loss가 감지되면 전송률을 반으로 감소시키는 방식이다.
AIMD 알고리즘은 모든 호스트가 공평하게 네트워크를 사용하게 된다.
- 모든 송신자가 혼잡 제어 알고리즘을 동일하게 따르기 때문에, 각 송신자가 자원을 공정하게 사용할 수 있습니다.
TCP Slow Start
- 초기 cwnd는 1 MSS이지만, 계속해서 2배로 증가시킨다.
- 2배로 증가시키다가, 혼잡현상이 발생 시 윈도 사이즈를 1로 확 줄여준다.
AIMD와는 다르게 2배로 윈도우 사이즈를 증가시켜 빠르게 네트워크의 대역폭을 사용하게 된다.
Congestion avoidance
네트워크 혼잡을 피하기 위해 송신자가 전송 속도를 조절하는 기술이다.
일반적으로 혼잡 회피 알고리즘은 혼잡 왼 도우 크기를 조절하는 방식
대표적인 알고리즘은 TCP Hahoe, TCP Reno가 있다.
ssthresh
- slow start threshold
- 여기까지만 slow start를 사용하겠다는 의미이다. (임계점)
- 특정한 임계점을 정해서, cwnd가 임계점을 넘어가면 이후부터는 AIMD 방식을 사용하여 윈도를 증가시킨다.
혼잡의 두가지 상황
- 3 duplicate ACKs로 인한 loss 판단
- 송신 측이 3번 이상 중복된 ACK를 받은 상황
- 정상적으로 데이터가 전송되지 못했다는 것을 의미함.
- timeout으로 인한 loss 판단
- 보낸 데이턱 유실되었거나, 수신 측의 ACK 응답이 유실되어서 일정 시간 동안 송신 측이 응답받지 못한 상황
TCP Tahoe
처음에는 동일하게 Slow start 방식으로 윈도를 증가시키다가, ssthresh 시점 이후부터는 AIMD 방식을 사용한다.
Timeout이나 ACK Duplicated 상황 발생시(패킷손실), 네트워크가 혼잡한 것을 인지하고
혼잡상황 발생시 ssthresh를 이전 윈도 사이즈의 절반으로 감소시키고, cwnd값을 1로 설정한다.
단점
- TCP Tahoe는 혼잡을 감지할 시 윈도 크기를 바로 감소하는 방식이다.
- 하지만 이 감소가 너무 급격하게 이루어져서, 전송속도가 급격하게 감소하고, 대기 시간이 증가하고, 네트워크 자원의 낭비를 초래할 수 있다.
즉 윈도우를 1로 초기화해서 다시 증가시키는 것은 비효율적이다!
TCP Reno
TCP Tahoe와 알고리즘은 동일하지만, 대응하는 상황을 구분하는 것에서 차이를 보인다.
TCP Tahoe는 Timeout과 중복된 ACK에 대해서 같은 방식으로 대응했지만, TCP Reno는 다르다.
3 duplicated ACK일 경우 (가벼운 손실)
- ssthresh 값을 현재 cwnd 값의 절반으로 설정
- cwnd 값을 ssthresh 값으로 설정한다.
- 즉 ssthresh값과 cwnd 값이 같다는 뜻
- 그 이후 slow start로 전환
Timeout이 발생한다면 (큰 손실)
- ssthresh 값을 현재 cwnd 값의 절반으로 설정한다.
- cwnd 값을 1로 초기화한다.
- 그 이후 slow start로 전환.
윈도 사이즈를 1로 줄이고 Slow start를 시작하지만, TCP Tahoe와 다르게, ssthresh 값은 변경하지 않는다.
Bottleneck link
congestion의 원인이 되는 놈이다.
네트워크에서 데이터 전송이 혼잡하게 일어나는 부분을 가리키는 용어이고, bottleneck link는 전체적인 데이터 흐름을 제한하게 되어 네트워크 전체 성능에 영향을 미친다.
쉽게 말하면 가장 바쁜 라우터..? (아닌가)
Delay- based TCP congestion control
혼잡상황을 지연 시간을 기반으로 감지하고 제어하는 방식
일반적으로 TCP Congestion control은 패킷 손실을 감지해서 혼잡 상황을 인지한다.
하지만 패킷 손실만이 아니라, 느린 전송 지연도 혼잡 상황을 나타낼 수 있다.
버퍼는 가득 차지 않았지만 버퍼에 긴 대기 큐가 형성되어 패킷의 전송이 지연되는 경우가 있을 수도 있다.
현재의 RTT와 이전의 RTT를 측정해서 변화량을 계산합니다.
두 값이 클수록 지연시간의 변화가 크다는 것을 의미합니다.
이 지연시간 변화량이 일정 임계량을 초과하는 경우 혼잡 상태로 간주합니다.
혼잡상태라고 감지되면, TCP는 현재의 전송 속도를 조절합니다.
- 혼잡상태라고 감지되지 않는다면(변화량이 임계값보다 적다면) cwnd의 크기를 증가시킨다. (전송속도 증가)
- 혼잡상태라고 감지되면(변화량이 임계값보다 크다면) cwnd의 크기를 감소시킨다.(전송속도 감소)
ECN(Explicit Congestion Notification)
말 그대로 네트워크의 혼잡상황을 명시적으로 알리는 기술입니다.
ECN 비트를 사용합니다.
- ECN 비트 값이 증가되었다는 뜻은 혼잡 상태를 감지하고, 송신과 수신 측에 통지하는 것입니다.
E(ECE) 비트
- 수신한 TCP 세그먼트에서 혼잡을 감지하는 피드백에 사용합니다.
- 0 : 혼잡을 감지하지 않은 상태,
- 1 : 혼잡을 감지한 상태
C(CWR) 비트도 활용되는데
- 이 필드는 수신 측에서 E비트를 확인했고, 혼잡상태에 대한 대응에 관한 필드입니다.
- 1로 설정되었다면, 송신 측에게 혼잡상태가 이제 해소되었다는 것을 전달합니다.
TCP fairness
네트워크에서 다양한 TCP 연결 간에 공정한 대역폭 사용을 보장하는 것을 의미합니다.
어느 한 네트워크가 독점해서는 안 되겠죠.
특히 bottleneck link에서는 특히 공정해야 합니다.
원래 초기 시작은 y=x그래프로 동일한 대역폭을 보장해 줘야 합니다.
하지만 그렇지 못한 상황도 있을 겁니다.
이러한 경우 우리는 위에서 배웠던 TCP congestion Control방법들을 이용해서 서로의 대역폭을 공정하게 맞춰주는 작업을 해야 합니다.
모든 네트워크는 공정할까?
UDP 때문에 모든 네트워크는 공정하다고 할 수 없습니다.
그리고 UDP와 TCP가 같은 경로를 사용할 때도 문제점이 있다.
혼잡제어의 불균형
TCP는 혼잡 제어 알고리즘을 사용해서 혼잡상황에서 데이터 전송량을 제어합니다.
하지만 UDP는 이러한 기능이 없기 때문에 같은 경로를 사용하는 경우, TCP 혼자 조절하고, UDP는 무제한으로 데이터를 전송합니다.
이러한 UDP의 무제한적인 전송 때문에 TCP 트래픽이 가로막히는 상황이 발생하기 때문에, 공정한 대역폭 분배에 문제가 생깁니다.
😀요약
- Congestion Control
- AIMD는 패킷 로스가 발생하지 않을 때까지 전송률(cwnd)을 점진적으로 증가시키다가, loss가 감지되면 전송률(cwnd)을 반으로 감소시키는 방식이다.
- 이 알고리즘은 모든 호스트가 공평하게 네트워크를 사용하는 장점이 있다.
- Slow start는 2배로 전송률(cwnd)를 증가시키다가, 혼잡을 감지했을 경우, cwnd를 1로 확 줄여준다.
- 초기 시작은 느리지만, 증가는 exponetial 하다.
- Delay-based
- 혼잡상황을 지연 시간을 기반으로 감지해서 제어하는 방식
- RTT값의 변화량을 계산해서 전송속도를 조절한다.
- 혼잡상황을 지연 시간을 기반으로 감지해서 제어하는 방식
- AIMD는 패킷 로스가 발생하지 않을 때까지 전송률(cwnd)을 점진적으로 증가시키다가, loss가 감지되면 전송률(cwnd)을 반으로 감소시키는 방식이다.
- Congestion avoidance
- 우선 혼잡의 2가지 상황에 따라 알고리즘 별로 대응책이 다르다.
- 혼잡의 2가지 상황은 3 duplicate ACKs와 timeout이 있다.
- TCP Tahoe는 그 2가지 상황에 대해서 구별하지 않고 대응한다.
- ssthresh를 이전 cwnd 사이즈의 절반으로 감소, 현재 cwnd값을 1로 설정한다.
- TCP Reno는 2가지 상황에 대해서 구별 대응한다.
- 3 duplicatd ACK
- 가벼운 손실이라고 한다.
- ssthresh 값을 현재 cwnd 값의 절반으로 설정하고, 현재 cwnd값을 ssthresh값으로 설정한다.
- Timeout
- 큰 손실이라고 한다.
- ssthresh를 이전 cwnd 사이즈의 절반으로 감소, 현재 cwnd값을 1로 설정한다.
- 큰 손실이라고 한다.
- 3 duplicatd ACK
- 우선 혼잡의 2가지 상황에 따라 알고리즘 별로 대응책이 다르다.
- ECN
- 네트워크의 혼잡상황을 명시적으로 알려준다.
- 각 비트들을 사용해서 송신/수신 측에 지금 네트워크가 혼잡하고, 혼잡상황이 해결되었다는 것을 알려준다.
- 네트워크의 혼잡상황을 명시적으로 알려준다.
- TCP congestion control의 핵심은 cwnd 값을 조절하는 것이다.
'Computer Science > Network' 카테고리의 다른 글
[컴퓨터망] - IP datagram format (2) | 2023.04.15 |
---|---|
[컴퓨터망] - Network Layer(Routing & Forwarding & Switching Fabric && Buffer Management) (1) | 2023.04.15 |
[컴퓨터망] - principles of congestion control (0) | 2023.04.14 |
[컴퓨터망] - TCP connection (0) | 2023.04.14 |
[컴퓨터망]- TCP flow control (0) | 2023.04.14 |