요약

  • SYN에 담긴 TCP MSS 옵션은 송신자가 수신할 준비가 된 TCP 데이터의 양을 알립니다. 두 방향이 서로 다른 한도를 가질 수 있으며, 핸드셰이크가 하나의 공유 값을 선택하지 않습니다.
  • 송신자는 여전히 상대의 수신 한도와 IP 계층의 현재 전송 한계에서 실효 송신 MSS를 도출한 뒤, 각 패킷에 실제로 존재하는 옵션만큼 데이터를 줄여야 합니다.
  • MSS는 Path MTU도, 수신 윈도우도, 애플리케이션 메시지 프레이밍도 아니며, 이후 모든 세그먼트가 고지된 양을 담겠다는 약속도 아닙니다.

그 숫자가 지배한 것은 반대쪽 엔드포인트였다

RFC 793은 최대 세그먼트 크기(Maximum Segment Size)를 TCP 옵션 Kind 2, Length 4로 정의했습니다. 그 16비트 값은 SYN 세그먼트를 보내는 TCP가 수신할 수 있는 최대 수신 세그먼트 크기를 전달했습니다. 이 옵션은 연결 설정 시점에 속했지만, 그 위치가 공동으로 선택한 속성으로 만들지는 않았습니다.

클라이언트 SYN에 담긴 1,460이라는 값은 서버에서 클라이언트로 가는 데이터를 제한합니다. 서버 SYN-ACK에 담긴 1,200이라는 값은 클라이언트에서 서버로 가는 흐름을 제한합니다. 버퍼, 인터페이스, 주소 패밀리 가정, 로컬 정책은 대칭일 필요가 없습니다. 두 선언이 동시에 참일 수 있습니다.

RFC 879는 1983년 이 언어를 특히 직접적으로 만들었습니다. MSS를 고지(announcement)라고 부르며 “흔히 협상(negotiation)으로 잘못 불린다”고 하고, 각 방향에서 독립적으로 사용될 수 있다고 명시했습니다. 협상이라면 보통 제안을 비교해 공유된 결과를 만들어냅니다. MSS에는 그런 선택 단계가 없었습니다. 각 수신자는 자신이 통제하는 용량에 대해서만 발언했습니다.

패킷이 표준 다이어그램을 떠난 뒤에는 이 구분이 중요해집니다. “협상된 MSS”라는 이름의 대시보드 필드는 발화자와 방향을 모두 잃습니다. 비대칭이지만 유효한 연결이 모순처럼 보일 수 있고, 이후 운영자가 한도를 잘못된 흐름에 적용할 수 있습니다.

536 뒤에 있던 산수

역사적 IPv4 기준선은 호스트가 576옥텟 데이터그램을 수신하고 재조립할 것을 요구했습니다. 고정 20옥텟 IPv4 헤더와 고정 20옥텟 TCP 헤더를 빼면 TCP 데이터로 536옥텟이 남습니다. RFC 879는 MSS가 IP나 TCP 헤더가 아니라 데이터 옥텟을 센다는 점을 명확히 했습니다.

SYN과 FIN은 각각 TCP 시퀀스 공간에서 한 자리를 차지하지만, 어느 쪽도 MSS 데이터 옥텟이 되지 않습니다. 시퀀스 공간 점유, 페이로드 길이, 전체 IP 데이터그램 크기는 서로 연관된 장부일 뿐 동의어가 아닙니다.

RFC 1122는 TCP 구현체가 MSS 옵션을 보내고 받도록 요구했습니다. 설정 과정에서 값이 도착하지 않으면 송신자는 536을 가정해야 했습니다. 현재 통합 명세인RFC 9293은 IPv4에 대해 536을 유지하고 IPv6에 대해 1,220을 제공합니다. 1,280 최소값에서 40옥텟 IPv6 헤더와 20옥텟 TCP 헤더를 뺀 수치입니다.

따라서 옵션이 없다는 것은 어떤 크기든 보낼 수 있는 허가를 주는 것이 아닙니다. 보수적 기본값을 활성화할 뿐입니다. 이 기본값들은 현재 경로의 측정치도, 제품 권고도, 이후 세그먼트가 그 길이까지 채워지리라는 예측도 아닙니다. 더 구체적인 수신 선언이 없을 때 행동을 묶는 한도입니다.

수신 상한은 경로 증명서가 아니었다

RFC 1122는 피어로부터 받은 SendMSS와 실효 송신 MSS를 구분했습니다. RFC 9293도 이 구분을 유지합니다. TCP가 실제로 보낼 수 있는 최대치는 피어의 수신/재조립 한도와 IP 계층이 허용하는 최대 전송 크기, 그리고 현재 헤더까지 모두 맞아야 합니다.

수신자가 9,000옥텟을 받아들일 수 있어도 경로의 터널이 그에 대응하는 데이터그램을 운반하지 못할 수 있습니다. 반대로 넓은 경로가 9,000을 운반하면서 수신자가 1,200만 고지했을 수도 있습니다. 첫 번째 사실은 엔드포인트에 속하고, 두 번째 사실은 경로 맥락에 속합니다. 어느 쪽도 상대의 권한을 확대할 수 없습니다.

이것이 Path MTU Discovery와의 경계입니다. 기존 PMTUD 역사는 라우터 오류, 경로 캐시, 전달 프로브를 따라가며 송신자가 가장 좁은 경로에 대한 추정을 수정하는 과정을 다룹니다. 그 장부는 명시적으로 TCP MSS 튜토리얼을 제외합니다. MSS는 패킷화에 다른 입력을 제공합니다. 상대 엔드포인트의 방향별 수신 상한입니다.

실제 세그먼트는 알려진 모든 상한보다 작을 수 있습니다. 애플리케이션이 준비된 바이트가 적을 수 있고, 수신 또는 혼잡 윈도우가 전송량을 제한할 수 있으며, 재전송이 다른 경계를 사용할 수 있고, TCP 옵션이 공간을 차지할 수 있고, 스케줄링이 부분 세그먼트를 내보낼 수 있습니다. 작은 관측 페이로드만으로는 MSS 재작성이나 경로 용량을 증명하지 못합니다.

고정된 고지가 모든 미래의 헤더 값을 매길 수는 없었다

IP와 TCP 헤더는 패킷마다 달라질 수 있습니다. 이로 인해 오래 지속되는 회계 질문이 생겼습니다. 엔드포인트가 MSS를 고지할 때 나중에 나타날 수 있는 모든 옵션의 공간을 미리 빼야 하는가?

RFC 6691은 그 작업을 관련 지식을 가진 쪽에 할당했습니다. MSS 옵션에 넣을 값을 계산할 때는 실효 MTU에서 고정 IP 헤더와 고정 TCP 헤더만 뺍니다. 가상의 가변 옵션을 미리 빼지 않습니다. 실제 패킷을 만들 때 송신자는 실제로 존재하는 IP 및 TCP 옵션만큼 TCP 데이터를 줄여야 합니다.

SYN 시점의 수신자는 피어가 모든 미래 패킷에서 어떤 조합을 사용할지 알 수 없습니다. 하나의 고정된 MSS는 모든 가변 조합을 대표할 수 없습니다. 지금 조립 중인 헤더를 아는 쪽은 오직 송신자뿐입니다.

수신자가 옵션 공간을 예약하고 송신자가 그것을 다시 빼면 세그먼트가 불필요하게 짧아집니다. 어느 쪽도 실제 옵션을 반영하지 않으면 패킷이 너무 길어져 단편화되거나 폐기될 수 있습니다. 이 오래 지속되는 규칙은 보편적 안전 마진이 아니라, 패킷을 아는 행위자가 수행하는 한 번의 조정입니다.

RFC 6691은 또한 IP Security 옵션을 고지된 MSS에서 직접 빼던 오래된 RFC 879 예제의 전제를 바로잡았습니다. 검증된 정정 사항(erratum)이 그 예제 안의 패딩 산수를 고쳤지만, 이후 명세는 빼기 자체가 고지가 아니라 패킷 조립 시점에 속한다는 것을 보여주었습니다. RFC 9293은 이제 고정 헤더 규칙을 통합합니다.

RFC 1122에 제안된 정정 사항은 그 실효 MSS 공식이 IP 옵션을 이중으로 뺀다고 주장했습니다. 정정 6381은 기각되었습니다. 검증자의 기록은 IP가 예약한 공간과 TCP가 IP에 넘기는 옵션을 구분합니다. 연구 기록은 모든 정정 제안을 유효한 본문처럼 다루는 대신, 제안된 수정의 상태를 보존해야 합니다.

너무 작게 잡는 것도 정책 선택이었다

보수적인 값에는 비용이 있습니다. RFC 6691은 MSS를 너무 낮게 잡으면 Path MTU Discovery가 더 큰 경로를 찾아 활용하는 것을 막을 수 있다고 경고합니다. 연결은 여전히 도달 가능한 상태로 더 많은 패킷, 더 많은 헤더 작업, 회피 불가능한 네트워크 사실처럼 보이는 지속적인 용량 손실을 낳을 수 있습니다.

그렇다고 실효 MTU가 변하는 인터페이스에서 최선의 경우만 고지하는 것이 정당화되지는 않습니다. 헤더 압축이 상태를 재동기화하기 위해 가끔 전체 헤더를 보내야 할 수 있고, 재전송이 그 더 큰 형태로 발생할 수 있습니다. RFC 6691은 고지된 수신 선언이 반복 가능하도록 가장 작은 실효 MTU를 사용할 것을 권합니다.

IPv6 점보그램은 16비트 필드의 표현 한계를 드러냅니다. 65,535라는 값은 무한대로 취급되며 실제 사용 가능한 MSS는 Path MTU Discovery가 결정합니다. “무한대”는 최종 결정을 다른 메커니즘에 위임할 뿐, 무한한 경로를 보증하지 않습니다.

레지스트리는 문법을 보존했을 뿐, 살아 있는 연결이 아니었다

IANA TCP 파라미터 레지스트리는 여전히 Kind 2, Length 4를 최대 세그먼트 크기로 등재하고 RFC 9293을 가리킵니다. 이것은 공유 문법의 연속성을 확립합니다. 운영체제가 무엇을 고지했는지, 미들박스가 그것을 재작성했는지, 어떤 크기가 경로를 건넜는지는 증명하지 않습니다.

RFC 9293은 RFC 793, RFC 879, RFC 6691을 폐기하고 RFC 1122의 TCP 부분을 대체했습니다. 통합은 중요한 분업을 보존했습니다. 수신자는 자신에 대해 아는 것을 고지합니다. 송신자는 그 상한을 IP가 허용하는 것과 결합합니다. 가변 오버헤드는 현재 패킷을 조립하는 행위자에게 남습니다.

따라서 MSS는 발화자와 방향을 가진 상한입니다. 방어 가능한 연결 기록은 양쪽 고지, 어느 쪽이 없었을 경우의 기본값, 각 송신자의 실효 계산, 실제 관측된 패킷을 함께 보존합니다. “협상된 MSS”라는 하나의 필드는 한 번도 없었던 권한을 편리한 숫자 하나에 부여합니다.

출처와 근거의 한계

이 출처들은 명세, 개정 상태, 레지스트리 연속성을 확립합니다. 현재 배포 현황, 운영체제 기본값, 미들박스 재작성, 실시간 경로 MTU, 성능, 특정 사건의 원인은 측정하지 않습니다.