요약

  • TCP 킵얼라이브는 조용한 상대가 전송 계층에서 응답할 수 있는지를 묻는 메커니즘이며, 상대 애플리케이션이 건강하다는 것을 증명할 수 없습니다.
  • 유휴 연결의 침묵에는 여러 가능한 원인이 있기 때문에, 이 메커니즘은 선택 사양이고 설정 가능하며 기본값이 꺼짐으로 남았습니다.
  • 응답 한 번의 부재는 죽음을 입증할 수 없고, 중간 장비의 메모리, 사용자 타임아웃, 에너지 비용 때문에 보편적인 프로브 간격은 안전할 수 없습니다.

신뢰성은 아무것도 보내지 않은 지점에서 멈췄다

RFC 793은 데이터가 존재할 때 TCP에 명확한 책임을 부여했습니다. 바이트는 시퀀스 공간에 들어가고, 승인(ACK)이 앞서 나가며, 빠진 데이터는 재전송을 촉발합니다. 결국 엔드포인트는 성공하거나, 리셋을 받거나, 설정된 실패 정책에 도달합니다.

유휴 연결은 다른 문제를 제시합니다. ACK를 기다리는 새 바이트도 없고, 타이머가 끊어진 경로를 드러낼 수 있는 미승인 바이트도 없습니다. 두 엔드포인트가 살아 있으면서 의도적으로 조용할 수도 있고, 한 호스트가 죽었을 수도 있으며, 케이블·경로·방화벽·주소 매핑이 사라졌을 수도 있습니다. 로컬 TCP 상태만으로는 이 모든 세계가 똑같아 보일 수 있습니다.

이것은 신뢰성 있는 전달의 결함이 아닙니다. 전달을 시도하지 않을 때 전달 근거가 말할 수 있는 것의 한계입니다.

경계 바로 뒤에서 나오는 프로브

RFC 1122는 1989년 TCP 킵얼라이브를 논쟁적인 선택 메커니즘으로 기록했습니다. 관례적인 프로브는SEG.SEQ = SND.NXT-1, 즉 송신자가 다음에 보낼 수 있는 새 바이트 바로 앞의 번호를 담습니다.

이 배치는 의도적으로 애매합니다. 수신자의 현재 허용 경계 밖에 놓여 원격 TCP가 자신이 여전히 기대하는 내용을 보여주는 ACK로 응답하게 만들어야 합니다. 프로브는 보통 데이터를 담지 않고 애플리케이션 스트림을 전진시키지도 않습니다. 1바이트 “가비지” 형태는 오류가 있는 구현과의 상호 운용을 위해서만 설정 가능하게 남았습니다.

응답은 좁은 질문에 답합니다. 어떤 사용 가능한 복귀 경로를 통해 도달한 TCP 엔드포인트가 지금 이 세그먼트를 처리했다는 것입니다. 원격 애플리케이션이 이전 작업을 소비했는지, 유효한 자격 증명을 갖고 있는지, 데이터베이스에 접근할 수 있는지, 다음 비즈니스 요청에 응답할지는 말해주지 않습니다.

선택 사양이 안전 모델의 일부였다

RFC 1122는 모든 TCP에 킵얼라이브 구현을 요구하지 않았습니다. 구현한다면 애플리케이션이 연결마다 켜거나 끌 수 있어야 하고, 기본값은 꺼짐이어야 했습니다. 유휴 간격은 설정 가능해야 하고 기본값은 최소 2시간이어야 했습니다.

이런 제약은 전송 계층 기계가 애플리케이션의 실패 의미론을 몰래 선택하는 일을 막았습니다. 터미널 세션, 라우팅 인접 관계, 데이터베이스 풀, 잠자는 센서는 거짓 종료, 느린 감지, 네트워크 트래픽, 유지 상태에 서로 다른 비용을 부과합니다. 공통 전송 계층은 바이트의 부재만으로 그 비용을 추론할 수 없습니다.

2시간은 상대가 7,200초에 죽는다는 주장이 아니었습니다. 애플리케이션이 의도적으로 다른 정책을 선택하지 않는 한 요청하지 않은 프로빙은 드물어야 한다는 보수적인 기본 경계였습니다.

통합된 현대 사양인RFC 9293도 이 배열을 유지합니다. 수십 년의 배포도 선택적 프로브를 자동적인 생존 정의로 바꾸지 않았습니다.

응답 없는 한 번의 질문이 아무것도 증명하지 않는 이유

TCP는 순수 ACK를 독립적인 데이터로 신뢰성 있게 재전송하지 않습니다. 킵얼라이브 프로브가 유실될 수 있고, 그 ACK도 유실될 수 있으며, 혼잡이 어느 쪽이든 지연시킬 수 있습니다. 따라서 RFC 1122와 RFC 9293은 어떤 한 프로브에 대한 응답 실패를 죽은 연결의 증거로 다루는 것을 명시적으로 금지합니다.

이 절제가 중요한 이유는 종료가 관찰이 아니라 행동이기 때문입니다. 로컬 TCP가 상태를 해체하고 실패를 보고하면, 애플리케이션은 트랜잭션을 포기하거나, 대체를 선출하거나, 잠금을 해제하거나, 다른 연결을 열 수 있습니다. 그 결과는 추론을 유발한 패킷 유실보다 오래 지속될 수 있습니다.

반복 프로브와 설정된 임계값은 실패를 더 그럴듯하게 만들 수 있습니다. 그것도 여전히 로컬 리스크 결정입니다. 이 정도의 근거 부재 이후에는 불확실성을 유지하는 것보다 종료하는 비용이 크다는 뜻이지, 부재를 직접적인 증언으로 바꾸지는 않습니다.

사용자 타임아웃은 다른 질문에 답한다

TCP에는 이미 승인되지 않은 데이터를 위한 사용자 타임아웃 개념이 있었습니다.RFC 5482는 나중에 타임아웃 선호를 통신하기 위한 옵션을 정의했습니다. 그 질문은 “유휴 상대가 말을 했는가?”가 아니라 “이 엔드포인트가 포기하기 전까지 전송된 데이터가 얼마나 오래 미승인으로 남을 수 있는가?”입니다.

이 구분은 서로 충돌하는 시계를 막습니다. RFC 5482는 일부 킵얼라이브 정책이 일시적 중단에서 살아남을 연결을 강제 종료할 수 있음을 지적합니다. 그 사양 아래에서 킵얼라이브와 사용자 타임아웃 옵션을 결합할 때는 킵얼라이브 타이머가 채택된 사용자 타임아웃보다 길어야 합니다.

애플리케이션 데이터, 유휴 프로브, 종료 결정은 연관되어 있지만 서로 다른 근거 사슬에 속합니다. 이를 혼동하면 편의용 타이머가 더 명시적인 전달 정책을 눌러버립니다.

중간 장비가 자기만의 기억을 만들었다

초기 종단 간 논의는 연결 상태가 엔드포인트의 소유라고 가정했습니다. NAT와 상태 유지 중간 장비가 경로에 또 하나의 만료되는 장부를 끼워 넣었습니다. 유휴 TCP 연결은 양쪽 호스트에서 유효한 채 남아 있으면서, 중간 장비가 다음 패킷에 필요한 매핑을 제거할 수 있습니다.

RFC 5382는 2시간 기본값을 호환성 경계로 만들었습니다. 확립된 엔드포인트가 여전히 활성인지 판단할 수 없는 적격 NAT는 2시간 4분 전에 매핑을 버려서는 안 됩니다. 추가 간격은 전송 중인 패킷을 위한 것입니다.

이 규칙은 NAT를 연결의 소유자로 만들지 않으면서 엔드포인트의 기대를 보호합니다. 또한 보편적 준수를 증명하지도 않습니다. 운영자들은 종종 더 짧은 상태 수명을 마주하고 더 잦은 프로브로 대응합니다. 그 대응은 매핑을 보존할 수 있지만 중간 장비 세금을 내는 셈입니다. 엔드포인트는 자신의 애플리케이션 의미를 위해서가 아니라 사설 박스가 자신을 잊지 않도록 하기 위해 트래픽을 만듭니다.

배터리가 정반대 비용을 드러냈다

더 잦은 프로브는 상시 전원에 연결된 서버에서는 무해하게 들립니다. 에너지 제약 장치에서는 각 전송이 라디오를 깨우고 비싼 활성 구간을 늘일 수 있습니다.RFC 9006은 이 충돌을 담고 있습니다. 긴 TCP 기본값은 일부 중간 장비 상태를 보존하지 못할 수 있고, 짧은 킵얼라이브는 장치 배터리를 소모할 수 있습니다.

그 배분을 해결하는 전송 계층 상수는 없습니다. 애플리케이션은 느린 재접속이 허용되는지 알고, 운영자는 경로의 상태 수명을 알고, 장치는 자신의 에너지 예산을 압니다. 올바른 정책은 이 셋에 달려 있으며, 때로는 합리적인 선택이 아예 연결을 유지하지 않는 것입니다.

애플리케이션을 들을 수 없는 심장박동

전송 킵얼라이브는 흔히 심장박동으로 불리지만, 많은 실패에 대해 잘못된 계층에서 듣습니다. 커널이 ACK를 보내는 동안 서비스 프로세스가 교착 상태일 수 있습니다. 프록시가 TCP로 응답하는 동안 상위 의존성이 실패했을 수 있습니다. 원격 애플리케이션은 건강하지만 의도적으로 중단되어 있을 수도 있습니다.

애플리케이션 계층 심장박동은 더 강하고 도메인 특화된 질문을 할 수 있습니다. 서비스가 요청을 파싱하고, 자기 상태를 조회하고, 유효한 응답을 만들 수 있는가? 그 강함에는 자체 비용이 있고 여전히 모든 미래 작업을 증명할 수 없습니다. 두 메커니즘은 각각 어떤 실패를 감지하려는지 모른 채 쌓아 올려서는 안 됩니다.

킵얼라이브는 제로 윈도우 프로빙과도 다릅니다. 제로 윈도우 프로브는 상대가 명시적으로 용량 없음을 광고했을 때 수신 윈도우 재개가 유실되지 않도록 보장합니다. 킵얼라이브는 연결이 다른 의미로 유휴일 때 시작됩니다. 비슷한 작은 패킷들이 서로 다른 계약을 지킵니다.

침묵은 무죄 추정을 유지했다

오래 지속된 설계 선택은 특이한SND.NXT-1세그먼트가 아니었습니다. 전송 구현이 기본값으로 침묵을 유죄로 바꾸는 것을 거부한 점이었습니다.

받은 ACK는 최근의 TCP 도달성 근거이지 애플리케이션 건강이 아닙니다. 없는 ACK는 불확실성이지 죽음이 아닙니다. 설정된 일련의 부재는 애플리케이션이 실패 예산을 선택했기 때문에 로컬 종료를 정당화할 수 있지, 인터넷이 확실성을 공급했기 때문이 아닙니다.

킵얼라이브는 그 결과를 감당하는 엔드포인트가 결정을 유지해야 했기 때문에 선택 사양으로 남았습니다. TCP는 묻는 방법을 제공했습니다. 아무도 대답하지 않은 이유를 결정할 권한을 주장하지는 않았습니다.

출처와 증거의 한계

RFC 793은 초기 연결 및 사용자 타임아웃 기계를 확립합니다.RFC 1122는 1989년 킵얼라이브 계약을 기록합니다.RFC 5382는 NAT 타이밍 기대를 정의합니다.RFC 5482는 사용자 타임아웃을 킵얼라이브 강제 종료 정책과 분리합니다.RFC 9006은 에너지 트레이드오프를 문서화합니다.RFC 9293은 통합된 현재 규칙을 제공합니다.

이 출처들로는 모든 플랫폼 기본값, 중간 장비 타임아웃 또는 애플리케이션의 건강 의미론을 확립하지 못합니다.