*TCP congestion
control
end-end
control (network으로부터 지원은 없다)
sender의 전송량을 제한
LastbyteSend – LastbyteAcked ≤ CongWin (TCP 수신buffer가 충분히 큰경우 : 혼잡제어만 필요)
[≤ min{congWin, RcvWindow}] (혼잡제어) (흐름제어)
송신률
rate = CongWin / RTT (byte/sec)
// congwin : 센더의 윈도우 사이즈
CongWin는
netwok 혼잡도에 따라 동적으로 변한다.
Sender가 congestion에 대한 반응
- 손실이 발생
- timeout 또는 3번의 중복 ACK
- 손실에 의한 재전송이 발생
// timeout 일때는 윈도우 사이즈를 가장 적게 줄인다. ex 보통 절반
// 3번의 중복으로인한 윈도우 사이즈 줄이는양보다 timeout 양이 더 많이 줄인다.
- TCP sender는 손실이 발생하면 CongWin을 줄인다.
혼잡제어
알고리즘
- AIMD
- slow start
- timeout event에 대한 반응
*TCP AIMD
multiplicative
decrease
loss event가 발생하면 CongWin의 size를
반으로 줄인다.
- 1MSS 이하로 떨어지지는 않는다.
// 혼잡회피라고 불림
// aimd 천천히 늘려가는 것
additive
increase
loss event가 없으면 매번 ACK를 확인 할때 각 RTT마다 congWin의 증가폭이 1MSS가 되도록 조금씩 confWin을 증가 시킨다.
-> 이러한
선형 증가를 혼잡 회피라고 한다.
*TCP Slow start
TCP연결이 시작될때 CongWin의 크기는 1 MSS로 초기화 되고 초기
전송률은 MSS/RTT가 된다.
- Ex
MSS(500byte), RTT(200ms)
init rate = 20kbps
500byte/200ms
= 4,000bit/0.2s = 20,000bps
=20kbps
사용가능한
대역폭은 MSS/RTT보다 매우 크다
- 선형비률로 증가시키면 전송률이 적당한 수준에 오를때 까지 긴 지연이 초래된다.
첫번째 loss가 발생할 때 까지 각 ack를
확인할 때 마다 congWin을 1MSS만큼
증가 시켜 각 RTT마다 congWin이 두배가 되도록 한다.
congWin의 증가치
AIMD : 각 RTT마다 1MSS
SS : 각 ACK마다 1MSS 각 RTT마다 두배
접속이 되면 loss event가 발생할 때 까지 지수적으로 속도를 증가시킨다.
- 각 RTT마다 CongWin이 두배
- 모든 ACK가 수신될때마다 CongWin을 증가 시킨다.
초기의
속도는 매우 느리지만 지수적으로 빠르게 증가하는 모델이다.
*Refinement
세번의
중복 ACK수신
- CongWin은 반으로 줄어든다.
- Congwin은 선형적으로 증가한다.
- AIMD
그러나 timeout이
발생하면
- CongWin을 1MSS로 줄인다.
- 지수적으로 CongWin을 증가시킨다.
- threshold에 도달하면 다시 선형적으로 증가한다.
: 혼잡
회피에 들어간다.
threshold
: CongWin의 절반
개념
- 세번 중복된 ACKs는 네트워크가 거의 대역폭 한계에 도달했다고 판단
-
timeout는 삼중 ACK보다
심각하게 처리한다.
Q
:언제 지수적인 증가가 일어나는가?
A : timeout에
의해 CongWin이 1로
줄어든 이후에 threshold까지
구현
- threshold는 가변적이다.
- Loss event가 일어나면 threshold는 congWin의 1/2로 설정된다.
*TCP 혼잡제어 요약
CongWin은
threshold에 도달 할때 까지 slow-start방식으로
빠르게 증가한다.
CongWin이 threshold에 도달하면 혼잡회피를 위해 선형적으로 천천히 증가한다.
3번 중복된
ACK가 감지되면 CongWin은 threshold 까지
줄어들고 선형으로 증가한다.
Timeout이 발생하면 CongWin은 1
MSS로 줄었다가 다시 threshold에 도달 할 때 까지
빠르게 증가한다.
댓글 없음:
댓글 쓰기