Pular para o conteúdo principal
Primeiro um pequeno histórico, o TCP tem um conceito chamado tamanho máximo do segmento (MSS). Este é o maior segmento (de dados) que a pilha TCP aceitará. Ele é anunciado para o ponto remoto no segmento SYN quando a conexão é estabelecida. A seguinte decodificação do pacote mostra o segmento SYN com a opção TCP MSS destacada. Todas as opções TCP têm o mesmo formato, 1 byte para o número da opção, 2 neste caso, 1 byte para o comprimento total da opção (4) e o valor da opção, neste caso 5b4 hexadecimal ou 1460 decimal.

packet_monitor -interface #sdlmux.m16.11-3 -hex_dump -numeric  -time_stamp -verbo
+se -pkt_hdr -filter -host 10.64.77.50
dir                                                 icmp
type
+        tcp
hh:mm:ss.ttt dir   len proto source             destination         src  port  ds
+t port  type
10:11:56.751 Xmit Ether Dst 00:23:54:52:18:6e  Src 00:00:a8:43:52:22  Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   2c, ID be0b, Flg/Frg    0, TTL 3c,  Prtl 6
Cksum  dcdd, Src a404d80, Dst a404d32
TCP from 10.64.77.128.55911 to 10.64.77.50.telnet
seq  1305537174, ack     n.a., window  8192, 4 data bytes, flags  Syn.
X/Off 06, Flags 02, Cksum 815d,  Urg-> 0000
offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .   0...4...8...C...
0     2  4  5 b4                                        <<<4
Para uma conexão feita a um host em uma rede local, a STCP usa um valor de 1460. Uma vez que você acrescenta em todas as despesas gerais de protocolo, você acaba com um quadro Ethernet de 1518 bytes - o tamanho máximo do quadro Ethernet. Para conexões feitas a hosts em segmentos não locais, o STCP usa um valor derivado do parâmetro min_mss. O uso do valor padrão min_mss resultará em um valor MSS de 536. Este valor é o tamanho mínimo que todos os equipamentos de rede baseados em IP, ou seja, roteadores devem estar dispostos a encaminhar sem fragmentação de IP, a especificação que estabeleceu 536 como mínimo foi escrita em 1983 na RFC 879 - "The TCP Maximum Segment Size and related Topics".

 

Hoje é provável que todos os seus roteadores possam lidar com um tamanho maior. Portanto, você pode elevar o mínimo STCP de 536 para algo maior. O quanto maior é a questão-chave. O perigo de torná-lo muito grande é a fragmentação. O pior cenário, mas o mais fácil de diagnosticar, é que o roteador optará por descartar o segmento TCP ao invés de fragmentá-lo. Neste caso, você será capaz de estabelecer uma conexão, mas ao transferir dados a conexão falhará. Um traço no host de envio mostrará múltiplas retransmissões de grandes segmentos TCP até que o tempo de conexão se esgote. O rastreamento também pode mostrar mensagens inalcançáveis de destino ICMP do roteador que está descartando o segmento. Se o roteador optar por fragmentar o segmento, provavelmente dará baixa prioridade ao processo de fragmentação, isto pode realmente resultar em uma redução da taxa de transferência. Também a probabilidade de perder o segmento devido a corrupção ou congestionamento aumenta com o número de fragmentos. A maneira mais fácil de saber se este é o caso é executando um rastreamento de monitor de pacotes no módulo. Se os segmentos TCP entrarem como fragmentos, você sabe que ocorreu fragmentação.

 

Os três quadros Ethernet seguintes representam um segmento TCP fragmentado em três partes. Pode-se dizer que o primeiro frame é um fragmento porque o valor Flg/Frg é 2000. O 2 indica que o bit Mais Fragmentos está definido e o 000 é o deslocamento do fragmento, neste caso 0 indica que é o primeiro fragmento. O monitor de pacotes na verdade sinaliza os próximos 2 quadros como fragmentos. O valor Flg/Frg no quadro 2 é 2048, novamente o 2 indica que o bit Mais Fragmentos está definido e o 48 é o offset (em múltiplos de 8 bytes) dos dados no datagrama IP original. O terceiro frame tem um Flg/Frag de apenas 90, ou mais precisamente 0090. Como o bit Mais Fragmentos é 0, sabemos que este é o último fragmento. Sabemos que todos estes frames pertencem juntos porque todos eles têm o mesmo valor de IP ID, 2e87. O comprimento dos dados no primeiro frame é uma indicação do valor MSS que deve ser definido, neste caso 556.
 
15:52:27.081 Rcvd Ether Dst 00:00:a8:43:52:22  Src 00:12:3f:82:57:10 Type 0800 +(IP) IP   Ver/HL 45, ToS  8, Len  254, ID 2e87, Flg/Frg 2000, TTL 3f,  Prtl  6 Cksum  1422, Src c0a86432, Dst a404d80 TCP from 192.168.100.50.32781 to 10.64.77.128.ftp-data seq   568258166, ack  840605671, window  5440, 556 data bytes, flags Ack. X/Off 05, Flags 10, Cksum d149,  Urg-> 0000 offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0…4… 8…C… 0    35 36 37 38 39 30 31 32  33 34 35 36 37 38 39 30 * 5678901234567890 10    31 32 33 34 35 36 37 38  39 30 31 32 33 34 35 36 * 1234567890123456 20    37 38 39 30 31 32 33 34  35 36 37 38 39 30 31 32 * 7890123456789012 30    33 34 35 36 37 38 39 30  31 32 33 34 35 36 37 38 * 3456789012345678 40    39 30 31 32 33 34 35 36  37 38 39 30 31 32 33 34 * 9012345678901234 50    35 36 37 38 39 30 31 32  33 34 35 36 37 38 39 30 * 5678901234567890 60     d  a 31 32 33 34 35 36  37 38 39 30 31 32 33 34 * <<12345678901234 70    35 36 37 38 39 30 31 32  33 34 35 36 37 38 39 30 * 5678901234567890

 

 

 

15:52:33.793 Rcvd Ether Dst 00:00:a8:43:52:22  Src 00:12:3f:82:57:10 Type 0800 +(IP) IP   Ver/HL 45, ToS  8, Len  254, ID 2e87, Flg/Frg 2048, TTL 3f,  Prtl  6 Cksum  13da, Src c0a86432, Dst a404d80 TCP from 192.168.100.50. to 10.64.77.128.  *fragments*,  576 bytes data offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0…4… 8…C… 0    31 32 33 34 35 36 37 38  39 30 31 32 33 34 35 36 * 1234567890123456 10    37 38 39 30 31 32 33 34  35 36 37 38 39 30 31 32 * 7890123456789012 20    33 34 35 36 37 38 39 30  31 32 33 34 35 36 37 38 * 3456789012345678 30    39 30  d  a 31 32 33 34  35 36 37 38 39 30 31 32 * 90<<123456789012 40    33 34 35 36 37 38 39 30  31 32 33 34 35 36 37 38 * 3456789012345678 50    39 30 31 32 33 34 35 36  37 38 39 30 31 32 33 34 * 9012345678901234 60    35 36 37 38 39 30 31 32  33 34 35 36 37 38 39 30 * 5678901234567890 70    31 32 33 34 35 36 37 38  39 30 31 32 33 34 35 36 * 1234567890123456

 

 

15:52:33.793 Rcvd Ether Dst 00:00:a8:43:52:22  Src 00:12:3f:82:57:10 Type 0800 +(IP) IP   Ver/HL 45, ToS  8, Len   f8, ID 2e87, Flg/Frg   90, TTL 3f,  Prtl  6 Cksum  34ee, Src c0a86432, Dst a404d80 TCP from 192.168.100.50. to 10.64.77.128.  *fragments.,  228 bytes data offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0…4… 8…C… 0    35 36 37 38 39 30 31 32  33 34 35 36 37 38 39 30 * 5678901234567890 10    31 32 33 34 35 36 37 38  39 30 31 32 33 34 35 36 * 1234567890123456 20    37 38 39 30 31 32 33 34  35 36 37 38 39 30 31 32 * 7890123456789012 30    33 34 35 36 37 38 39 30  31 32 33 34 35 36 37 38 * 3456789012345678 40    39 30 31 32 33 34 35 36  37 38 39 30 31 32 33 34 * 9012345678901234 50    35 36 37 38 39 30  d  a  31 32 33 34 35 36 37 38 * 567890<<12345678 60    39 30 31 32 33 34 35 36  37 38 39 30 31 32 33 34 * 9012345678901234 70    35 36 37 38 39 30 31 32  33 34 35 36 37 38 39 30 * 5678901234567890

 

O problema com o aumento do valor do MSS é que ele o aumenta para todas as conexões TCP. Não se pode aumentá-lo para apenas um ou alguns destinos. Portanto, você precisa testar cuidadosamente esta mudança para avaliar seu efeito em todas as suas conexões.
Você pode ver o valor atual do MSS e modificá-lo com os dois comandos a seguir:
analyze_system -request_line 'list_stcp_params min_mss' -quit
OpenVOS Release 17.0.1as, analyze_system Release 17.0.1as
Current process is 357, ptep 8FA86000, Noah_Davids.SysAdmin

maximum tcp segment size [500-1480] (min_mss) 556

ready 10:52:07
analyze_system -request_line 'set_stcp_param min_mss 1480' -quit 
OpenVOS Release 17.0.1as, analyze_system Release 17.0.1as
Current process is 357, ptep 8FA86000, Noah_Davids.SysAdmin

Changing maximum tcp segment size (min_mss)
from 556 to 1480
ready 10:52:24
O nome do parâmetro, min_mss, implica que é o valor MSS, mas é realmente o valor MSS mais o comprimento do cabeçalho TCP de 20 bytes. Para o exemplo acima, você definiria o valor min_mss como 556+20 ou 576.

 

Então, quanto de impulso você pode obter ao aumentar o valor do MSS? Devido à prevalência das conexões VPN que adicionam bytes de sobrecarga, não recomendo definir o valor máximo de 1480 (TCP MSS real de 1460). Eu sugiro algo um pouco menor, digamos 1220 (MSS 1200 real) bytes. Supondo que você esteja enviando 10 megabytes de dados usando segmentos de 536 bytes, serão necessários 18657 quadros, o número total de bytes - incluindo overhead (preâmbulo Ethernet de 8 bytes + cabeçalho Ethernet de 14 bytes + cabeçalho IP de 20 bytes + cabeçalho TCP de 20 bytes + reboque Ethernet de 4 bytes + um efetivo 12 bytes para o intervalo entre quadros Ethernet) será de 11.455.246 bytes. Se você estiver usando segmentos de 1200 bytes, serão necessários 8334 quadros com um número total de bytes 10.650.052 ou um pouco mais de 9% menor. Entretanto, tenha em mente que o valor do MSS é um anúncio do maior segmento que será aceito, não há nenhuma exigência de que o anfitrião remetente realmente envie segmentos tão grandes. Entretanto, supondo que sim e que não haja outros gargalos de garrafa, você acaba de receber uma bota de 9% na taxa de transferência.

2 Comentários

© 2024 Stratus Technologies.