요약

  • TCP가 동일한 시퀀스 범위를 재전송할 때, 이후의 누적 ACK는 전달을 확인할 수 있지만 원본 사본과 재전송 사본 중 어느 것이 그 응답을 낳았는지는 드러내지 못합니다. 그래서 카른의 알고리즘은 이 이벤트를 일반 RTT 샘플링에서 제외합니다.
  • 새로 보낸 데이터가 정상적으로 확인되어 깨끗한 측정값을 제공할 수 있을 때까지는 지수적 백오프가 유지되며, TCP 타임스탬프는 전송 인스턴스의 모호성을 제거할 때 명시된 예외를 제공합니다.

한 TCP 세그먼트를 전송하고 재전송 타이머를 시작하는 송신자를 생각해 봅시다. 타이머가 만료되기 전에 어떤 확인 응답도 도착하지 않으므로, 송신자는 동일한 시퀀스 범위를 다시 전송합니다. 그리고 누적 ACK가 돌아옵니다. 신뢰성 측면에서 이 이벤트는 유용합니다. 수신자가 확인된 바이트에 대한 책임을 받아들였기 때문입니다. 그러나 측정 측면에서는 불완전합니다. 이 ACK는 첫 세그먼트가 단순히 지연된 것인지, 재전송이 먼저 도착한 것인지, 아니면 두 사본이 모두 도착했고 하나의 응답이 두 바이트를 모두 커버한 것인지 말해 주지 않습니다.

스톱워치를 첫 전송 시점에 시작하면 어느 한쪽의 겉보기 왕복 시간이 나오고, 재전송 시점에 시작하면 또 다른 값이 나옵니다. 네트워크 이벤트는 이 둘 중 하나를 선택할 만한 일반적인 식별자를 제공하지 않습니다. 송신자가 어느 쪽 추측이든 평활화된 왕복 시간 추정치에 넣어버리면, 복구 동작이 다음 복구 동작을 결정하는 클록을 오염시킬 수 있습니다.

RFC 793은 1981년에 이 핵심 루프를 기술했습니다. 시퀀스 번호를 실은 데이터는 재전송 큐에 들어가 타이머를 시작합니다. 확인 응답이 커버하는 데이터를 제거하고, 만료 시 가장 오래된 미확인 세그먼트를 다시 보냅니다. 이 문서의 예시적 타임아웃 절차는 번호가 매겨진 옥텟을 보낸 시점부터 그것을 커버하는 확인 응답이 도착할 때까지의 경과 시간을 측정한 뒤, 그 값을 사용해 평활화된 RTT를 갱신하고 RTO를 도출했습니다.

이 기술은 추정기를 적응형으로 만들었지만, 신뢰성 메커니즘이 한 전송을 복제하는 시점에 측정 문제를 남겨 두었습니다. 어느 사본이 수신자에 도달했든 동일한 누적 확인 번호가 동일한 바이트를 커버할 수 있습니다. 따라서 프로토콜 신호는 한 상태 전이에는 결정적이면서 다른 상태 전이에는 채택 불가능할 수 있습니다. 이 ACK는 그 바이트에 대한 전달 의무를 종결하지만, 지연 모델을 갱신하기에 충분한 출처 정보를 반드시 담고 있지는 않습니다.

1989년의RFC 1122에 이르러 이 수정은 호스트 요구사항이 되었습니다. 섹션 4.2.3.1은 호스트 TCP가 재전송 타임아웃 계산을 위해 카른의 알고리즘과 제이콥슨의 알고리즘을 “MUST implement”(반드시 구현해야 한다)라고 명시하고, 구현이 지수적 백오프를 “MUST include”(반드시 포함해야 한다)고 말합니다. 첫 문장은 SHOULD 수식어 없이 이 두 이름이 붙은 요구사항을 선언합니다. 이 문서는 두 알고리즘의 역할을 구분했습니다. 제이콥슨의 계산은 측정된 RTT 분산을 추정기에 반영했습니다. 카른의 선택 규칙은 모호한 측정값이 애초에 추정기에 들어가지 못하도록 막았습니다. 아무리 정교한 산술도 시작 시점이 인과적으로 알려지지 않은 관측값은 구원할 수 없습니다. RTO 알고리즘 지원을 SHOULD에서 MUST로 격상시켰다는 RFC 6298의 후대 서술은 일반 표준 알고리즘에 관한 것이며, RFC 1122의 이 두 명시적 문장을 권고로 바꾸지 않습니다.

같은 섹션은 동일 세그먼트에 대한 연속 RTO 값에 지수적 백오프를 요구했습니다. 이 동반 규칙이 중요한 이유는, 샘플을 거부하는 행위가 송신자로 하여금 이전 타임아웃을 공격적으로 반복하게 두어서는 안 되기 때문입니다. 만료 후에는 활성 RTO가 커지고, 송신자는 경로가 더 낮은 추정치를 정당화할 깨끗한 증거를 제공하지 않는 동안 더 보수적으로 행동하게 됩니다.

RFC 6298은 나중에 이 규칙을 선명한 경계와 함께 서술했습니다. TCP는 카른의 알고리즘을 사용해야 하며, 응답이 첫 패킷 인스턴스에 속한 것인지 이후 인스턴스에 속한 것인지가 모호하므로 RTT 샘플은 재전송된 세그먼트에서 취해서는 안 됩니다. 이는 측정을 줄이자는 취향의 문제가 아닙니다. 특정 시퀀스 범위의 이력에 묶인 채택 가능성 검사입니다.

이 제외는 또한 “재전송 후에는 ACK를 무시하라”는 구호보다 좁습니다. 확인 응답은 여전히 누적 전달 상태를 전진시키고 재전송 큐를 관리합니다. 카른의 규칙이 말하는 것은, 이 이벤트를 재전송된 데이터에 대한 RTT 샘플로 일반적으로 사용할 수 없다는 것뿐입니다. 새 데이터는 나중에 동일한 모호성 없이 전송되고 확인될 수 있습니다. RFC 6298은 이런 깨끗한 측정값이 추정기를 다시 가동시킬 수 있으며 백오프로 커진 RTO를 다시 줄일 수 있다고 밝힙니다.

이 연쇄는 백오프와 샘플링이 결합되어 있으면서도 서로 다른 메커니즘임을 설명합니다. 타이머가 만료되면 RFC 6298은 가장 오래된 미확인 세그먼트를 재전송하고, RTO를 두 배로 늘리며, 백오프된 값으로 타이머를 다시 시작하도록 요구합니다. 구현은 섹션 2.5가 허용하는 선택적 상한을 적용할 수 있습니다. 카른의 규칙은 모호한 응답이 추정치를 추측된 지연 쪽으로 즉시 끌어당기지 못하게 합니다. 재계산의 근거는 오직 이후의 유효한 샘플만 제공할 수 있습니다. 반복적인 백오프 이후에는 구현이 저장된 SRTT와 RTTVAR을 지우고 다음 유효한 측정값으로 다시 초기화할 수도 있습니다.

규격은 하나의 중요한 예외를 명명합니다. TCP 타임스탬프 옵션을 사용하는 경우, 타임스탬프 정보가 어느 인스턴스가 확인 응답을 유발했는지에 대한 모호성을 제거할 수 있습니다. 그러면 재전송된 세그먼트도 안전한 RTT 샘플을 산출할 수 있습니다. 이 예외는 규칙의 논리를 입증합니다. 재전송 자체가 자격이 없는 것은 아닙니다. 중요한 것은 관측값이 응답을 하나의 전송 이벤트에 결합할 만큼 충분한 식별 정보를 갖고 있는지 여부입니다.

카른의 알고리즘은 손실 탐지기가 아닙니다. 타임아웃, 중복 ACK 논리 또는 다른 복구 메커니즘이 재전송 여부를 결정합니다. 또한 혼잡 제어도 아닙니다. 타임아웃이 송신자의 혼잡 윈도우를 줄일 수는 있지만, 카른은 그 전송 권한을 설정하지 않습니다. 선택적 확인도 아닙니다. SACK는 RTT 샘플을 제공한 사본이 어느 것인지 반드시 식별하지 않은 채 수신자 측의 바이트 범위를 보고할 수 있습니다. 지연 ACK 정책도 아니며, 지연 ACK는 수신자가 확인 응답을 보내는 시점을 다루지 송신자가 그 측정값을 어떻게 분류하는지를 다루지 않습니다.

따라서 이 역사는 하나의 신호 안에서 여러 의미를 분리하는 법에 관한 교훈입니다. ACK는 바이트 스트림의 진행을 증명하고, 재전송 큐에서 데이터를 제거하고, 타이머를 재시작하거나 정지시킬 수 있으면서도, 여전히 경로의 왕복 시간을 추정하기에는 부적합할 수 있습니다. 그 모든 의미를 서로 바꿔 쓸 수 있는 것으로 취급하면 TCP 자신의 복구 행동이 미래의 판단을 오염시키게 됩니다.

출처