TCP Reliable Data Transfer
TCP는 혼잡한 네트워크 상황에서 데이터 송/수신의 신뢰성을 보장하기 위해 Sequence Number와 Acknowledge Number 를 이용하게 됩니다.
여기서의 핵심 아이디어는 데이터에 요청하고 해당 데이터를 정상적으로 수신했는 지 응답하는 방식이다.

조금 더 구체화해보자면, TCP Header 필드 중 Sequence Number 와 Acknowledge Number 를 이용한다.
Sequence Number: 전송된 데이터의 순서를 표기Acknowledgement Number: 정상적으로 수신한 데이터의 마지막 순서 번호

데이터를 전송할 때 데이터의 위치(Sequence Number)와 데이터(Payload)를 보내게 되고, 수신자는 이를 정상적으로 수신했다는 뜻으로 Acknowledgement Number 를 전송하게 된다. 이 때 Acknowledgement Number의 값은 다음 통신때 수신할 데이터의 위치이다. (82번째 데이터를 시작으로 8byte의 데이터를 받았기 때문에
패킷 손실에 대응하는 방법
위의 상황은 매우 이상적인 상황이다. 하지만 실제 네트워크 환경에서는 패킷의 손실이 언제든지 발생할 수 있는 상황이다. TCP에서는 패킷 손실에 다음과 같이 대응하게 된다.

송신자는 전송한 데이터에 대한 Acknowledgement Number 에 대한 timeout 이 정해져 있다. 해당 시간 동안 전송한 데이터에 대한 응답이 오지 않는다면 동일한 데이터를 다시 한번 전송하게 된다.
패킷 지연에 대응하는 방법
패킷이 timeout 시간보다 늦게 도착하는 경우가 발생할 수 있다. 송신자 측에서는 timeout이 지나게 되면 해당 패킷이 지연된 건지, 손실된 건지 알 수 있는 방법이 없다. 수신자 측에서는 중복된 패킷이 들어오는 경우에 항상 자기가 필요한 최신의 Acknowledgement Number를 전송하게 된다.

해당 방법은 수신자가 데이터의 신뢰성을 유지하는 방법일 수 있지만, 네트워크 상에서는 중복된 패킷이 송/수신되는 상황이기 때문에 낭비일 수 있다. 이러한 낭비는 어떻게 보면 네트워크 상에서의 혼잡을 의미하게 되고, 혼잡 제어를 통하여 최적화 된다.