쓰루풋이 적당히 높은 인풋에 머무는 것이 목표
그러기 위해 계속 왔다갔다 한다.

마지막 시나리오를 제외하곤 두 개의 호스트에서 보내고 하나의 라우터를 거친다.
람다in : 데이터 보내는 속도
람다out : 쓰루풋
가장 이상적인 상황이니 람다in이 증가하면 쓰루풋이 증가하고 어느 순간 R/2이 된다. 이보다 빠르게 보낼 수는 없고 R/2보다 빠르게 보내기 시작하면 큐잉이되고 점점 딜레이가 증가한다. R/2에 가까워질 수록 딜레이가 엄청나게 증가한다.

람다in : 전과 같이 보내는 속도
람다in' : 버퍼 크기에 제한이 생기면서 발생하는 재전송량을 포함시킨 것
tcp는 신뢰성이 있으니 람다in과 람다out은 같다. 따라서 람다in'은 람다out보다 크다.
따라서 로스가 없어
로스가 없으니 보낸 만큼 도착해서 다음과 같이 생김

로스가 날 때만 재전송 즉 없는 것만 정확히 재전송하니 중복 패킷이 없다.
람다in'이 증가하면 람다out도 증가하다 어느 순간부터 꺾일 것이다.
왜냐면 보내는 양이 많아지니 큐로스가 나고 큐 로스가 나니 도착하는 양은 작아질 것이다.
이 순간부터는 람다인 - 람다아웃에 해당하는 것이 재전송에 쓰이는 대역폭이다. 많이 보낼 수록 재전송 양도 많아지니 이 영역의 넓이도 점점 커진다.

람다인 - 람다아웃에 로스 뿐만 아니라 재전송까지 들어가 이전 상황보다 더 커진다.

이전과 달리 여러 라우터가 있을 때 한 호스트에서 전송량을 늘릴 때
마지막 라우터에 로스가 나는 경우 거의 모든 대역폭을 이용하고도 실패해서 낭비가 심하다.
다른 쪽에서는 한 쪽에서 너무 많이 보내니 자원을 이용하지 못하고 계속 로스가 나면서 자신의 람다out이 뚝 떨어지게 된다.

이렇게 람다in'이 늘면서 람다out이 떨어지는 것을 정체 충돌이라 한다. 모든 호스트가 서로 늘리려고 하면 대역폭을 다 쓰면서 전달이 안 되니 모든 호스트의 그래프가 위와 같아진다.
전송 비율이 지수적으로 증가하는 tcp의 상태
비율이 지수적으로 증가하니 처음에는 느리게 증가하지만 나중에는 빠르게 증가한다.
aimd라는 방법을 사용해서 보내는 비율을 조절하는 상태
증가는 additive하게 감소는 multiplicative 하게
congestion avoidence에서 전송량을 적절히 조절하는 방법
마지막 정체가 발견되었을 때의 cwnd의 절반
전송자는 윈도우 크기를 동적으로 조절하여 혼잡을 제어한다.
혼잡을 제어하기 위해선 다음을 만족해야 한다.
마지막으로 보낸 바이트 - 마지막으로 응답받은 바이트 <= min(cwnd, rwnd)
전송량은 rtt동안 보낸 양 즉 cwnd / rtt
tcp에서는 rtt를 조절할 수는 없으니 윈도우 크기인 cwnd를 조절한다.
실제로는 각각의 애크가 올 때마다 cwnd를 증가시킨다.
예시

하나의 세그먼트를 보내고 하나의 애크를 받으면 cwnd를 증가시킴
그럼 첫 rtt에 cwnd가 1에서 2가 된다. 그리고 응답을 받았으니 윈도우 오른쪽으로 움직인다.
두번째 rtt에서 cwnd가 2가 되었고 윈도우 크기가 2이니 2개 보낸다. 첫번째 애크가 오면 3이 되고 두번째 애크가 오면 4가 된다. 그래서 두번째 rtt 후 cwnd가 2에서 4가 된다.
세번째 rtt에서 윈도우 크기가 4인데 아직 두개밖에 안 보냈으니 두개 또 보낸다. 두개 보내고 애크 2개 받으면 6되고 2개 늘어나서 또 두개 보내고 결국 애크를 다 받으면 cwnd가 8이 된다.
이렇게 숲을 보면 매 rtt마다 cwnd가 두 배가 되는 것처럼 보인다.
ssthresh는 타임아웃이 발생한 cwnd의 절반으로 설정한다. 이 전까지는 슬로우 스타트를 하며 지수적으로 증가하고 이 후에는 천천히 선형적으로 증가한다.
절반을 하는 이유는 슬로우 스타트에서는 rtt마다 2배가 늘고 이전 cwnd는 문제가 생기지 않은 cwnd이므로 문제가 없던 곳으로 돌아가기 위해서 그런 것이다.
매 rtt 마다 1mss를 증가시키고 로스가 나면 cwnd를 절반으로 줄인다.


tcp는 애크가 안 오면 타임아웃이 발생할 때까지 아무것도 안 한다. 즉 멈춰있지 않으려면 애크를 보내는 것이 중요하고 애크를 받으려면 뭘 보내야 한다. 그래서 1mss만큼 올려 애크를 받아서 멈춰있는 상태를 피하는 것이다.

w를 로스가 발생했을 때 윈도우의 크기라 하면 tcp 전송자의 전송량은 w와 w/2를 왔다 갔다 한다.
따라서 rtt당 평균 3/4w 만큼 보내므로 평균적인 쓰루풋은
3w/4rtt bytes/sec
가 된다.


tcp가 만약 공평하다면 두 커넥션이 있을 때 쓰루풋이 동일하여 가운데에 있어야 한다.
만약 1이 먼저 연결되고 2가 나중에 연결되어 2가 느린 상태일 때면 1쪽에 치우친 상태이다.
이후 선형적을 증가하다 최대치를 넘어가면 로스가 난다. 따라서 양쪽의 전송률을 모두 절반으로 줄인다. 그럼 그림과 같이 왼쪽 아래로 이동한다.
이를 반복하면 결국 한 가운데로 오게 되고 따라서 aimd는 공정하다.

하지만 라우터가 이 기능을 제공하지 않을 수도 있고 종단 간 법칙에 어긋난다. 또 혼잡 제어를 ip가 하지만 원래는 전송 계층에서 하는게 맞다. 그래서 계층 구조에 조금 어긋난다.