일반적인 오해는 TCP가 데이터 전송을 보장한다는 것입니다. TCP가 실제로 보장하는 것은 수신 호스트의 TCP 스택에 데이터를 전달하거나 전송 응용 프로그램에 오류를 보고한다는 것입니다. 안타깝게도 오류 보고서는 실제로 전달된 데이터의 양을 나타내지 않습니다. 수신 TCP 스택과 수신 응용 프로그램 사이에도 상당한 차이가 있습니다.
두 가지 기본 오류 시나리오가 있습니다. 첫 번째에서 송신 TCP 스택은 전송하는 데이터에 대한 TCP 승인을 받지 못합니다. 이 시나리오에서는 전송 응용 프로그램이 보내기를 계속 호출하여 TCP 스택의 보내기 버퍼에 더 많은 데이터를 넣을 수 있습니다. TCP 스택이 전송 시간을 내면 전송 응용 프로그램에서 호출되는 다음 송신(또는 수신)이 ETIMEDOUT 오류를 나타냅니다. 응용 프로그램은 이제 문제가 있다는 것을 알고 있지만 얼마나 많은 데이터가 성공적으로 전송되었는지 전혀 알지 못합니다. 성공은 전송 TCP 스택수신 TCP 스택에서 데이터에 대한 승인을 받았다는 것을 의미합니다.
두 번째 시나리오에서 전송TCP 스택은 데이터를 전송하고 승인 대신 리셋을 받습니다. 재설정은 수신 된 TCP 스택이 소켓을 닫았거나 일부 네트워크 장치( 방화벽)가 시간 중지되었음을 나타낼 수 있습니다. 다음에 보내는 응용 프로그램이 ECONNRESET 오류를 보내거나 받을 때 표시됩니다. 이 시나리오에서는 전송 응용 프로그램이 실패한 마지막 보내기 호출의 데이터만 이라고 추론할 수 있지만 잘못된 것이라고 생각할 수 있습니다. 전송 TCP 스택은 여러 송신 호출에서 데이터를 하나의 TCP 세그먼트로 버퍼링하고 해당 세그먼트가 리셋을 트리거했거나 시리즈의 첫 번째 세그먼트에 의해 트리거된 초기화 전에 일련의 TCP 세그먼트가 보낸 보낸 사람에게 다시 도착할 수 있습니다. 모든 전송 응용 프로그램은 모든 데이터가 성공적으로 전송되지 않았다는 것입니다.
TCP(송신 또는 수신) 스택 또는 네트워크와는 아무 상관이 없는 세 번째 오류 시나리오가 있습니다. 수신 응용 프로그램에 데이터를 읽지 못하게 하는 버그가 있다고 가정합니다. 수신된 TCP 스택은 데이터를 계속 수신하고 TCP 수신 버퍼 채우기 지점까지 TCP 승인을 보냅니다. 그러나 최대 64K 바이트의 데이터(또는 TCP 창 크기 조정이 지원되는 경우 이상)일 수 있습니다. 수신 응용 프로그램을 다시 시작해야 하는 경우 TCP 수신 버퍼의 모든 데이터가 손실됩니다. 수신 TCP 스택은 수신 응용 프로그램이 종료될 때 전송 TCP 스택으로 리셋을 보내야 합니다. 다음에 닫힌 연결에 대한 세그먼트를 받을 때 재설정을 보냅니다. 전송 응용 프로그램의 관점에서 이것은 두 번째 시나리오와 유사합니다. 그러나 수신된 TCP 스택이 데이터를 인정하더라도 오류가 발생할 경우 수신 응용 프로그램이 데이터를 읽었다고 가정하는 것은 안전하지 않다는 지적입니다.
이러한 오류 시나리오에서 벗어나는 아이디어는 응용 프로그램 계층의 승인없이 전송 시간 시간 또는 재설정 오류가 수신 응용 프로그램에서 전송된 모든 데이터를 읽지 않았을 수 있음을 나타냅니다. 이러한 이유로 모든 응용 프로그램에는 응용 프로그램 계층 승인이 포함되고, 연결을 다시 설정하고, 승인되지 않은 데이터를 다시 전송하고, 손실되었을 수 있는 것이 승인이기 때문에 중복 데이터를 처리할 수 있도록 준비하는 것이 좋습니다.