리눅스에서 최소 TCP MSS


9

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입니다.


20 바이트의 TCP 세그먼트를 어떻게 금지합니까?
— David Schwartz

MSS는 Maximum Segment Size (최대 세그먼트 크기)를 나타내며, 특정 연결에서 세그먼트 크기의 상한 (하한이 아님)입니다. TCP_MIN_MSS는이 한계에 대한 하한을 지정합니다. 따라서 88 바이트 미만의 세그먼트는 어떤 방식 으로든 금지하지 않으며 모든 연결에 대한 MSS가> = 88 바이트 여야한다고 명시합니다.
— gelraen

물론이야! 명확하지 않아서 죄송합니다. 최신 편집 내용을 참조하십시오.
— Mircea Gherzan

현상금이 만료 된 이유는 무엇입니까? 다윗의 대답은 적어도 내 만족까지 일을 정리합니다. 그의 대답과 나의 차이점은 우리가 다른 최소 점에 대해 이야기하고 있다는 것입니다. 가치있는 것에 대해, 세 번째 최소값은 41 또는 20 + 20 + 1 바이트의 TCP 데이터입니다. 따라서 최소 패킷 크기는 요청하는 이유에 따라 다릅니다. 커널이 사용하는 경우 68이 정답이라고 생각합니다 TCP_MIN_MSS.
— Warren Young

나는 여전히 대답에 만족하지 않습니다. 나는 여전히 커널이 앱에 작은 작은 MSS를 부과하지 않는 이유를 알지 못한다. 41 바이트의 (TCP로드 된 일정한 스트림) IP 패킷을 갖고 싶지만으로 인해 할 수 없습니다 TCP_MIN_MSS. 왜 1이 될 수 없습니까? 어떤 RFC가 중단됩니까? 어떤 이론적 / 실제적인 문제가 발생합니까? "스펙 외부"인지 확실합니까? "다른 최소"? 여기에는 최소한 한 가지 관심이 있습니다 : 커널이 허용하는 가장 작은 MSS.
— Mircea Gherzan

답변:


5

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

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

이를 종합하면 구현시 60 + 60 + 8 바이트 패킷을 지원해야합니다.

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


1
MSS는 헤더를 포함하지 않고 (페이로드 일뿐), 60두 번 표시됩니다
— Michael Mrozek

구현시 최대 크기의 헤더가있는 패킷을 지원할 수 있어야하지만 최대 크기의 헤더를 보내지 않습니다. 따라서 우리가 실제로 전송하는 최대 값과 최대 값의 차이는 데이터에 사용할 수 있으며 MSS에 추가되어야합니다.
— David Schwartz

자, 8 바이트를 설명했습니다. "TCP / IP"헤더가 무슨 뜻인지 모르겠습니다. IP 헤더와 TCP 헤더를 알고 있습니다. 그리고 마이클이 지적한대로 60 번의 쇼가 두 번 나타납니다. 그리고 RFC는 "효과적인 MSS"에 대해서만 논의하고 최소한의 것이 아닙니다.
— Mircea Gherzan

60은 IP 헤더에 대해 한 번, TCP 헤더에 대해 한 번 두 번 표시됩니다.
— David Schwartz

68은 조각화에 관한 것입니다. "60 + 60 + 8"은 조각화 될 수 있으므로 조각화에주의해야하는 이유는 무엇입니까? "68 + 20"조차도 조각화 될 수 있습니다. 그리고 왜 다른 쪽을 "수용해야" "60 + 60 + 8"해야합니까? "조각화없이"와 같이 "수락"? 결론 : "20 + 20"+ 10 바이트의 데이터를 보낼 수없는 이유는 무엇입니까?
— Mircea Gherzan

3

그 숫자가 어디에서 왔는지 모르겠지만 스펙 외부에 있다고 말할 수 있습니다. IP 네트워크에 지원되는 최소 MTU는 576 바이트이며, 이는 512 데이터 바이트와 IP + TCP 헤더 및 TCP 옵션의 경우 최대 64 바이트입니다. 이 값은 일반적인 경우에 상당히 낮은 오버 헤드를 제공하도록 선택되었습니다.

커널 코드를 읽었을 때 표시하는 값이 임의적이지 않다는 것을 알 수 있습니다. 대신에 원시 상수 64를 사용하는 오래된 관행이있었습니다 TCP_MIN_MSS. 따라서 커널 개발자가 우연히 발견 한 IP-over-Foo 네트워크가 있다고 생각합니다.

그러나 비표준 네트워크 유형은 말할 수 없습니다.


576은 데이터 그램 의 MTU입니다 . 이 경우 TCP 패킷이 DF 비트를 설정하기 때문에 데이터 그램 제한이 아니라 중요한 패킷 제한입니다.
— David Schwartz

IP 데이터 그램에 대해 정의 된 최소 MTU 및 TCP 패킷도 IP 데이터 그램입니다.
— gelraen

맞습니다. 그러나이 TCP 제한은 TCP 데이터 그램이 (일반적으로) 조각화되지 않기 때문에 데이터 그램이 아닌 패킷에 적용됩니다. 576 바이트 데이터 그램 규칙이 중요한 유일한 의미는 구현이 패킷에서 8 바이트 이상의 데이터를 지원할 수 있어야한다는 것을 의미합니다 (따라서 수식의 8). 그렇지 않으면 576 바이트 데이터 그램을 조각화 할 수 없습니다.
— David Schwartz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.