요약
- RFC 3977은 NNTP 클라이언트에게
NEWNEWS를 발행하기 전에 서버 시각을 확인하도록 하면서, 이전 세션에서 저장해 둔 타임스탬프를 기준으로 조회하도록 지시한다. - 이 순서는 의도적으로 연속 검색 사이를 겹치게 한다. Message-ID가 다시 반환될 수 있지만, 식별 가능한 중복은 두 체크포인트 사이에 낙오된 기사보다 안전하다.
- 그 결과는 여전히 경계가 있는 근거다. 서버 로컬 도착 시각, 선택된 뉴스그룹, 명령 사용 가능 여부가 이 목록이 말할 수 있는 범위를 정한다.
여덟 초의 공백
클라이언트가 서버 시계가 12시를 가리킬 때 폴링을 시작한다고 상상해 보자. 클라이언트는 어제 이후의 모든 것을 요청한다. 검색과 응답에는 8초가 걸린다. 그 8초 사이에 새 기사가 서버에 도착한다.
클라이언트가 응답을 기다린 뒤 12시 8초를 다음 시작점으로 저장한다면, 새 기사는 두 관찰 사이에서 사라질 수 있다. 첫 번째 검색은 기사가 도착하기 전에 이미 스냅샷을 찍었을 수 있다. 다음 검색은 12시 8초보다 오래된 것을 제외한다. 어느 쪽 응답에도 이 누락을 알리는 내용은 없다. 클라이언트는 스스로 볼 수 없는 구멍이 있는 깨끗한 장부를 만들어 낸 것이다.
안전한 대안은 어수선해 보인다. 서버 시계를 먼저 읽고 그 값을 보관한다. 이전 접속에서 저장된 체크포인트부터 검색을 실행한다. 작업이 끝난 뒤에야 클라이언트는 검색 전에 확보한 값으로 이전 체크포인트를 교체한다. 다음 폴링은 전체 구간을 다시 덮을 만큼 일찍 시작된다. 식별자 하나가 두 번 나타날 수 있다. 그것은 인식할 수 있다. 침묵은 그렇지 않다.
전달이 아니라 발견을 위한 명령
RFC 977은 1986년NEWNEWS를 도입했다. 클라이언트는 하나 이상의 뉴스그룹 패턴과 날짜·시각을 제공했다. 서버는 그 경계 이후 해당 그룹에 게시되거나 수신된 기사의 Message-ID를 한 줄에 하나씩 반환했다. 와일드카드로 검색 범위를 넓힐 수 있었고, 앞에 느낌표를 두면 한 갈래를 제외할 수 있었으며, 빈 목록도 여전히 유효한 답이었다.
이 구조가 중요하다.NEWNEWS는 기사 자체를 보내지 않았다. 클라이언트가 무엇을 내려받을지 판단할 수 있도록 식별자를 제공했다. 따라서 이 프로토콜은 발견과 보관을 분리했다. 어떤 식별자가 조건에 맞다는 사실을 안다고 해서, 그 본문이 내려받아졌거나 보존되어 있거나 무기한 남아 있다는 증명이 되지 않는다.
최초 사양에는 선택적 배포(distribution) 선택자도 있었다. 2000년까지,RFC 2980은 구현체들이 이 선택자의 의미에 대해 서로 달리 이해하고 있음을 기록했다. 같은 문서는 관리자들이NEWNEWS를 흔히 비활성화한다고 경고했다. 유용한 역사적 메커니즘은 균일한 배포를 가정할 허가가 아니었다.
타임스탬프는 서버의 것이었다
“새로운”에서 결정적인 단어는 저자가 적어 넣은 날짜가 아니다.RFC 3977은 세 가지 검색 키를 설명한다. 전역적으로 유일한 Message-ID, 서버 로컬의 그룹별 기사 번호, 그리고 기사가 해당 서버에 도착할 때 부여되는 도착 타임스탬프가 그것이다.NEWNEWS는 세 번째를 사용한다.
이로 인해 저자가 적은 날짜가 어떤 항목이 폴링에 포함되는지 결정하지 못한다. 늦게 도착했거나 날짜가 잘못된 기사도 이 서버에는 여전히 새로운 것일 수 있다. 또한 같은 기사에 대해 두 서버가 서로 다른 도착 시각을 각자 진실하게 부여할 수도 있다는 뜻이다. 이 명령이 보고하는 것은 상황이 놓인 역사다. 이 서버가, 이 선택된 그룹 안에서, 이 경계 이후에 무엇을 수신했는가.
시계의 소유권은 근거의 소유권을 따라간다. RFC 2980은DATE를 서버가 바라보는 UTC로 표준화했다. RFC 3977은 이 관계를 더 좁혔다.DATE는 기사 도착 시각과 그룹 생성 시각을 판정하는 것과 동일한 시계를 사용해야 한다.DATE는 NTP의 대체물이 아니다. 클라이언트가 자신의 체크포인트를, 서버가 나중에 그것을 평가할 좌표계에 놓아 두는 방법이다.
묻기 전에 저장하라
RFC 3977은 보기 드물게 구체적인 절차를 제시한다. 이후 세션에서 클라이언트는 먼저DATE를 발행하여 반환값을 임시 저장소에 보관한다. 다음으로 이전 세션에서 저장된 타임스탬프를 사용해NEWNEWS를 발행한다. 그런 다음 임시 저장소에 이미 확보해 둔 값으로 저장된 타임스탬프를 덮어쓴다.
이 순서 자체가 알고리즘이다. 조회 전에 시계를 기록하면, 선택과 체크포인트 전진 사이의 경합이 닫힌다. 새 체크포인트가 확정되기 전에 충돌이 발생하면 단지 더 오래된 구간이 다시 조회될 뿐이다. 응답이 늦으면 공백이 열리는 대신 겹침이 넓어진다.
사양은 심지어 사소한 오차를 흡수하기 위해 타임스탬프를 2~3분 뒤로 옮기는 것까지 허용한다. 그 예시에서는 연속된 두 세션에서 같은 Message-ID 하나가 반환된다. 이 반복은 손상으로 제시되지 않는다. 안전 여유의 눈에 보이는 비용이다.
하나의 응답 안에서 중복이 생길 수도 있다. RFC 3977은 응답 순서에 정의된 의미가 없고, 같은 세션 안에서 달라질 수 있으며, 같은 Message-ID가 두 번 이상 포함될 수 있다고 규정한다. 여러 번 나타나는 것은 한 번 나타나는 것과 같은 의미를 갖는다. 따라서 클라이언트는 위치 기반 추론이 아니라 집합과 같은 방식의 정합성 처리가 필요하다.
흔적을 남기는 실패의 선택
겹침이 모든 실패를 무해하게 만들지는 않는다. 클라이언트는 체크포인트를 내구적으로 보존하고, 폴링이 끝날 때까지 이전 값을 유지하며, 반복된 발견을 기사의 반복 게시와 혼동하지 않으면서 식별자를 중복 제거해야 한다. 그룹 패턴은 정확해야 한다.NEWNEWS가 광고되지 않는다면 클라이언트는 다른 방법이 필요하다. 서버의 보고 가능한 역사 밖에 이미 있는 자료는 타임스탬프를 뒤로 돌려서 소환할 수 없다.
하지만 이 설계는 하나의 강한 선택을 한다. 중복에는 이름이 있다. 기록하고, 비교하고, 하나로 합칠 수 있다. 반면 체크포인트를 너무 늦게 전진시켜 만든 공백에는 클라이언트 기록에 대응하는 어떤 대상도 존재하지 않는다. 조용한 구간과 똑같이 보일 수 있다.
IANA NNTP 파라미터 레지스트리는 이제NEWNEWS를, 이 명령이 사용 가능함을 선언하는 기능으로 기록한다. 레지스트리가 증명하는 것은 표준 이름과 참조이지, 특정 서버가 그것을 활성화한다는 사실이 아니다. 기능 발견, 그룹 범위, 시계 출처, 체크포인트 상태는 모두 근거 사슬의 일부로 남는다.
체크포인트 안에 담긴 역사
점진적 시스템은 흔히 커서가 단지 “지금 어디쯤 왔는지”를 표시하는 것처럼 설명된다.NEWNEWS는 더 신중한 진실을 보여준다. 체크포인트는 어느 구간이 충분히 완전히 관찰되어 두고 떠날 수 있는지에 대한 주장이다. 그 위치는 불확실성이 반복 작업으로 나타날지, 감지할 수 없는 부재로 나타날지를 결정한다.
NNTP는 복구 가능한 불편을 택했다. 검색 전에 시계를 읽고, 응답이 오는 동안 이전 체크포인트를 유지하며, 다음 검색이 겹치도록 했다. 이 프로토콜은 불확실성을 제거하지 않았다. 불확실성이 식별자 하나를 남기도록 배치했다.
출처
회원 브리핑
프로필 심층 컨텍스트
올바른 멤버십 등급으로 로그인하면 전체 브리핑과 출처 노트를 볼 수 있습니다.
Strategic Circle 전용
Strategic Circle
모든 독자에게 공개됩니다. 가입 후 로그인하면 프로필 브리핑를 열람할 수 있습니다.
Strategic Circle 가입하기Leadership Alliance 전용
Leadership Alliance
자격을 갖춘 IP 자산 소유자 및 운영진을 위한 콘텐츠입니다. 로그인하면 Leadership Alliance 브리핑을 열람할 수 있습니다.
Leadership Alliance 가입하기





