요약

  • TCP 수신자는 일반적인 순서대로 도착한 세그먼트 하나에 대한 확인 응답을 보류할 수 있으며, 이를 통해 두 번째 세그먼트나 발신 응답이 피드백 비용을 함께 부담하도록 할 수 있습니다.
  • 이 대기에는 상한이 있습니다. 두 번째 최대 크기 세그먼트의 도착, 타이머 만료, 또는 손실 관련 근거가 일괄 처리가 통제 없는 침묵이 되기 전에 ACK를 발생시킵니다.

첫 번째 최대 크기 세그먼트가 순서대로 도착합니다. TCP는 바이트를 수용하고 다음으로 기대하는 시퀀스 번호를 앞당기지만, ACK는 즉시 전송되지 않습니다. 이어서 또 다른 최대 크기 세그먼트가 도착하면 하나의 누적 확인 응답이 두 세그먼트를 모두 확인할 수 있습니다. 그렇지 않으면 타이머가 대기를 종료합니다. 수신자 내부에서 수신 사실 자체가 불확실한 것은 아무것도 없으며, 달라진 것은 그 수신이 송신자에게 언제 보이는지뿐입니다.

RFC 1122는 1989년 이 동작을 호스트 규칙으로 만들었습니다. 독립적인 ACK 세그먼트 수가 줄어들면 호스트와 네트워크 모두에서 효율이 개선될 수 있으므로, TCP는 지연 확인 응답을 구현하는 것이 바람직합니다. 그러나 이 허용에는 두 가지 한계가 따랐습니다. 지연은 반초 미만이어야 하고, 최대 크기 세그먼트의 연속 스트림은 적어도 두 세그먼트마다 한 번은 ACK를 받아야 합니다. 따라서 지연이 피드백을 억제하는 무제한 허가가 되는 일은 결코 없었습니다.

같은 절은 패킷 수 줄이기 이상으로 대기가 유용할 수 있는 이유도 설명했습니다. 문자 모드 원격 로그인에서는 수신 애플리케이션이 바이트를 소비하고, 자신의 윈도를 갱신하며, 문자를 에코할 수 있습니다. 짧은 지연은 ACK, 윈도 갱신, 응답을 하나의 세그먼트로 합칠 수 있었습니다. 수신자는 단지 헤더 하나를 아낀 것이 아니라, 인접한 상태 변화들이 함께 이동할 기회를 만들어 준 것입니다.

RFC 5681은 이후 빈도 규칙을 명확히 했습니다. RFC 1122는 '두 최대 크기 세그먼트마다 한 번' 요구를 일관되지 않게 표현했지만, RFC 5681은 이를 SHOULD로 모호함 없이 규정하면서 두 번째 세그먼트 대기가 500밀리초를 넘겨서는 안 된다는 점도 되풀이했습니다. RFC 5681은 실무적 모호성도 드러냅니다. 수신자는 자신이 광고한 수신 MSS의 두 배를 기준으로 셀 수 있지만, 송신자는 더 낮은 경로 MTU 때문에 더 작은 세그먼트를 보낼 수 있습니다. 그러면 수신 MSS 두 단위를 기다리는 것이 실제 세그먼트 두 개 이상을 포괄할 수 있습니다. 수신자는 그러한 늘어남을 피하도록 권고되며, 예컨대 크기와 무관하게 적어도 두 세그먼트마다 한 번 ACK를 보내는 방법이 있습니다.

ACK가 다른 운영상의 근거를 담게 되면 일괄 처리 규칙은 즉시 양보합니다. 빈 구간(gap) 위에 도착한 세그먼트는 송신자가 누락된 데이터를 감지할 수 있도록 즉시 중복 ACK를 발생시켜야 합니다. 빈 구간 전체 또는 일부를 채우는 세그먼트 역시 즉시 ACK를 발생시켜야 합니다. 손실 복구가 시퀀스 공간 진행 상황의 최신 지도를 필요로 하는 동안 수신자가 더 예쁜 일괄 처리를 기다리지는 않습니다.

RFC 2525는 스트레치 ACK라고 불리는 실패 모드를 기록했습니다. 구현이 ACK를 충분히 자주 생성하지 않으면 하나의 확인 응답이 기대되는 두 최대 크기 세그먼트보다 더 많은 범위를 덮습니다. 그 결과는 단순히 성긴 트레이스가 아닙니다. ACK 도착은 송신자의 제어 클록에 참여하므로, 과잉 일괄 처리는 윈도 성장을 느리게 하거나 더 버스트성 있는 전송을 부추길 수 있습니다. 역사적 기록은 지연에 관측 가능한 경계가 필요했던 이유를 보여줍니다.