요약

  • TIME-WAIT는 이전 접속이 남긴 지연 세그먼트로부터 미래의 접속 인스턴스를 보호합니다; 재전송 타이머도, 사용자 전달 기한도 아닙니다.
  • RFC 1337은 이전의 수용 불가한 세그먼트가 ACK를 유발하고, 그 ACK를 피어가 RST로 반사하며, 리셋이 TIME-WAIT를 조기에 삭제하는 세 단계 실패 연쇄를 보였습니다.
  • 이 문서는 TIME-WAIT에서 리셋을 무시하는 방안을 제안했지만 Informational 문서였고 실제 환경 테스트를 요청했습니다; 현재 TCP 기본 명세는 검증 후 RST 시 종료하는 동작을 여전히 기술합니다.
  • RFC 6191은 높은 접속률에 대해 다른 경로를 택했습니다: 시퀀스 번호와 타임스탬프 증거가 더 새로운 인스턴스를 지지할 때에만 특정 새 SYN을 조기에 수용합니다.

유휴 잔해가 아닌 안전 상태

TCP 접속은 두 종단 주소와 포트 쌍으로 식별됩니다. 이 네 값은 재사용될 수 있습니다. 그러나 패킷은 응용이 소켓을 닫았다고 해서 사라지지 않습니다. 이전 접속의 지연된 중복 패킷은 동일한 식별 튜플을 가진 나중 접속과 마주칠 만큼 오래 네트워크에 남을 수 있습니다.

TIME-WAIT는 그 모호성에 대한 TCP의 방어 수단 중 하나입니다. 능동 종료자는 종료 핸드셰이크 이후에도 전송 제어 블록을 유지하며, 보통 최대 세그먼트 수명의 두 배 동안 유지합니다. 이 구간은 동일한 접속 식별이 완전히 자유로워지기 전에 오래된 중복 패킷이 소멸할 시간을 줍니다. RFC 9293은 그 목적을 직접 표현합니다: TIME-WAIT는 피어가 최종 확인 응답을 받았음을 보장하는 데 도움이 되고, 한 인스턴스의 지연 세그먼트가 다음 인스턴스에 영향을 주지 못하게 합니다.

바쁜 서버에서 이 유지된 상태는 낭비처럼 보일 수 있습니다. RFC 1337의 통찰은 그것이 또한 취약하다는 것이었습니다. 상태 기계 자체가 구간이 만료되기 전에 그 상태를 제거하도록 유도될 수 있었습니다.

세 가지 평범한 응답이 하나의 위험한 연쇄를 이룬다

암살 예는 정상 종료 이후에 시작됩니다. 종단 A는 TIME-WAIT에 들어갔고, 종단 B는 이미 대응하는 접속 상태를 폐기했습니다.

그때 오래된 데이터 또는 ACK 세그먼트가 A에 도달합니다. 그 시퀀스 번호는 A의 수용 가능한 창 밖일 수 있고, 타임스탬프는 순환 시퀀스 보호 검사에 실패할 수 있습니다. A는 수용 불가한 비-리셋 세그먼트에 대한 평범한 규칙을 따라 현재 시퀀스 기대치를 담은 확인 응답을 보냅니다.

B는 그 확인 응답을 받지만 튜플에 일치하는 접속이 없습니다. CLOSED 상태에서 수신되는 비-리셋 세그먼트는 TCP가 리셋을 보내게 합니다. 리셋은 A로 돌아옵니다. RFC 1337이 분석한 리셋 처리 규칙에 따라 A는 그것을 수용하고 제어 블록을 삭제하며 TIME-WAIT를 조기에 벗어납니다.

이 연쇄의 어느 단계도 악의적인 발신자를 요구하지 않습니다. 지연된 중복 패킷, 여전히 존재하는 안전 상태가 생성한 ACK, 상태가 없는 피어가 생성한 리셋은 각각 이해 가능한 국소 동작입니다. 그 조합이 구간의 목적을 무너뜨립니다. RFC 1337은 그 결과를 “TIME-WAIT 암살”이라 명명했습니다.

암살이 드러내는 것

TIME-WAIT를 삭제하는 것은 네트워크에 오래된 패킷이 없다는 증명이 아닙니다. 리셋이 도착해 수용되었다는 사실만을 증명합니다. 튜플이 재사용되면 오래된 데이터 세그먼트가 새 접속의 수신 공간 안에 들어올 수 있고, 오래된 확인 응답이 새 발신자를 잘못 진전시킬 수 있으며, 중복 확인 응답이 혼잡 동작을 흔들 수 있습니다. RFC 1337은 훼손하는 패킷이 TIME-WAIT를 죽인 패킷과 같을 필요가 없기 때문에 이를 여러 위험으로 나누었습니다.

이 구분이 중요합니다. 암살자는 상태를 제거하는 리셋입니다. 이후의 위험은 네트워크에 남아 있던 다른 중복 패킷으로 인해 발생할 수 있습니다. 조기 삭제를 안전의 증거로 다루는 것은 원인과 증명을 뒤집는 것입니다.

단순한 해법과 그 한계

RFC 1337이 선호하는 단기 해법인 F1은 단순했습니다: TIME-WAIT 동안에는 RST 세그먼트를 무시한다. 가정된 최대 세그먼트 수명이 실제로 강제된다면, 구간 전체 동안 상태를 유지하는 것으로 문서가 기술한 세 가지 위험을 피할 수 있습니다. 이 논증은 구조적입니다. TIME-WAIT의 한 목적이 오래된 중복 패킷이 만료되게 하는 것이라면, 도착하는 리셋이 그 보호를 잘라내서는 안 됩니다.

역사적 단서 역시 똑같이 중요합니다. RFC 1337은 Informational 문서입니다. F1을 가장 단순하고 가장 좋은 단기 답이라고 불렀지만, 예상치 못한 효과를 발견하려면 장기간의 실제 환경 테스트가 바람직하다고도 말했습니다. 이 제안을 모든 스택에 대한 보편적 진술로 만들지 않았습니다.

현재 통합된 TCP 명세인 RFC 9293은 다른 기본 규칙을 유지합니다. 동기화된 상태의 처리에서, 시퀀스 검증 이후 TIME-WAIT의 리셋은 CLOSED로 이어지고 제어 블록을 삭제합니다. 따라서 이 메커니즘의 역사는 리셋 무시 제안이 그대로 현대의 기본 상태 기계가 되었다고 말할 수 없습니다. 기록은 위험 분석과 표준화된 처리 문구 사이의 긴장을 보존합니다.

조기 재사용에는 사라짐이 아니라 증거가 필요하다

RFC 6191은 관련된 운영상 압박을 다뤘습니다: 높은 비율의 새 접속이 여전히 TIME-WAIT에 있는 일치 튜플과 마주칠 수 있습니다. 그 알고리즘은 단순히 오래된 상태를 죽이지 않습니다. 수신 SYN 세그먼트의 처리를 바꾸고, SYN이 더 새로운 인스턴스의 증거를 지니는지 묻습니다.

이전에 타임스탬프를 사용했다면 더 큰 타임스탬프는 요청 수용을 지지할 수 있습니다. 같은 타임스탬프는 더 큰 초기 시퀀스 번호를 요구합니다. 관련 조합에서 타임스탬프가 없다면 시퀀스 번호 비교가 남은 검사를 제공합니다. 증거가 통과하지 못하면 TCP는 조용히 수신 SYN을 폐기하고 이전 인스턴스를 TIME-WAIT에 둡니다.

RFC 9293은 이 구분을 통합합니다. 능동 종료자가 2xMSL 동안 머물 것을 요구하고, 시퀀스 보호 장치가 있을 때에만 직접 재개를 허용하며, 바쁜 종단에는 타임스탬프 기반의 RFC 6191 알고리즘을 권고합니다. 보호된 재사용과 리셋 기반 삭제는 모두 TIME-WAIT가 제시하는 실질 장애를 줄일 수 있지만 동등하지 않습니다. 하나는 새 요청을 유지된 역사와 비교하고, 다른 하나는 그 역사를 버립니다.

출처