요약

  • 누적 ACK는 TCP 시퀀스 공간에서의 진행을 증명하지만, 재전송 이후에는 그 진행을 원본 사본이 만들었는지 이후 사본이 만들었는지 식별해 주지 못한다.
  • RFC 1122와 RFC 6298은 Karn의 규칙을 요구한다. 재전송된 데이터로부터 RTT 샘플을 취하지 말라는 것이다. RTO가 만료된 후에는 타이머를 두 배로 늘리고, 모호하지 않은 근거가 도착할 때까지 그 신중함을 유지해야 한다.
  • 협상된 TCP 타임스탬프는 샘플링을 복원할 수 있을 만큼 확인된 인스턴스를 표시해 주지만, 경로, 손실 원인, 신원 또는 벽시계 시각 이력을 증명하지는 못한다.

하나의 답, 서로 양립할 수 없는 두 개의 시계

송신자가 세그먼트를 전송하고 타이머를 시작한다고 가정해 보자. ACK가 돌아오기 전에 타이머가 만료되어 송신자는 동일한 시퀀스 번호로 재전송한다. 그런 다음 ACK가 도착한다.

이 ACK는 유용하다.RFC 793에 따르면 ACK의 확인 번호는 수신자가 다음에 기대하는 바이트를 가리킨다. 이는 송신 창을 전진시키고 보류된 데이터를 해제할 수 있다. 그러나 ACK는 그것을 유발한 사본의 이력을 담고 있지 않다. 원본이 지연되어 재시도 직전에 도착했을 수도 있고, 원본이 사라지고 재시도가 성공했을 수도 있다.

이 두 이력은 정반대의 측정을 요구한다. 첫 전송 시점부터 재면 왕복 시간이 길어 보인다. 재전송 시점부터 재면 짧아 보인다. 동일한 유효한 ACK로는 둘 중 어느 쪽인지 결정할 수 없다. 전달 증거는 그 진실도 권한도 초과하지 않았다. 초과한 것은 송신자가 제안한 추론뿐이다.

타이머는 자신의 실수를 학습할 수 있었다

TCP에 재전송 타임아웃이 필요한 이유는 경로가 고정된 지연을 알려 주지 않기 때문이다. 너무 짧은 타이머는 불필요한 사본을 만들고, 너무 긴 타이머는 복구 가능한 손실을 방치시킨다. 그래서 송신자는 관찰된 전송과 확인으로부터 왕복 시간을 추정한다.

원래 TCP 명세는 평활화된 추정치를 제공했지만, 재전송은 피드백 함정을 낳았다. 모호한 ACK를 재시도에 대한 빠른 응답으로 취급하면 추정 RTT가 낮아질 수 있다. 다음 타임아웃은 더 일찍 발동되고, 더 많은 재전송과 더 많은 모호한 샘플을 만든다. 반대로 항상 원본 탓으로 돌리면 추정치가 불필요하게 느려질 수 있다. 어느 정책이든 알 수 없는 원인을 확신에 찬 숫자로 바꾼다.

이 오류는 산술보다 앞서 인식론적이다. 아무리 좋은 평균화 공식도 잘못 표기된 관측값을 복구할 수 없다.

Karn은 거부 자체를 정확성의 일부로 만들었다

RFC 1122는 두 가지 상이한 수정을 필수로 만들었다. 호스트 TCP는 Jacobson의 분산 인식 RTO 계산을 구현해야 하고, 모호한 왕복이 그 계산을 오염시키지 않도록 Karn의 선택 규칙을 구현해야 한다.

Karn의 규칙은 절제적이다. 세그먼트가 재전송되었다면 그 ACK로부터 RTT 샘플을 도출하지 말라는 것이다.RFC 6298은 이 규칙을MUST NOT으로 유지한다. 송신자는 시퀀스 진행을 위해 ACK를 여전히 수용할 수 있다. 시간 측정 주장만 보류한다.

이 분리가 중요하다. 샘플을 거부하는 것은 패킷을 거부하거나 수신자를 비난하거나 경로가 끊겼다고 선언하는 것이 아니다. 그것은 해당 관측값이 한 추정기가 요구하는 인과 표지를 갖지 못했다는 국소적 진술이다.

백오프는 불확실성을 앞으로 운반했다

타임아웃 이후의 침묵 자체가 결과를 낳는다. RFC 1122는 동일 세그먼트에 대한 연속 RTO 값에 지수적 백오프를 요구한다. 이후RFC 2988에서 표준화되어 RFC 6298이 유지하는 절차는 타이머가 만료되면 가장 오래된 미확인 세그먼트를 재전송하고RTO <- RTO * 2로 설정하라고 말한다.

이 배증은 송신자가 반복되는 불확실성에 점점 더 공격적으로 응답하는 것을 막는다. 더 중요한 것은, 백오프된 값이 뒤따르는 모호한 ACK에 의해 지워져서는 안 된다는 점이다. 새 데이터가 재전송 없이 전송되고 확인되면, 유효한 샘플이 정상 추정기를 통해 흐르며 RTO를 다시 낮출 수 있다.

따라서 백오프는 영구적인 벌이 아니라 수정 가능한 절제다. 근거가 귀속 가능해질 때까지 신중함을 보존한다.

타임스탬프가 빠진 표지를 제공했다

TCP는 이후 제한된 예외를 얻었다.RFC 7323은 타임스탬프 옵션의TSval과 이를 에코하는TSecr를 정의한다. 옵션이 협상되었고 반환된 값이 해당 전송 인스턴스를 식별하면, RFC 6298은 모호성이 제거되었기 때문에 재전송된 데이터의 샘플링을 허용한다.

이 예외는 이름이 암시하는 것보다 좁다. 타임스탬프는 민간 시간 인증서가 아니다. 피어를 인증하거나, 경로를 밝히거나, 편도 지연을 측정하거나, 패킷이 왜 손실되었는지 증명하지 않는다. ACK를 특정 타임스탬프가 찍힌 전송과 연관시킬 수 있는 연결 국소적 근거를 제공할 뿐이다.

RFC 7323은 또 다른 경계를 더한다. 에코된 타임스탬프는 세그먼트가 송신 창의 왼쪽 경계를 전진시킬 때에만 평균 RTT를 갱신할 수 있다. 새로운 확인 진행 없이 accompany하는 에코가 자동으로 시간 샘플이 되지는 않는다.

더 많은 관측값은 기억을 짧게 만들 수 있었다

타임스탬프는 훨씬 더 많은 RTT 측정을 가능하게 한다. 이는 모호성 없이 유익해 보이지만, RFC 7323은 RFC 6298 추정기의 가중치가 대략 RTT당 샘플 하나를 가정했다고 경고한다. 모든 패킷마다 샘플을 넣으면 오래된 경로 조건이 추정치에서 너무 빨리 사라질 수 있다. 여러 왕복에 걸쳐 변동하는 경로는 그럴수록 더 많은 허위 재전송을 만들어 낸다.

구현은 여러 샘플이 있을 때 추정기가 의도한 이력을 보존해야 한다. 정밀도는 단지 샘플 수가 아니다. 관측값이 모델에 유입되는 속도가 모델이 여전히 기억할 수 있는 과거를 결정한다.

이것이 설계의 두 번째 거부다. 첫째, 원인을 알 수 없는 샘플을 배제한다. 둘째, 표지가 붙은 샘플 사이에서조차 풍부함이 독립적인 정보를 사칭하도록 허용하지 않는다.

ACK는 자신의 고유한 권한을 지켰다

ACK는 여전히 강력하다.SND.UNA를 전진시키고, 저장된 바이트를 은퇴시키고, 송신자 상태를 구동한다. 그러나 어떤 물리적 사본이 도착했는지, 지연이 어디에 쌓였는지, 손실이 혼잡 때문이었는지, 수신자가 진실을 말했는지 증명하지 않는다.

Karn의 지속적 기여는 단순한 타이머 요령이 아니었다. 그것은 공유 시스템을 위한 규율이었다. 근거가 지지하는 행위, 그 이상도 이하도 아닌 행위를 수행하게 하라. TCP는 전달 진행에 대해 ACK를 신뢰하면서 경과 시간의 귀속에 대해서는 불신할 수 있었다. 송신자는 네트워크에 중앙 시계나 제공할 수 없는 설명을 요구하지 않고도 자신의 모델에 대한 국소적 통제를 유지했다.

출처와 한계

닫힌 출처 집합은 RFC 793, RFC 1122, RFC 2988, RFC 6298, RFC 7323이다. 이 명세들은 현재 구현 보급률, 플랫폼 기본값 또는 실제 타임아웃의 원인이 아니라 의미론과 규범적 규칙을 확립한다. 모호한 샘플은 우연히 현실과 일치했을 수도 있다. Karn의 규칙이 말하는 것은 송신자가 어느 해석이 유효했는지 알 수 없다는 것이다.