요약

  • 영 윈도우 프로브는 윈도우를 여는 갱신이 유실되어 양쪽 TCP 피어가 영원히 기다리는 상황을 막습니다.
  • 퍼시스트는 전송 계층 상태를 복구 가능하게 유지하며, 기다림이 너무 큰 비용이 되는 시점은 여전히 운영체제와 애플리케이션이 결정합니다.

애플리케이션이 읽기를 멈춘 수신자를 상상해 보십시오. 버퍼가 가득 차면 TCP는 수신 윈도우 0을 광고합니다. 송신자는 이를 따르고 일반 데이터 전송을 중단합니다. 이후 애플리케이션이 버퍼를 비우면 수신자는 더 큰 윈도우를 담은 확인 응답(ACK)을 보냅니다. 그 확인 응답이 사라지면, 수신자는 자신이 새 용량을 알렸다고 믿는 반면 송신자는 여전히 용량이 없다고 믿습니다. 어느 쪽도 자연스럽게 새 데이터 세그먼트를 보낼 이유가 없습니다. 흐름 제어의 일시 정지가 지식의 실패로 변한 것입니다.

TCP의 해답은 영 윈도우 프로브입니다. 윈도우가 닫혀 있는 동안에도 송신자는 주기적으로 수신자가 응답할 만큼의 데이터를 전송하거나 재전송합니다. 그 확인 응답은 다음 기대 시퀀스 번호와 현재 수신 윈도우를 다시 진술합니다. 프로브는 버퍼 공간을 만들지 않으며, 수신자가 광고한 한계를 무시하지도 않습니다. 다만 한계가 바뀌었다는 사실을 송신자가 알 수 있는 또 한 번의 기회를 제공합니다.

이 아이디어는 TCP의 최초 명세에 이미 있었습니다. RFC 793은 윈도우가 0인 경우에도 송신 TCP가 정기적으로 재전송할 것을 요구했고, 영 윈도우 수신자는 도착하는 세그먼트를 현재 윈도우와 함께 확인 응답하도록 요구받았습니다. 문서는 그 제어 목적을 직접 설명했습니다. 윈도우를 다시 여는 사실은 신뢰 가능하게 보고되어야 한다는 것입니다. 제안된 간격은 초기 명세의 산물이었고, 지속된 메커니즘은 상태의 강제적 재진술이었습니다.

RFC 1122는 1989년에 이 요구를 더 명확히 했습니다. 확인 응답 전용 세그먼트는 그 자체로는 신뢰 가능하게 전송되지 않으므로 영 윈도우 프로브를 반드시 지원해야 했습니다. 프로브가 없으면 윈도우를 다시 여는 확인 응답이 유실될 때 연결이 영원히 멈출 수 있습니다. 호스트 요구사항 문서는 첫 프로브를 재전송 타임아웃(RTO) 주기 한 번 후에 보내고 이후 프로브 간격을 지수적으로 늘릴 것을 권고했습니다. 이를 통해 유실된 갱신을 신속히 복구하면서도 긴 일시 정지가 네트워크 주의를 소모하는 정도를 제한했습니다.

같은 문서는 중요한 경계도 드러냈습니다. 수신 TCP는 자신이 제공하는 윈도우를 무기한 닫아 둘 수 있습니다. 프로브에 계속 확인 응답하는 한, 송신자는 애플리케이션의 사용자 타임아웃 정책에 따라 연결을 열어 둔 채 허용해야 합니다. 고전적인 예는 악의적이 아니라 소박했습니다. 프린터에 용지가 떨어지면 프린터 데몬이 데이터 소비를 멈출 수 있다는 것입니다. 전송 계층은 외부 문제가 해결될 때까지 연결을 보존할 수 있었고, 버퍼 공간 부족을 피어 실패의 증거로 오해하지 않았습니다.

이 송신자 상태는 흔히 퍼시스트(persist) 조건으로 알려지게 되었습니다. RFC 6429는 2011년에 이를 다시 검토했습니다. 프로토콜이 무기한 기다릴 수 있다는 것은 메모리, 대기 중인 응답 데이터, 연결 상태 역시 무기한 붙잡아 둘 수 있음을 의미하기 때문입니다. 피어는 영 윈도우를 광고하면서 프로브에 계속 확인 응답함으로써, 응용 진행 없이 자원을 책임져야 하는 바쁜 송신자를 남길 수 있습니다. 이 명확화는 퍼시스트를 프로토콜이 정한 기한으로 대체하지 않았습니다. 대신 운영체제와 애플리케이션이 여전히 일반적인 정책으로 자원을 회수하거나 그런 연결을 닫을 수 있다고 밝혔습니다.

RFC 9293은 이 체계를 통합된 현재 TCP 명세로 옮겼습니다. 영 윈도우 프로브는 여전히 필수입니다. 수신자는 여전히 다음 기대 시퀀스 번호와 현재 윈도우로 프로브에 응답하며, 송신자는 RTO 간격 후에 시작해 이후 간격을 지수적으로 늘려야 합니다. 현대 명세는 자원 관리 단서도 그대로 유지합니다. 살아남은 것은 모든 정책 아래 영원히 기다리겠다는 약속이 아니라, 연결이 유지되는 동안 흐름 제어 상태는 반드시 복구 가능하게 남아 있어야 한다는 규칙이었습니다.

그 결과 이 메커니즘은 신뢰할 수 없는 제어 갱신을 반복 가능한 관찰로 바꿉니다. 윈도우 광고는 유실될 수 있지만, 송신자는 침묵만으로 영구적인 영(0)을 추론할 필요가 없습니다. 수신자의 현재 상태에 대해 시퀀스 공간과 일치하는 또 하나의 진술을 끌어낼 수 있습니다. 이것은 프로토콜 근거이며, 엔드포인트 인증도 아니고 수신 애플리케이션이 건강하다는 증거도 아닙니다.