TCP는 Network 상태에 따라 데이터 전송 속도를 높이거나 낮춘다. 이 행동은 남을 위한 것이 아닌 나 자신을 위한 것이다. (무조건적으로 전송 속도를 높여 Network가 막힌다면 모두 힘든 일이 되기에)
Network 상태에 대한 직접적인 피드백이 없기 때문에 TCP는 상대 receiver로부터의 피드백을 통해 간접적으로 Network 상태를 파악한다.
Slow Start는 파이프에 물을 한 방울씩 흘려보내는 것과 같다. (물방울 수는 2배씩 증가한다. 그러다가 threshold 지점을 만나면 증가 속도를 낮춘다.)
Additive increase는 threshold 지점을 만나 +1씩 linear하게 증가하는 것을 이른다. 이 증가는 packet loss를 감지할 때까지 이루어진다.
Multiplicative decrease는 packet loss를 감지하여 전체 속도를 1/2로 떨어뜨리는 것을 이른다.
(2배, + 1, 1/2 등의 단위는 모두 MSS이다.)
증가는 linear하게 이루어지는 반면 감소는 급격히 이루어지는 이유는 Network가 공유 자원이어서 조심해야하며, 막힌 네트워크를 빠르게 풀어야하기 때문이다.
MSS (Maximun Segment Size)
전송속도는 Congestion Window size / RTT이다.
RTT보다 Congestion Window size의 값이 더욱 자주 바뀌기 때문에 전송속도는 RTT보다 Congestion Window size의 값에 의해 좌우된다. 그리고 이 Congestion Window size 값은 Network에 의해 좌우된다.
(↪ 2배씩 증가하기 때문에 실제로는 slow 하기보다 rapid하다.)
하늘색 선은 이전 버전인 TCP Tahoe이고, 검정색 선은 이후 버전인 TCP Reno이다.
버전 업데이트가 된 이유는 다음과 같다. packet loss는 크게 두 가지 이유에 의해 발생한다. 1. timeout, 2. three duplicate ACK. 이 두 가지 경우의 Network 상황은 다르다.
TCP Reno에서는
이제 TCP Tahoe는 더이상 사용되지 않는다.
TCP Fairness
신기하게도 모든 TCP는 Network 사용을 공평하게 맞춘다.
결국 내가 Network를 어떻게 사용하느냐가 그대로 내게 돌아온다.
또한, TCP connection 끼리 공평하기 때문에 만약 TCP connection을 2개 쓴다면, 이는 Network를 2배로 사용하는 것(사용 몫이 2배가 되는 것)과 동일하다.