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.
