Passa al contenuto principale

Ho notato una certa confusione tra l'unità di trasmissione massima Ethernet (MTU) e il TCP Maximum Segment Size (MSS), si spera che quanto segue lo spieghi. Se siete ancora (o siete ora) confusi non esitate ad aggiungere un commento o ad inviarmi una e-mail per chiedere chiarimenti.

In primo luogo, STCP distingue tra segmenti TCP inviati ad un host su una sottorete locale e segmenti inviati ad un host su una sottorete remota, cioè tramite un router. I segmenti inviati ad un host su una sottorete locale hanno un MSS che è correlato all'MTU Ethernet; nello specifico l'MSS è MTU - IP header size - TCP header size. Nelle versioni precedenti alla 17.1 (più circa 17.1 in un minuto) questo rende l'MSS uguale a 1500 - 20 - 20 o 1460. I segmenti inviati ad un host su una sottorete remota utilizzano un MSS di 536. STCP usa l'MSS più piccolo sui segmenti remoti a causa dei requisiti di RFC 791 e RFC 879. Ho discusso come sintonizzare (aumentare) l'MSS e i potenziali problemi in un articolo della eNewsletter del giugno 2004 Stratus . Potete trovare una copia dell'articolo qui. Mentre l'articolo è stato scritto usando esempi dalla versione 14.7 di VOS, il contenuto è ancora valido (a partire dalla versione 17.1 di OpenVOS).

La versione 17.1 di OpenVOS ha aggiunto il supporto per i frame jumbo Ethernet. I frame jumbo permettono più di 1500 byte nel frame Ethernet, cioè un aumento dell'MTU Ethernet. Il MTU di default è ancora 1500, ma è possibile aumentarlo quando l'interfaccia è configurata utilizzando l'argomento "-mtu" (esempio 1). Il valore massimo dell'argomento MTU è 16110 a seconda dell'hardware (vedi tabella 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
Esempio 1 - impostazione MTU durante la configurazione di un'interfaccia

 

Tipo di adattatore MTU
Adattatori integrati in V100, V200, V400 1500
Adattatori integrati in V150, V250, V300, V500
Adattatori integrati in V2302, V2404, V4304, V4304, V4408, V6308, V6408
9200
Adattatore in rame U571V Single-Port 10/100/1000 mbps 1500
Adattatore in fibra ottica U574V-LC Dual-Port 1000 mbps
Adattatore in rame U575V Dual-Port 10/100/1000 mbps
Adattatore in rame U578V Quad-Port 10/100/1000 mbps
Adattatore in rame U582V Quad-Port 10/100/1000 mbps
Adattatore in fibra ottica U583V Quad-Port 1000 mbps
9200
Adattatore in fibra ottica U584V Dual-Port 10.000 mbps 16110
Adattatore in fibra ottica U776V Quad-Port 1000 mbps 9200
Tabella 1 - Valori MTU per tipo di hardware

 

Dopo aver impostato un MTU più grande si può vedere che STCP pubblicizzerà un MSS più grande per le connessioni locali, 0x23c8 è 9160 decimale.


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

 

Ma le connessioni remote ottengono ancora il più piccolo MSS, 0x218 è 536 decimali.


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

 

Non è possibile aumentare l'MSS minimo per le connessioni remote oltre il 1460 (1480 con l'header TCP)

come: set_stcp_param min_mss 9160
set_stcp_param: L'argomento non rientra nell'intervallo consentito. Errore in
     Param_value'. [500-1480] permesso
come:

 

A meno che entrambe le parti di una connessione non pubblicizzino un MSS più grande, non c'è alcun effetto reale. Ad esempio, anche se il server FTP è configurato con un MTU di 9200 e pubblicizza un MSS di 9160, poiché il client pubblicizza un MSS di 1460 (0x5b4), cioè il numero massimo di byte che il server invierà in un segmento.


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...
. . . .

 

Anche quando entrambe le parti pubblicizzano gli MSS più grandi non c'è garanzia che ogni frame contenga la massima quantità di dati. Ad esempio, sia il client che il server pubblicizzano un MSS di 9160 ma i segmenti sono solo 8204 byte, perché questo è il massimo che l'applicazione è progettata per inviare.


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.

© 2020 Stratus Tecnologie.