sender는 receiver의 receive buffer 크기를 고려하여 데이터를 보낸다.(보내는 양이 많으면 보내는 속도가 빠르다.) 따라서 flow control은 receiver에 의해 결정된다. receive buffer 크기를 sender에게 알려주는 방법은 receiver가 sender에게 TCP segment의 header에 receive buffer size
라는 필드에 담겨 정보를 보낸다.
reciever의 receive buffer가 꽉차서 0이라는 정보를 sender에게 보내면 sender는 segment의 data부분은 비어있게 보내 응답으로 receive buffer size를 확인한다.
-> 클라이언트와 서버 사이에 이 3번의 과정이 이루어진 후에야 각각 프로세스는 send buffer, receive buffer를 가지게 된다.
3번째 handshake는 HTTP request이 포함되게 되고 그에 대한 응답으로 HTTP response까지 받게 된다.
-> timed wait로 ACK가 유실되었을 위험을 대비하여 일정 기간동안은 buffer를 유지해 응답을 받을 수 있다.
-> 현재 네트워크는 End-end congestion control를 사용한다. 두개의 TCP사이에 ack가 정상적으로 주고 받아지는지를 전송량을 조절하여 network가 정상적으로 작동하는지 유추한다.
가장 얇은 두께의 네트워크(병목현상이 발생하는 부분)에서 처리할 수 있는 데이터 보다 더 많이보내면 네트워크가 터진다. 가장 적은 양의 데이터 부터 시작해서 보내는 양을 점점 늘려나가는 방식으로 진행한다.
MSS(Maximum Segement Size) : segement 하나의 최대 사이즈
RTT(Round Trip Time) : 인터넷 상에서 송신지부터 목적지까지 패킷이 왕복하는데 걸리는 시간, 왕복 시간
-> 전송속도는 CongWin에 의해 결정된다. CongWin를 결정하는건 네트워크의 상황이다. 따라서 네트워크는 모든 데이터의 전송 속도를 결정한다.
각 패킷 유실 상황에 따라 TCP는 다르게 동작함. 1번 경우는 scratch 아예 처음 부터 시작하지만 2번 경우는 1/2 지점에서 다시 시작함.
-> 모든 TCP가 독립적으로 congestion control을 하여 네트워크를 공평하게 사용한다.