Vai al contenuto principale

A partire da OpenVOS 17.1, STCP supporta le opzioni TCP relative al timestamp, al riconoscimento selettivo e al ridimensionamento della finestra. Ciò consentirà un flusso di dati più efficiente quando i segmenti TCP vengono persi o durante l'invio di dati su una connessione con elevata latenza di banda (una connessione su un collegamento in cui la larghezza di banda minima * latenza complessiva > 65536). L'effetto di queste modifiche è trasparente per le applicazioni, ma ci sono alcune cose di cui dovresti essere a conoscenza quando utilizzi packet_monitor.

In primo luogo, quando STCP invia una richiesta di connessione, il segmento TCP (SYN) conterrà ora 16 byte in più.

17:41:26.533 Xmit Ether Dst 00:23:54:52:18:6e  Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID a789, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  f2f6, Src a4984dd9, Dst a4984d32
TCP from 164.152.77.217.55423 to 164.152.77.50.7777
    seq  3825990103, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum b717,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 32 2d bc 85  0  <<<4<<<< <<<2-<>
     10     0  0  0  0
2 4 5 b4 opzione 2 (dimensione minima del segmento), lunghezza totale dell'opzione: 4 byte, valore 05 b4 (1460 in decimale) (questi byte non sono nuovi)
3 3 6 opzione 3 (scala finestra), lunghezza totale di 3 byte, valore 6
4 2 opzione 4 (conferma selettiva supportata), lunghezza totale 2 byte
8 alle 32 del 2 a.C. 85 0 0 0 0 opzione 8 (timestamp), lunghezza totale 10 byte, ora di invio 32 2d bc 85, ora di ricezione 0 0 0 0
0 opzione 0 (fine delle opzioni)

In secondo luogo, le opzioni incluse in un segmento di risposta alla connessione (SYN/ACK) dipenderanno dal contenuto del segmento SYN dell'host remoto. STCP includerà l'opzione di riconoscimento selettivo nella propria risposta solo se la richiesta di connessione la contiene. La risposta includerà le opzioni di scala della finestra e di timestamp solo se la richiesta di connessione include entrambe le opzioni.

14:31:32.145 Rcvd Ether Dst 00:00:a8:42:34:56  Src 00:00:a8:42:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID  44c, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  95e6, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.65007 to 164.152.77.217.7777
    seq  3289184624, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum 91e8,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 30 b8 95 1a  0  <<<4<<<< <<<08><
     10     0  0  0  0                                       <<<<

14:31:32.146 Xmit Ether Dst 00:00:a8:42:52:22  Src 00:00:a8:42:34:56 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID    0, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  9a32, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.65007
    seq  3172667591, ack 3289184625, window  8192, 20 data bytes, flags Syn Ack.
    X/Off 0a, Flags 12, Cksum 6b81,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a  1 35 72 23 30  <<<4<<<< <<<<5r#0
     10    b8 95 1a  0                                       8><<

Per impostazione predefinita, gli host Windows includono solo la dimensione massima del segmento, scala della finestra e il supporto per il riconoscimento selettivo . Senza l'opzione del timestamp nella richiesta di connessione, la risposta di STCP non includerà le opzioni del timestamp o della scala della finestra. Si noti che gli 1 inclusi nelle opzioni della finestra sono i NO-OP e servono a rendere il numero di byte delle opzioni un multiplo intero di 4. Il multiplo alla fine delle opzioni (0) alla fine delle opzioni nella risposta di STCP hanno lo stesso scopo.

14:54:02.635 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:23:54:52:18:6e Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   34, ID  a4f, Flg/Frg 4000, TTL 80,  Prtl  6
          Cksum  0c39, Src a4984d32, Dst a4984dd9
TCP from 164.152.77.50.13478 to 164.152.77.217.7777
    seq  3499417963, ack     n.a., window  8192, 12 data bytes, flags Syn.
    X/Off 08, Flags 02, Cksum 65c8,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b8  1  3  3  8   1  1  4  2              <<<8<<<< <<<<

14:54:02.636 Xmit Ether Dst 00:23:54:52:18:6e  Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   30, ID b3d5, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  e6b6, Src a4984dd9, Dst a4984d32
TCP from 164.152.77.217.7777 to 164.152.77.50.13478
    seq  3986949958, ack 3499417964, window  8192, 8 data bytes, flags Syn Ack.
    X/Off 07, Flags 12, Cksum 85e0,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  4  2  0  0                           <<<4<<

La parte che crea confusione arriva dopo che la connessione è stata stabilita. Il pacchetto seguente contiene solo 1 byte di dati, anche se i campo dei byte di dati indica 13. I primi 12 byte sono due opzioni NO-OP seguite da un'opzione di timestamp. Il byte di dati è lo 0x alla fine.

15:02:36.545 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:00:a8:42:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   35, ID  447, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  95f2, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.60312 to 164.152.77.217.7777
    seq  2814493687, ack 4102208833, window   128, 13 data bytes, flags Push Ack
+.
    X/Off 08, Flags 18, Cksum c9d0,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     1  1  8  a 2a 28 5d 8f  38 9f e0  a  0           <<<<*(]> 8>`<

Come faccio a distinguere tra opzioni e dati? Il Il valore X/Off è il numero di parole a 32 bit nell'intestazione TCP. Se non ci sono opzioni, questo valore è 5, quindi un valore di 8 indica l'aggiunta di tre parole a 32 bit, ovvero 12 byte in più.

Il pacchetto successivo è solo un riconoscimento di ricezione e non contiene dati. Si noti che l'offset è nuovamente 8, quindi l'opzione occupa 12 byte e la lunghezza dei dati è proprio 12.

15:02:39.758 Xmit Ether Dst 00:00:a8:42:52:22  Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   34, ID  48a, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  95b0, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.60312
    seq  4102208833, ack 2814493688, window   128, 12 data bytes, flags Ack.
    X/Off 08, Flags 10, Cksum a751,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     1  1  8  a 38 a0  2 91  2a 28 5d 8f              <<<<8 <> *(]>

Il pacchetto seguente è un esempio di segmento contenente un opzione di conferma selettiva con 3 blocchi di numeri di conferma. Notare il valore X/Off pari a 0f che indica 40 byte aggiuntivi ((15 – 5) * 4) nell'intestazione TCP che packet_monitor riporta come byte di dati.

9:52:39.491 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP   Ver/HL 45, ToS 60, Len   50, ID   59, Flg/Frg    0, TTL 35,  Prtl  6
          Cksum  4355, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
    seq  1652086450, ack 3779437719, window  4096, 40 data bytes, flags Ack.
    X/Off 0f, Flags 10, Cksum c834,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     1  1  8  a  2 9e 86 bd  3c 4b dd 57  1  1  5 1a  <<<<<<<< >K<W<<<<
     10    e1 45 f6 77 e1 45 f8 83  e1 45 f2 5f e1 45 f4 6b  <E<w<E<< <E<_<E<k
     20    e1 45 c9 6f e1 45 cb 7b                           <E<o<E<{

Il numero di conferma nell'intestazione TCP corrisponde edge destra edge byte ricevuti in modo continuativo. I blocchi di dati nell'opzione di conferma selettiva indicano i blocchi di dati che sono stati ricevuti. Gli spazi vuoti tra i blocchi rappresentano i byte che non sono stati ricevuti.

Sarebbe tutto molto più semplice se packet_monitor riportasse correttamente le opzioni invece di trattarle come dati. È stato aperto il ticket stcp-2963 per fare in modo che packet_monitor agisca proprio in questo modo. La correzione è prevista in una versione futura; fino ad allora, è necessario prestare attenzione al valore X/Off.

L'opzione relativa alla scala della finestra è quella che rischia di creare maggiore confusione. Il pacchetto seguente mostra una finestra di ricezione di soli 4096 byte.

9:52:38.975 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP   Ver/HL 45, ToS 60, Len   34, ID    8, Flg/Frg    0, TTL 35,  Prtl  6
          Cksum  43c2, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
    seq  1652086450, ack 3779392131, window  4096, 12 data bytes, flags Ack.
    X/Off 08, Flags 10, Cksum a3cf,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     1  1  8  a  2 9e 86 39  3c 4b dc e3              <<<<<>><K<<<

Si tratta di una finestra estremamente piccola, ma le dimensioni sono fuorvianti perché è attivo il window scaling. Come si fa a capirlo? L'unico modo per capirlo è aver osservato la fase iniziale di instaurazione della connessione. Nel caso seguente si può notare che sia il segmento SYN che quello SYN-ACK includono il opzione di window scaling e, in entrambi i casi, il valore di scala è 6; pertanto, la dimensione della finestra di 4096 (2^12) nel segmento sopra riportato viene spostata di 6 bit per ottenere la finestra effettiva di 262144 (2^18 o 256K) byte.

9:52:38.818 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP   Ver/HL 45, ToS 60, Len   3c, ID    5, Flg/Frg    0, TTL 35,  Prtl  6
          Cksum  43bd, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
    seq  1652086449, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum 29fd,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  2 18  3  3  6  4   2  8  a  2 9e 86 11  0  <<<<<<<< <<<<>><
     10     0  0  0  0

9:52:38.819 Xmit Ether Dst 00:13:d4:59:7a:da  Src 00:00:a8:41:34:56 Type 0800
+ (IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID    a, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  3d18, Src a4984dd9, Dst 866fc8b9
TCP from 164.152.77.217.53828 to 134.111.200.185.ftp-data
    seq  3779391082, ack 1652086450, window  8192, 20 data bytes, flags Syn Ack
+.
    X/Off 0a, Flags 12, Cksum 3b87,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 3c 4b dc cf  2  <<<<<<<< <<<<<K<
     10    9e 86 11  0                                       >><

Queste opzioni sono controllate dai parametri STCP.

come:  list_stcp_params    

Parametri STCP:

. . . .
dimensione massima del segmento IP più bassa [500-1480]       (min_mss)               576
. . . .
dimensione massima della finestra di invio [4096-1073725440]  (max_send_ws)           1073725440
numero massimo di finestre enormi [>=0]                  (max_huge_windows)      0
finestre enormi attuali                                                0
numero massimo di finestre da 256k [>=0]                  (max_256k_windows)      25
finestre da 256k attuali                                                0
. . . . .
Politica TCP RFC-1323 [disabilita/consenti/richiedi] (tcp_rfc_1323_policy)   richiedi
Scala finestra richiesta TCP [0-14]           (tcp_window_scale)      6
Politica SACK TCP [disabilita/consenti/richiedi]     (tcp_SACK_policy)       richiesta

come:

Il tcp_rfc_1323_policy indica se verranno utilizzati i timestamp. I valori del parametro sono disable/allow/request. Il valore predefinito request indica che l'opzione fa parte di un segmento di richiesta di connessione e, se richiesta in una richiesta di connessione ricevuta, farà parte del segmento di risposta. Un valore di allow indica che l'opzione non farà parte di un segmento di richiesta di connessione ma potrà far parte di una risposta, se la richiesta di connessione ricevuta la include. Il valore disable indica che l'opzione non farà parte di nessuno dei due tipi di segmento. Impostare il valore su disable indica anche che l'opzione window scale non farà parte del segmento.

Il opzione tcp_window_scale controlla il parametro di ridimensionamento. Un valore pari a zero indica all'host remoto che il ridimensionamento della finestra è supportato, ma di non ridimensionare la finestra di STCP.

15:48:43.409 Rcvd IP   Ver/HL 45, ToS  0, Len   3c, ID  450, Flg/Frg    0, TTL 3
+c,  Prtl  6
          Cksum  95e2, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.65410 to 164.152.77.217.7777
    seq  1987362195, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum b8b3,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 30 ca ac 69  0  <<<4<<<< <<<0J,i
     10     0  0  0  0                                                       

15:48:48.575 Xmit IP   Ver/HL 45, ToS  0, Len   3c, ID    2, Flg/Frg    0, TTL 3
+c,  Prtl  6
          Cksum  9a30, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.65410
    seq  3853608469, ack 1987362196, window  8192, 20 data bytes, flags Syn Ack.
    X/Off 0a, Flags 12, Cksum c550,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  0  4   2  8  a  1 47 89 66 30  <<<4<< < <<<<G>f0
     10    ca ac 69  0                                       J,i

Il tcp_sack_policy controlla l'opzione di conferma selettiva. I valori possono essere disable, allow e request e hanno esattamente lo stesso significato che hanno per l'opzione tcp_rfc_1323_policy.

Infine, grazie al supporto del window scaling è possibile avere finestre di dimensioni superiori al precedente limite massimo di 64K; pertanto, sono stati creati due nuovi pool di dimensioni delle finestre. Questi sono rappresentati dai pool max_256k_windows e max_huge_windows. È possibile regolare il numero massimo di socket in grado di pubblicizzare una finestra da 256K o di dimensioni ancora maggiori impostando i valori di max_256k_windows o max_huge_windows.

Il parametro max_send_ws riflette il fatto che la finestra di ricezione massima possibile dell'host remoto è ora pari a 2^30 (1073725440 corrisponde infatti a 2^30 – 2^14). Per un dato socket, la dimensione massima effettiva della finestra di invio sarà il valore minimo tra il parametro max_send_ws e la dimensione della finestra di ricezione dichiarata dall'host remoto.