Linux의 최소 TCP MSS

Linux의 최소 TCP MSS

Linux의 TCP MSS는 88 이상이어야 합니다(include/net/tcp.h).

/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS             88U

제 질문은: "60 + 60 + 8"은 어디서 나온 것인가요? 왜? 나는 20 + 20이 IP 헤더 + TCP 헤더에서 나온다는 것을 알고 있습니다.

편집: 제목을 자세히 살펴본 후 공식은 다음과 같습니다.

(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)

문제는 여전히 존재합니다.? Linux 커널이 이 공식을 사용하여 예를 들어 20바이트의 TCP 세그먼트 흐름을 허용하지 않는 이유는 무엇입니까? 여기서 iperf를 생각해 보세요.

EDIT2: 이것은 내 사용 사례입니다. 소켓/연결에 낮은 MSS를 적용함으로써모두스택에서 보낸 패킷 크기가 더 작습니다. iperf를 사용하여 패킷/초 테스트를 수행하는 동안 더 낮은 MSS를 설정하고 싶습니다. MSS의 하한으로 인해 회선에서 128바이트(142바이트 이더넷 프레임)보다 작은 IP 패킷을 얻을 수 없습니다! RFC 2544에 따라 가능한 한 64바이트에 가까운 이더넷 프레임 크기를 얻고 싶습니다. 이론적으로는 18 + 20 + 20 < 64가 가능합니다.

답변1

TCP 및 IP 헤더의 최대 크기(각각 60바이트)를 지원하려면 구현이 필요합니다.

구현 시 576바이트 데이터그램을 지원해야 하며, 최대 헤더를 사용하더라도 데이터그램의 데이터가 8바이트를 초과한다는 의미입니다. 8바이트가 넘는 데이터가 포함된 데이터그램을 보내려면 IP 조각화는 데이터그램 조각을 나타내는 하나 이상의 패킷에 8바이트 이상의 데이터를 넣어야 합니다. 따라서 구현에서는 패킷에서 최소 8바이트의 데이터를 지원해야 합니다.

요약하면 구현은 60+60+8바이트 패킷을 지원해야 합니다.

TCP 스트림의 일부인 패킷을 보낼 때 패킷에는 20바이트 IP 헤더(옵션 포함)와 20바이트 TCP 헤더(옵션 포함)가 있습니다. 이렇게 하면 데이터 및 옵션에 최소 (60+60+8)-(20+20)바이트가 남습니다. 따라서 이는 구현된 것으로 안전하게 가정할 수 있는 TCP MSS의 최대값입니다.

답변2

이 숫자가 어디서 나온 것인지는 모르겠지만, 표준을 벗어난 숫자라는 점은 말씀드릴 수 있습니다. IP 네트워크에서 지원되는 최소 MTU는 576바이트입니다. 이는 512 데이터 바이트에 최대 64바이트의 IP + TCP 헤더 및 TCP 옵션을 더한 것입니다. 이 값은 일반적인 상황에서 상당히 낮은 오버헤드를 제공하기 위해 선택되었습니다.

커널 코드 비트를 읽어보니 표시되는 값이 임의적이지 않은 것으로 나타났습니다. 이전 접근 방식은 대신 원시 상수 64를 사용하는 것입니다 TCP_MIN_MSS. 따라서 나는 커널 개발자가 이상한 IP-over-Foo 네트워크를 접하여 여러분이 보고 있는 지점까지 가치를 높일 수 있다고 결정했다고 가정합니다.

하지만 이 비표준 네트워크 유형이 무엇인지는 알 수 없습니다.

관련 정보