요약

  • RFC 3479는 보호된 LDP 동작에 세션별 시퀀스 번호와 누적 ACK 경계선을 부여하여, 두 피어가 TCP 연결이 끊어지기 전에 무엇이 영구 저장되었는지 확인할 수 있게 했다.
  • 재접속 시 불확실한 접미부가 재전송되고, 체크포인트는 영구 저장된 접두부를 플러시했으며, 한쪽 경계에서 양방향을 동시에 멈추려면 세 개의 메시지로 이루어진 Cork 교환이 필요했다.

신뢰할 수 있는 TCP 스트림은 단순히 바이트를 전송하는 것 이상의 역할을 LDP를 위해 해왔다. 스트림의 연속성 덕분에 각 피어는 레이블 동작이 순서대로 도착한다고 가정할 수 있었다. 제어 평면 전환 중에 그 스트림이 끊어지면, 새 연결만으로는 어떤 이전 메시지가 장애 지점을 넘어갔는지, 어떤 것이 처리되었는지, 어떤 것이 영구 저장소에 도달했는지 알 수 없었다. RFC 3479는 그 불확실성을 장부(ledger) 문제로 다루었다.

이 문서는 먼저 그 장부의 범위를 협상했다. FT Session TLV의 S 비트는 선택된 레이블 동작에 대해 시퀀스 번호 기반 보호를 활성화했다. A 비트는 모든 레이블에 대해 이를 요구할 수 있었다. C 비트는 체크포인팅을 선택했으며 S 없이도 동작할 수 있었다. 이러한 선택은 외형적인 기능이 아니었다. 어떤 메시지가 복구 가능한 이력에 들어가는지, 따라서 이후 ACK가 어떤 결론을 뒷받침할 수 있는지를 결정했다.

시퀀스 번호가 부여된 FT 레이블의 경우, 송신자는 관련된 각 LDP 메시지에 FT Protection TLV를 붙이고 해당 세션에 국한된 시퀀스 번호를 증가시켰다. 수신자는 FT ACK를 반환하기 전에 메시지 자체 또는 그 처리 결과로 파생된 상태를 보존해야 했다. 표준은 표현 방식을 의도적으로 열어두었다. 한 구현체는 메시지를 보관할 수 있고, 다른 구현체는 그 결과로 나온 레이블 상태를 저장할 수 있다. 영구 저장은 요구되었지만 동일한 저장소 구조는 요구되지 않았다.

ACK는 누적 방식이었다. 동작 1부터 4까지를 보존한 피어는 네 개의 개별 응답을 내보내는 대신 한 번에 4를 확인할 수 있었다. 그 숫자는 경계선이 되었다: 그 이하의 모든 것은 보존된 접두부 안에 있고, 그 위의 것은 어떤 것도 포함되지 않는다. ACK는 지연되고 누적될 수 있었으며, 중복은 허용되었지만 순서가 뒤바뀐 ACK는 접두부의 의미를 파괴하기 때문에 금지되었다.

해결되지 않은 접미부는 연결이 끊어졌을 때에만 의미를 가졌다. 교체 세션에서 각 피어는 자신이 보존한 마지막 FT 시퀀스를 알린다. 그 지점 이후에 전송된 메시지는 다시 발행되어 처음 수신된 것처럼 처리된다. 복구는 사라진 TCP 전송 기록을 재현하는 것이 아니었다. 두 영구 저장 경계선을 비교하고 그 운명이 여전히 불확실한 동작들을 재구성하는 것이었다.

RFC 3479는 좁은 범위의 압축을 허용했다. Label Request와 그에 대응하는 Label Abort, 또는 Label Mapping과 그에 대응하는 Label Withdraw는 재전송이 필요 없는 순영(순효과 0) 쌍을 이룰 수 있었다. 그러나 이 최적화에는 근거 경계가 있었다. 장애 이전에 이미 전송된 동작은 로컬 큐에 그 반대 동작이 있다는 이유만으로 합쳐질 수 없었다. 송신자는 그 절반이 끊어진 세션을 넘어갔는지 알기 위해 먼저 피어의 ACK를 필요로 했다.

주소 상태도 같은 이유로 보호된 이력에 포함되었다. 보호된 Address 및 Address Withdraw 동작이 없으면, 재접속 후 각 측이 어떤 주소가 여전히 유효한지에 대해 서로 다른 믿음을 가질 수 있었다. 새로 무효화된 주소는 복구 후 명시적으로 철회되어야 했다. 양쪽 피어 모두 보존된 상태를 주장하지 않으면 이전 주소는 철회된 것으로 간주되어 재구축되었다.

체크포인팅은 세분성을 바꾸었다. FT Protection TLV를 실은 Keepalive는 수신자에게 그 이전의 모든 체크포인트 가능 메시지를 보존하고 확인 응답을 플러시하도록 요청했다. C가 설정되고 S가 해제된 경우, 일반 메시지는 각각 활성 시퀀스 번호를 실지 않았고 체크포인트가 그 집합적 이력을 동기화했다. S가 활성화된 경우, 체크포인트는 시퀀스 보호 집합과 주소에 적용되었다. 따라서 같은 단어가 협상된 플래그에 따라 서로 다른 집단을 포괄했다.

하나의 체크포인트는 여전히 한 방향으로만 진행되었다. 제어된 종료에는 더 강한 것이 필요했다. 멈추려는 노드도 피어가 보낸 모든 것을 자신이 보존했음을 증명해야 했기 때문이다. FT Cork TLV가 세 방향 교환을 시작했다. 한 피어가 정지를 요청하고, 다른 피어는 이전 작업을 마치고 보존하면서 새 레이블 또는 주소 메시지를 중단했으며, 마지막 응답이 반대 방향을 닫았다. 그제서야 양쪽 장부가 하나의 정지 경계를 공유했다.

이 프로토콜은 실패에 대해 정직했다. 상태를 보존하거나 동작을 유예할 수 없는 피어는 FT Reconnect Flag를 해제해야 했다. 어느 한 쪽이라도 그렇게 하면, 양쪽 모두 연속성을 날조하는 대신 이전 세션의 FT 상태를 해제했다. 레이블 공간 경계 같은 세션 매개변수가 변경되면, 이전 동작이 더 이상 같은 합법적 의미를 가질 수 없으므로 단순 복원이 차단되었다.

IESG Note는 논설 부스러기가 아니라 필수적인 역사다. 이 문서는 재시도 및 타이머 지침이 불충분하며, 조기 장애 전환이 실제 우려라고 경고했고, 이 설계가 미래의 TCP 내결한성에 대한 일반 모델이 되어서는 안 된다고 말했다. 이 RFC는 조정 문법을 정의했을 뿐, 보편적으로 안전한 운영 지점을 제공하지는 않았다.

이는 이미 다른 곳에서 다뤄진 인접 질문과는 구별된다. RFC 3478의 graceful restart는 제어 의미가 돌아오는 동안 오래된 포워딩을 유지했다. RFC 3612는 보존된 상태와 피어 확인 응답이 포워딩의 진실을 증명하지 못하는 이유를 다루었다. RFC 3479의 특별한 기여는 더 좁았다: 중단된 제어 전송 기록의 불확실한 부분을 열거 가능하고 재전송 가능하며, 지정된 쌍에 한해 안전하게 합칠 수 있게 만든 것이다.

Lu Heng의 현실 계층 방법은 그 기여를 감사 순서로 바꾼다. 양쪽 세션 식별자, 협상된 S, A, C, R 플래그, 변경되지 않은 매개변수를 보존한다. 각 피어에 대해 전송된 시퀀스 번호, 로컬로 보존된 동작, 실제 전송된 ACK를 재구성한다. 장애 순간을 고정한다. 재접속 시 알려진 영구 저장 경계선을 비교한 뒤, 모든 재전송, 모든 유예된 동작, 모든 순영 생략을 대조한다.

같은 규율이 매력적이지만 거짓인 지름길을 막는다. ACK는 이후의 모든 작업이 살아남았다는 주장이 아니다. 체크포인트는 그 협상된 집단이 무엇인지 알기 전까지는 완전한 스냅샷이 아니다. Cork 요청은 세 개의 메시지가 모두 완료되기 전까지는 정지 상태가 아니다. 그리고 이러한 제어 영수증 어느 것도 패킷이 응용에 도달했는지를 말해주지 않는다. 그것들은 더 앞선 질문에 답한다: 두 피어가 공유함을 증명할 수 있는 동작은 무엇인가?

바로 그 질문이 RFC 3479의 인터넷 역사상 위치를 설명한다. 이 문서는 실패 복구를 기억상실에 뒤따르는 낙관이 아니라, 두 부분 기억 사이의 분쟁으로 다루었다. 시퀀스 번호가 분쟁을 한정했고, ACK가 공통 과거를 특정했으며, 재전송이 불확실한 접미부를 재건했고, Cork 핸드셰이크가 공유된 마침표를 만들었다. TCP 세션은 죽었다; 동작 장부는 조정되어야 했다.

출처