리눅스에서 최소 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.