Reference - Computer Networking: a Top Down Approach
Transport layer는 Application의 end to end (source와 destination)을 연결시켜주는 역할을 하는 layer다.
Congestion Control
Congestion control이란 예측에 기반해 네트워크 자체의 혼잡을 막기 위해 ACK 속도에 따라 전송 속도를 조절하는 것이다.
이때 송신 측이 데이터를 보내는 크기인 Congestion Window(cwnd)를 조절하여 혼잡을 제어한다. loss가 발생하지 않으면 cwnd를 조금씩 늘려 전송량을 늘리게끔 고안되었다.
Congestion Collapse는 network traffic이 쌓이다가 한 부분이 bottleneck으로 인해 queue가 쌓이게 되어(=queue가 빠지는 속도보다 queue로 들어오는 속도가 빠름) Time delay가 증가하다가 역치를 넘어서면 collapse가 발생한다.
TCP History에 따라 TCP Tahoe, TCP Reno, TCP New Reno 순서로 알고리즘이 발전했다.
TCP Tahoe는 TCP 연결 후 window size(cwnd) 1로 시작해 ACK를 받을때마다 지수적으로 window size를 증가시키는(=called ACK clocking) slow start 방식이다. 그러다가 loss(timeout or dupACK)가 발생하면 그때의 window size 절반을 ssthreshold로 설정 후 1에서 다시 시작한다. 이후 다시 지수적으로 증가하다가, ssthresh에 도달하면 window size를 1씩 증가시킨다. 이렇게 1씩 증가시키는 단계를 congestion avoidance라 한다.
TCP Reno는 timeout(정해진 시간 내에 ACK가 오지 않음)일 땐 Tahoe와 동일하게 동작하지만, fast retransmit(=timeout 전 중복 ACK가 3개 도착) 발생 시 congestion이 덜 심각하다고(=다른 패킷은 전송되기에 전송 자체는 이루어지고 있다는 의미) 판단하여 window size를 현재 size의 절반으로 줄이고 이후 dup ACK을 받지 않을때까지 지속되다가, 새로운 ACK을 받으면 window size를 1씩 증가시키는 "Fast recovery"가 수행된다.
TCP New Reno는 패킷 loss (dup ack)가 연속으로 발생하면 window size를 계속 줄이는 걸 방지하고자 fast recovery가 진행중일 때, 이전에 보냈던 ACK가 모두 도착하기 전까지 fast recovery 상태를 유지(window size 절반)하며 이때 발생하는 loss에 대해선 window size를 줄이지 않는 방법이다.
TCP Throughput and Fairness
TCP Throughput
TCP Throughput은 loss가 발생하는 window size를 W라 할때, slow start를 무시하면 average가 3/4*W가 된다.
따라서 avg TCP throughput은 3/4 * W/RTT bytes/s 다.
TCP 전송 속도를 늘리기 위한 방법으로는 TCP cubic 알고리즘이 있다. loss가 발생할 때의 Window size를 Wmax라 하자. TCP cubic은 loss 후 fast recovery로 Window size를 절반으로 줄인 후, 처음엔 window size를 급격히 늘리고 Wmax에 가까워질수록 천천히 증가하도록 만들었다. 자세한 수식은 아래와 같다.
TCP Fairness
TCP Fairness의 목적은 K개의 TCP session이 bandwidth R의 bottleneck link를 공유할 때, 각각이 R/K의 속도를 가지게끔 하는 것이다. 이때 MSS(Maximum Segment Size)와 RTT(Round Trip Time)이 같다고 가정해보자.
대역폭 R을 x축(connection 1)과 y축(connectino 2)이 가질 때, Full bandwidth utilization line과 Equal bandwidth share line의 교차점이 Performance와 Fairness를 모두 만족시키는 지점일 것인데, A에서 throughput이 시작한다고 했을 때 TCP congestion avoidance의 결과로 cwnd가 늘어날 것이고, 그 결과 B까지 bandwidth가 커지다가 loss가 발생하게 된다.
이 경우 cwnd가 반으로 줄며 bandwidth가 C로 줄어들고, 다시 congestion avoidance가 발생하며 D로 늘어날 것이다. 이 과정을 반복하며 각 TCP connection은 Fairness를 만족시키는 지점을 향해 수렴해 나갈 것이다.
하지만 현실에서는 RTT가 작은 세션의 대역폭이 더 빠르게 비워지므로 대역폭을 더 점유할 수 있고, 따라서 RTT가 작을수록 Throughput이 높아진다.
UDP의 경우 congestion control을 하지 않기에 loss tolerate하게 constant rate로 packet을 보낸다.
TCP의 경우 웹 브라우저처럼 어플리케이션이 다중 병렬 연결을 사용할 때 병렬 연결된 양이 많을수록 그에 비례하여 많은 bandwidth를 차지한다.