흐름제어
- 송신측과 수신측 사이의 데이터 처리 속도 차이를 해결하기 위한 기법이다
- 송신 측의 전송량 > 수신측의 처리량인 경우, 패킷이 수신 측의 큐를 넘어 손실될 수 있어서 송신측 패킷 전송량을 제어해줘야 한다.
흐름제어 두가지 방식
1. Stop and Wait (정지-대기)
매번 전송한 패킷에 대한 응답을 받아야 그 다음 패킷을 전송할 수 있다.
2. Sliding Window (슬라이딩 윈도우)
수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답 없이 세그먼트를 전송할 수 있게 해서 데이터 흐름을 동적으로 조절한다.
송신 측은 ACK 라는 프레임을 받게 되면 ACK 프레임에 따른 프레임의 수 만큼 오른쪽으로 경계가 확장된다.
윈도우?
수신, 송신 스테이션 양쪽에서 만들어진 버퍼 크기!
혼잡제어
- 네트워크 혼잡을 피하기 위해 송신 측에서 보내는 데이터의 전송 속도를 제어하는 것
- 송신 측 데이터 전달과 네트워크 데이터 처리 속도 차이를 해결하기 위한 기법
- 한 라우터에 데이터가 몰려서 모든 데이터를 처리할 수 없는 상황에 이르렀을 때, 호스트들은 계속해서 재전송을 하고 결과적으로 혼잡만 가중시켜 오버플로우나 데이터 손실이 발생한다.
혼잡제어 알고리즘
TCP 혼잡제어 알고리즘(TCP congestion control algorithm)은 다음의 중요한 구성요소들을 갖는다.
- 슬로 스타트(slow start)
- 혼잡 회피(congestion avoidance)
- 빠른 회복(fast recovery)
- 빠른 재전송(fast retransmit)
이 중 슬로스타트
와 혼잡회피
는 TCP의 필수 요소이다. 다만 수신된 ACK들에 대응해 cwnd(congestion window) 크기를 얼마나 증가시키냐는 것이 서로 다르다. 빠른회복
은 TCP 송신자들에게는 필수 사항은 아니다.
cwnd?
혼잡 윈도우는 TCP 송신자가 네트워크로 트래픽을 전송할 수 있는 비율을 제한한다. 특히 송신하는 쪽에서 확인응답이 안된 데이터의 양은 cwnd 와 rwnd의 최솟값을 초과하지 않는다.
1. 슬로우 스타트
- 전송 성공 시 ACK 패킷마다 cwnd를 1씩 증가시킨다. 즉, 한 주기가 끝나고 나면 cwnd는 2배배가 된다.
- 혼잡 현상이 발생하면 cwnd 를 1로 떨어뜨린다.
- 한번 혼잡 현상이 발생하고 나면 혼잡 현상이 발생했던 cwnd 의 절반까지는 이전처럼 증가시키다가 그 이후부터는 완만하게 1씩 증가시킨다.
- 즉, 임계 값(ssthresh, slow start threshold)을 절반으로 줄인다.
- 매 전송마다 2배씩 증가하기 때문에 데이터의 크기가 지수함수적으로 증가한다.
- 파악한 임계 값에 도달하기 전까지 2배씩 증가, 임계값 도달 시 혼잡 회피 단계로 넘어간다.
2. 혼잡 회피
- 윈도우 크기가 임계 값에 도달한 이후에는 데이터의 손실이 발생할 크기가 올라감
- 이를 회피하기 위해 cwnd 크기를 전송 시마다 1 씩 증가시킨다.
- 수신 측으로부터 일정 시간동안 ACK 를 받지 못하면, 타임 아웃이 발생해 cwnd 크기를 1로 줄인다.
- 동시에 임계 값을 패킷 손실이 발생했을 때의 cwnd 크기의 1/2로 줄인다.
3. 빠른 회복
- 혼잡한 상태가 되면 cwnd 를 1이 아니라 절반으로 줄이고 선형 증가 시키는 방법
- 빠른 회복 정책이 적용되면 이후엔 순수한 AIMD 방식으로 동작
4. 빠른 재전송
- 패킷을 받는 수신자 입장에서 세그먼트로 분할된 내용이 순서대로 도착하지 않는 경우가 있다.
- 수신 측에서 패킷을 받을 때 먼저 올 패킷보다 다음 패킷이 먼저 도착해도 ACK 를 보냄
- 단, 이 때 순서대로 잘 도착한 패킷의 마지막 순번을 ACK 에 실어서 보냄
- 따라서 중간에 패킷이 손실되면 송신 측에서는 순번이 중복된 ACK 패킷을 받게 되는 것이다. 이것을 감지하면 문제가 되는 순번의 패킷을 재전송할 수 있다.
- 빠른 재전송은 중복된 순번의 패킷을 3개 받으면 재전송한다.
- 재전송하는 경우 혼잡 상태로 간주하고 혼잡 회피를 한다.
AIMD(Addictive Increase Multiplicative Decrease)
- 합 증가/ 곱 감소 알고리즘 이라고도 한다.
- 처음 패킷 하나를 보내 패킷이 문제없이 도착하면 CWND(Congestion Window, 혼잡 윈도우)를 1씩 증가시키면서 전송하는 방법
- 패킷 전송이 실패하거나 타임아웃이 발생하면 CWND를 1/2로 감소시킨다.
- 호스트가 하나의 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 불리하지만 시간이 지날수록 평형 상태로 수렴한다
- 단점은, 초기 넓은 대역폭을 활용하지 못하고 미리 혼잡 상태를 감지하지 못하고 혼잡해지고 나서야 대역폭을 줄이는 방식이라는 점이다.