TCP는 송신자와 수신자의 버퍼를 오버플로우 시키는 것을 방지하기 위해 애플리케이션에게 흐름 제어 서비스(flow-control service) 를 제공한다. 수신자의 버퍼 상태에 따라 송신자가 보내는 속도를 조절한다.
TCP는 송신자가 수신 윈도(receive window)변수를 유지하여 흐름 제어를 제공한다. 수신 윈도는 수신 측에서 가용한 버퍼 공간이 얼마나 되는지를 송신자에게 알려주는 데 사용된다.
만약 수신 측의 receive buffer에 공간이 없고, 수신자는 송신 측에 새로 보낼 데이터가 더이상 없을 때, 송신자는 수신 측의 receive buffer에 대한 상황을 더 이상 알 수 없다.
이를 위하여 송신자는 주기적으로 1Byte 세그먼트를 보내본다. 만약 수신자가 세그먼트를 받는다면 ACK가 수신자로부터 올 것이고, buffer 상황도 알 수 있게 된다.
송신, 수신측 응용 프로그램이 데이터 처리 단위가 작거나 저속일 때, 최소 IP 및 TCP의 헤더가 각각 20 바이트 씩 총 40 바이트가 부가적으로 붙여지며 이는 네트워크의 자원을 낭비하는 결과가 된다.
Sender:Nagle's algorithm
1. 송신자는 1Byte라도 보낼 데이터가 있다면 송신한다.
2. 세그먼트를 만들고, 데이터를 채우면서 기다린다.
2-1. 데이터를 Maximum size(536Byte)만큼 채웠으면 보낸다.
2-2. 방금 보낸 세그먼트에 대한 ACK를 받았다면 데이터를 덜 채웠어도 보낸다.
Receiver
3-way handshake
다음 단계들이 완료되면, 클라이언트와 서버 호스트들은 각각 서로에게 데이터를 포함하는 세그먼트를 보낼 수 있다.
TCP 연결종료
1. 클라이언트가 FINbit = 1 로 설정한 뒤 세그먼트를 보낸다.
2. 서버는 이 세그먼트를 수신하면, 서버는 클라이언트에게 확인응답 세그먼트를 보낸다. 그 후 FIN 비트가 1로 설정된 자신의 종료 세그먼트를 송신하다.
3. 마지막으로 클라이언트는 서버의 종료 세그먼트에 확인응답을 한다. 이 시점에서 두 호스트의 모든 자원 할당은 해제된다. 확인응답이 유실될 경우를 대비해서 클라이언트는 대기시간을 가진 후에 자원 할당을 해제한다.