주요 콘텐츠로 건너뛰기

나는 이더넷 최대 전송 장치 (MTU)와 TCP 최대 세그먼트 크기 (MSS) 사이에 약간의 혼란을 발견했습니다, 잘하면 다음과 같은 설명 합니다. 만약 당신이 여전히 (또는 지금) 혼란 코멘트를 추가 하거나 설명을 요청 하는 전자 메일을 보내 주저 하지 마십시오.

첫째, STCP는 로컬 서브넷의 호스트로 전송되는 TCP 세그먼트와 원격 서브넷의 호스트로 전송되는 세그먼트(예: 라우터를 통해)를 구분합니다. 로컬 서브넷의 호스트로 전송된 세그먼트에는 이더넷 MTU와 관련된 MSS가 있습니다. 특히 MSS는 MTU – IP 헤더 크기 – TCP 헤더 크기입니다. 17.1(1분 에 대한 17.1) 이전의 릴리스에서 MSS는 1500 - 20 – 20 또는 1460과 동일합니다. 원격 서브넷의 호스트로 전송된 세그먼트는 536의 MSS를 사용합니다. STCP는 RFC 791 및 RFC 879의 요구 사항으로 인해 원격 세그먼트에서 더 작은 MSS를 사용합니다. 나는 2004 년 6 월 Stratus 고객 e뉴스레터의 기사에서 MSS 및 잠재적 인 문제를 조정 (증가)하는 방법에 대해 논의했습니다. 여기에서 문서의 사본을 찾을 수 있습니다. 이 문서는 VOS 릴리스 14.7의 예제를 사용하여 작성되었지만 콘텐츠는 여전히 유효합니다(OpenVOS 릴리스는 17.1).

OpenVOS의 17.1 릴리스는 점보 이더넷 프레임에 대한 지원을 추가했습니다. 점보 프레임은 이더넷 프레임에서 1,500바이트 이상을 허용하며, 즉 이더넷 MTU의 증가를 허용합니다. 기본 MTU는 여전히 1500이지만 인터페이스가 "-mtu" 인수(예 1)를 사용하여 구성될 때 이를 늘릴 수 있습니다. MTU 인수의 최대 값은 하드웨어에 따라 16110입니다(표 1 참조).

ifconfig #sdlmux.m16.11-2 172.16.1.116 -netmask 255.255.255.0 -mtu 9200 -add
Adding interface %phx_vos#sdlmux.m16.11-2 with IP address 172.16.1.116
%phx_vos#sdlmux.m16.11-2: <UP, BROADCAST, RUNNING, NOFORWARDBROADCAST, KEEPALIVE
+,  MTU:9200>
172.16.1.116 netmask 0xffffff00 broadcast 172.16.1.255
예 1 – 인터페이스를 구성할 때 MTU 설정

 

어댑터 유형 MTU
V100, V200, V400에 임베디드 어댑터 1500
V150, V250, V300, V500에 임베디드 어댑터
V2302, V2404, V4304, V4408, V6308, V6408의 임베디드 어댑터
9200
U571V 단일 포트 10/100/1000mbps 구리 어댑터 1500
U574V-LC 듀얼 포트 1000mbps 섬유 어댑터
U575V 듀얼 포트 10/100/1000mbps 구리 어댑터
U578V 쿼드 포트 10/100/1000mbps 구리 어댑터
U582V 쿼드 포트 10/100/1000mbps 구리 어댑터
U583V 쿼드 포트 1000mbps 섬유 어댑터
9200
U584V 듀얼 포트 10,000mbps 섬유 어댑터 16110
U776V 쿼드 포트 1000mbps 섬유 어댑터 9200
표 1 – 하드웨어 유형별 MTU 값

 

더 큰 MTU를 설정한 후 STCP가 로컬 연결에 대해 더 큰 MSS를 광고하는 것을 볼 수 있으며 0x23c8은 9160 소수점입니다.


9:04:55.912 Xmit Ether Dst 00:16:97:c4:01:aa  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID    0, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  23fc, Src ac100174, Dst ac10012c
TCP from 172.16.1.116.59410 to 172.16.1.44.9182
    seq  3764213089, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum d329,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4 23 c8  3  3  6  4   2  8  a 18 bf 3f d6  0  <<#H<<<< <<<<??V
     10     0  0  0  0

 

그러나 원격 연결은 여전히 더 작은 MSS를 얻을, 0x218은 536 소수점입니다.


9:20:34.051 Xmit Ether Dst 00:16:97:c4:01:aa  Src 00:00:a8:41:52:22 Type 0800
+(IP)    
IP   Ver/HL 45, ToS  0, Len   3c, ID    0, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  1086, Src ac100174, Dst c0a8000a
TCP from 172.16.1.116.49186 to 192.168.0.10.9182
    seq  1916893234, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum de8e,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  2 18  3  3  6  4   2  8  a  0  1 69  a  0  <<<<<<<< <<< <i<
     10     0  0  0  0

 

1460(TCP 헤더의 경우 1480)을 초과하는 원격 연결의 최소 MSS를 늘릴 수 없습니다.

as: set_stcp_param min_mss 9160
set_stcp_param: 인수는 허용되는 범위 내에 있지 않습니다. 오류
     'param_value'. [500-1480] 허용
로:

 

연결의 양면이 더 큰 MSS를 광고하지 않는 한 실제 효과는 없습니다. 예를 들어 FTP 서버가 9200의 MTU로 구성되고 클라이언트가 1460(0x5b4)의 MSS를 광고하고 있기 때문에 9160MSS를 광고하고 있지만, 이는 서버가 세그먼트에서 보낼 최대 바이트 수입니다.


11:02:49.758 Xmit Ether Dst 00:00:a8:42:3b:6e  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID    5, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  2401, Src ac100174, Dst ac100122
TCP from 172.16.1.116.ftp-data to 172.16.1.34.49343
    seq  2092638702, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum 7c62,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4 23 c8  3  3  6  4   2  8  a  0 19 5c b5  0  <<#H<<<< <<< <5
     10     0  0  0  0

11:02:49.758 Rcvd Ether Dst 00:00:a8:41:52:22  Src 00:00:a8:42:3b:6e Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID 1bcb, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  083b, Src ac100122, Dst ac100174
TCP from 172.16.1.34.49343 to 172.16.1.116.ftp-data
    seq  3565222463, ack 2092638703, window  8192, 20 data bytes, flags Syn Ack.
    X/Off 0a, Flags 12, Cksum fef7,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 13 cc 99  0  0  <<<4<<<< <<<<L>
     10    19 5c b5  0                                       <5

. . . . 

11:02:50.620 Xmit Ether Dst 00:00:a8:42:3b:6e  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len  5dc, ID    8, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  1e5e, Src ac100174, Dst ac100122
TCP from 172.16.1.116.ftp-data to 172.16.1.34.49343
    seq  2092638703, ack 3565222464, window   128, 1460 data bytes, flags Push A
+ck.
    X/Off 08, Flags 18, Cksum 7467,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
. . . .

 

양측이 더 큰 MSS를 광고하더라도 각 프레임에 최대 데이터 양이 포함되어 있다는 보장은 없습니다. 예를 들어 클라이언트와 서버 모두 9160의 MSS를 광고하고 있지만 응용 프로그램이 보낼 디자인의 최대이기 때문에 세그먼트는 8204 바이트에 불과합니다.


11:33:40.492 Xmit Ether Dst 00:00:a8:43:ba:64  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID   34, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  231b, Src ac100174, Dst ac1001d9
TCP from 172.16.1.116.ftp-data to 172.16.1.217.49430
    seq   851197707, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum d8f7,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4 23 c8  3  3  6  4   2  8  a  0 20 9b 7d  0  <<#H<<<< <<<  >}
     10     0  0  0  0

11:33:40.493 Rcvd Ether Dst 00:00:a8:41:52:22  Src 00:00:a8:43:ba:64 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID   33, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  231c, Src ac1001d9, Dst ac100174
TCP from 172.16.1.217.49430 to 172.16.1.116.ftp-data
    seq  3989207776, ack  851197708, window  8192, 20 data bytes, flags Syn Ack.
    X/Off 0a, Flags 12, Cksum d75d,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4 23 c8  3  3  6  4   2  8  a  0  e e1 8a  0  <<#H<<<< <<< <a>
     10    20 9b 7d  0                                        >}

. . . .

11:33:40.504 Xmit Ether Dst 00:00:a8:43:ba:64  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len 2034, ID   37, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  0320, Src ac100174, Dst ac1001d9
TCP from 172.16.1.116.ftp-data to 172.16.1.217.49430
    seq   851197708, ack 3989207777, window   128, 8204 data bytes, flags Ack.
    X/Off 08, Flags 10, Cksum ee81,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
. . . .

 

Finally just setting a large MTU on your hosts is not enough; you also have to make sure that all network devices between the two hosts are configured to allow the larger frame size. If not then what you will find is that everything will work correctly when the host uses small (<= 1460) segments, but if it transmits a larger segment, that segment will be dropped by the network device and the connection will eventually fail with a timeout condition of some kind. Larger segments may be sent because the application sends it or because STCP combines smaller segments. This can make for random and very frustrating failures.