congestioin이란?
: 네트워크 상에서 너무 많은 데이터를 너무 빠르게 보내는 경우
congestion으로 표출된 결과는 ?
buffer overflow(lost packet)
long delay
Causes/costs of congestion: scenario - 1
두개의 송신자(sender), 두개의 수신자(receiver)
하나의 라우터, 무제한의 버퍼(buffer)
output link capacity : R
입력되는 데이터의 속도는 λin, 전송되는 속도는 λout
재전송 X
두개의 sender가 공유하기 때문에 최대 R/2 까지 이용가능
delay는 queing이 계속 발생하기 때문에 무한으로 증가 (poissiom process 가정)
Causes/costs of congestion: scenario - 2
ideal situation
한개의 라우터, 유한(finite) 버퍼
유한한 버퍼를 사용하기 때문에 packet-loss가 발생함에 따라 time-out이 발생해 retransmission이 생김
application layer 상에서 입력되는 속도와 전송되는 속도가 같아야한다. λin=λout, 시스템이 stable하기 위해서
TCP에서 재전송(retransmission)을 해야하기 때문에, λin‘≥λin
여기서 λin‘는 original data + retransmitted data
loss된 패킷만 재전송 할 수 있다.
재전송이 많아지게되면 어느 순간에는 λout은 R/2로 수렴한다. loss된 패킷만 재전송하기 때문에 goodput(재전송을 뺀)이 R/2로 수렴한다.
Realistic situation
중복된 패킷들이 계속 증가되기 때문에 λout은 R/2보다는 작은 값으로 수렴한다.
cost의 congestion
주어진 goodput을 위해서는 더 일을 해야한다. premature timeout(불필요한 재전송)에 의해서 재전송을 해야한다. 불필요한 재전송 = 같은 패킷의 여러개의 copy가 도착
goodput=throughput−duplicate
Causes/costs of congestion: scenario - 3
4 senders
multihop paths
timeout / retransmit
connection들이 라우터를 공유하는 상황에서 throughput은 어떻게 되는 가?
파란색 패킷은 왼쪽의 첫번째 라우터를 통과하고, 두번째 라우터를 통과해야하기 때문에 라우터가 낭비가 되는 모습
λin‘이 계속해서 증가하게되면 빨간색 패킷과 파란색 패킷이 지나는 라우터의 버퍼는 유한하기 때문에 통과하는 파란색의 패킷을 점점 줄어들고 Host B에서 파란색의 throughput에서 점점 더 loss가 발생한다. 그래서 c/2 시점 이후로는 0으로 수렴하게 된다.
TCP: Congestion control
AIMD(additive increase multiplicative decrease)
additivie : 서서히, cwnd를 증가 시킨다(1 MSS 씩 매 RTT 마다 증가)
multiplicative : 급격히, 현재 cwnd의 값을 1/2 만큼 줄인다.(cwnd /= 2)
TCP: Congestion control, details
cwnd : maximum window size(Byte로 이루어짐)
노란색 구간 : head pointer와 tail pointer로 처음과 끝을 알려줌
sender는
last byte sent : 최종 ack를 받지 않고 보낸 바이트의 seq #
last byte ACKed : ack를 받은 최종 바이트의 seq #
min(rwnd, cwnd) : receiver와 sender의 윈도우 사이즈 중에서 최소값
(last byte sent - last byte ACKed) ≤ min(rwnd, cwnd)
RTT 마다 cwnd만큼(byte) 보내짐
throughput : 어떤 시간 동안에 얼만큼 보냈는지를 나타낸다.
rwnd > cwnd 를 가정한다면 결국 ack를 받지않고 보내는 양은 cwnd / RTT 만큼 전송된다.
AIMD를 사용하면 cwnd / RTT 만큼 받을 수 있다.
TCP: Slow Start
AIMD를 개선할 수 있는 알고리즘
초기에 사용하며, 조금 더 급격하게 성능을 개선할 수 있음
어느 정도 sending rate를 올린 후에 linear increase를 한다.
init cwnd = 1 MSS
매 RTT 마다(ACK를 받을 때 마다) cwnd *= 2
AIMD와는 다르게 조금의 공간이 생기면 급격하게 window size를 늘렸다가 threshold 이상으로 넘어가는 순간 1로 초기화한다.
TCP: packet loss
추적할 수 있는 두가지 방법
timeout cwnd = 1 MSS reset(initial value)
: heavy congestion
3 duplicate ack : fast retransmit algorithm
loss가 알려졌다면, cwnd /= 2 하고 (3 duplicate ack 추가 후) 바로 linear increase
중복된 ack는 어느정도 일부의 데이터가 전달됐다는 의미
: light congestion