요약

  • Window Scale은 TCP의 16비트 윈도우 필드를 그대로 유지하되, 각 방향에 대해 SYN 교환에서 고정된 2의 거듭제곱 해석을 부여합니다.
  • 핸드셰이크 이후 화면에 표시된 65,535 값은 시프트 수 7을 적용하면 8,388,480바이트를 의미할 수 있지만, SYN에서 같은 값은 배율이 적용되지 않은 상태로 유지됩니다.
  • 스케일링은 수신 크레딧의 표현 범위를 넓힐 뿐입니다. 버퍼 메모리를 만들거나, 혼잡 윈도우를 늘리거나, 상대를 인증하거나, 타임스탬프와 PAWS가 처리하는 오래된 세그먼트 문제를 해결하지는 않습니다.

TCP 수신자는 모든 세그먼트에 하나의 숫자를 담습니다. 확인 응답된 지점 너머로 얼마나 더 많은 데이터를 받을 준비가 되어 있는지를 나타내는 숫자입니다. 원래 헤더에서 이 윈도우 필드는 16비트 폭이며, 최대값은 65,535입니다. 네트워크 경로를 가득 채우는 비용이 몇 개의 패킷 수준으로 측정되던 시절에는 충분한 크기였습니다. 그러나 대역폭이 배로 늘어나고 왕복 시간이 사라지지 않으면서 구조적 한계가 되었습니다.

100밀리초의 왕복 시간을 갖는 초당 100메가비트 경로를 상상해 보십시오. 이 파이프를 가득 채우려면 약 1.25메가바이트가 전송 중이어야 합니다. 수신자에게 메모리가 있고 송신자에게 보낼 데이터가 있더라도, 배율이 적용되지 않은 윈도우 필드는 필요한 크레딧의 약 20분의 1만 광고할 수 있습니다. 어떤 재전송 알고리즘도 수신자가 표현할 수 없는 처리량을 회복할 수 없습니다.

RFC 1072는 1988년에 이 문제를 높은 대역폭-지연 경로의 장애물 중 하나로 기술했습니다. 제시된 해법은 의도적으로 절약적이었습니다. TCP 헤더를 교체하지 않고, 신뢰 가능한 연결 시작 교환에 3바이트 옵션을 추가하는 것이었습니다. 한 바이트는 Window Scale을 식별하고, 한 바이트는 길이를, 마지막 바이트는 지수를 담습니다. 이후의 윈도우 값은 이진 시프트를 거쳐 해석됩니다.

이 배치가 중요합니다. 일반적인 확인 응답은 옵션을 담고 있다는 이유만으로 신뢰 가능하게 전달되지 않습니다. 사라진 ACK에서 배율 인수가 바뀔 수 있다면, 두 엔드포인트가 이후의 모든 윈도우 값에 서로 다른 의미를 부여할 수 있습니다. 반면 SYN은 연결 시작 과정의 일부로 재전송됩니다. 핸드셰이크는 양쪽이 그 값을 사용하기 전에 해석 방식에 수렴할 수 있는 자리를 제공했습니다.

두 방향, 두 가지 의미

각 엔드포인트는 자신의 수신 윈도우에 대한 지수를 광고합니다. 호스트 A가 시프트 수 7을, 호스트 B가 시프트 수 4를 보낸다면, B는 이후 A가 보낸 윈도우 값을 해석할 때 7을 사용하고, A는 B가 보낸 값에 4를 사용합니다. 연결에 단 하나의 배율이 있는 것이 아니라, 방향별 상태가 두 개 존재합니다.

제안은 쌍방입니다. RFC 7323은 어느 한 방향에서 스케일링이 활성화되기 전에 양쪽 모두가 자신의 SYN 세그먼트에 Window Scale 옵션을 보내야 한다고 규정합니다. 지수 0도 여전히 지원을 의미합니다. 이 엔드포인트의 현재 인수가 1이라는 뜻입니다. 한쪽이 옵션을 생략하면 양쪽의 저장된 시프트 수는 모두 0으로 남고, 기존의 해석 방식이 유지됩니다.

SYN과 SYN-ACK의 윈도우 필드는 절대 배율이 적용되지 않습니다. 여기서 중요한 판독 규칙이 나옵니다. 연결 시작 교환에서의 65,535 값은 65,535바이트를 의미합니다. 양쪽 옵션이 스케일링을 확립한 뒤에는, 일반 세그먼트에서 동일한 16비트 온와이어 값이 더 큰 의미를 가질 수 있습니다. 시프트 수 7에서65,535 << 7은 8,388,480바이트가 됩니다. 패킷이 커진 것이 아니라 기억된 맥락이 커진 것입니다.

RFC 7323은 확장된 윈도우를 30비트 양으로 정의하고 지수를 14로 제한합니다. 가장 큰 인코딩된 값은 약 1기비이트 미만을 나타냅니다. 수신된 지수가 14를 넘으면 14로 고정됩니다. 이 상한은 시퀀스 공간 비교를 보존합니다. 수신 윈도우를 무한정 크게 만들면 TCP가 32비트 시퀀스 공간 내에서 위치를 구별하는 능력이 흐려집니다.

스케일링은 입자 크기도 바꿉니다. 엔드포인트가 시프트 수 7을 사용하면 필드는 128바이트 단위로 증가합니다. 내부 버퍼 관리는 정밀하게 유지할 수 있지만, 광고되는 지점은 인코딩 시점에 양자화됩니다. 더 넓은 범위는 더 거친 어휘를 대가로 얻어집니다.

실험에서 표준 옵션으로

RFC 1072는 실험적 문서였습니다. RFC 1323이 1992년에 이를 대체하며 Window Scale과 타임스탬프를 고성능을 위한 TCP 확장으로 표준 트랙에 올렸습니다. 2014년에는 RFC 7323이 RFC 1323을 대체하며 핵심 Window Scale 메커니즘을 유지하면서 처리 절차, 미들박스 동작과 현재 요구 사항을 명확히 했습니다. 2022년의 TCP 기본 사양인 RFC 9293은 Window Scale을 고성능 환경에서 권장되지만 기본 상호운용성에는 불필요한 공용 옵션 중 하나로 나열합니다.

이 역사는 이 확장이 왜 평범하면서도 별개인지 설명합니다. 기본적인 TCP 연결은 이것 없이도 동작할 수 있습니다. 대역폭이 높은 연결은 스케일링 없이 핸드셰이크를 마친 뒤, 경로를 효율적으로 사용할 만큼의 크레딧을 광고하지 못할 수 있습니다. 호환성은 연결을 보존하지만 성능을 보장하지는 않습니다.

이 설계는 Window Scale 안에 속하지 않은 것들도 보여줍니다. RFC 1072는 더 큰 윈도우와 함께 누적 확인 응답과 타임스탬프 에코를 논의했습니다. 이것들은 별개의 메커니즘이 되었습니다. SACK은 불연속적으로 수신된 블록을 보고합니다. 타임스탬프는 왕복 시간 측정을 지원하고, PAWS는 감싸진 오래된 데이터를 거부할 수 있습니다. Window Scale은 어느 것도 하지 않습니다. 수신 크레딧에 붙는 단위를 바꿀 뿐입니다.

또한 수신 크레딧은 네트워크로부터의 허가와 같지 않습니다. 송신자는 수신자가 광고한 윈도우와 자신의 혼잡 제어 상태 양쪽에 모두 구속됩니다. 수신자가 8메가바이트를 제공하더라도 혼잡 윈도우가 64킬로바이트만 허용하면, 송신자는 더 작은 한계를 따라야 합니다. Window Scale은 경로 용량을 확립하거나, 손실을 막거나, 혼잡 제어를 면제할 수 없습니다.

관찰자가 기억해야 할 상태

따라서 화면에 보이는 윈도우 필드만으로는 불완전한 증거입니다. 핸드셰이크 이후에 시작된 패킷 캡처는SEG.WND = 32,768을 표시하면서, 실제 크레딧이 32,768바이트인지, 4메가바이트인지, 혹은 다른 값인지 보여주지 않을 수 있습니다. 올바른 해석에는 해당 방향의 SYN 옵션이 필요합니다.

같은 의무는 상태를 보유한 미들박스에도 적용됩니다. 세그먼트가 현재 TCP 윈도우 안에 드는지 판단하는 방화벽은 협상된 배율을 이해해야 합니다. RFC 7323은 SYN 또는 SYN-ACK에서 이 옵션을 제거하거나 수정하지 말라고 경고합니다. 그렇지 않으면 엔드포인트가 서로 불일치하는 매개변수를 유지할 수 있습니다. 배율을 알 수 없는 장치는 원시 16비트 필드가 전체 윈도우인 것처럼 가장해서는 안 됩니다.

실패는 조용할 수 있습니다. 연결은 열리고, 체크섬은 통과하고, 시퀀스 및 확인 번호는 평범해 보일 수 있습니다. 그러나 한 참여자는 작은 인코딩된 값을 수백만 바이트로 취급하고, 다른 참여자는 문자 그대로 취급할 수 있습니다. 손상은 이후의 기형적인 패킷에 있는 것이 아니라 잃어버린 설정 맥락에 있습니다.

이것이 지속되는 아키텍처적 교훈입니다. Window Scale은 모든 곳에서 숫자를 늘려 거리를 정복하지 않았습니다. 신뢰 가능한 연결 시작 교환이 고정 폭 필드에 의미를 부여하도록 하고, 각 방향에 별도의 해석을 유지하며, 그 해석에 상한을 두어 기존 시퀀스 산술이 안전하게 유지되도록 했습니다. 헤더 크기는 그대로였습니다. 연결이 그것을 읽는 법을 배운 것입니다.

출처