Alterando o comportamento da janela deslizante do TCP

1

Todos sabemos que o controle de congestionamento do TCP usa aumento aditivo (linear) e redução multiplicativa ao ajustar o tamanho da janela deslizante. Existe uma maneira de alterá-lo para "diminuição linear"?

Quando um pacote é perdido, o TCP assume que o link está congestionado, reduzindo o tamanho da janela deslizante ao meio. Eu quero mudar esse comportamento, diminuindo a janela deslizante em 1 MSS (tamanho máximo do segmento).

Eu não sei se é possível em sistemas operacionais de código fechado, como o OS X ou o Windows, mas isso deve ser possível em programas de código aberto, já que não é uma opção que pode ser alternada, eu acho que tenho que mudar o código-fonte da implementação do TCP no sistema operacional.

Soluções para o OS X são preferidas, mas o Linux (Ubuntu) também é bom.

    
por Behdad 16.12.2014 / 21:04

1 resposta

1

Eu não sei muito sobre o Mac, mas ... inspeção da saída de

   sysctl -a | grep net.inet.tcp

mostrou que está ciente da existência de algoritmos de controle de congestionamento:

   net.inet.tcp.rfc1323: 1

habilita claramente a implementação da RFC1323, a diretiva IEEE sobre melhorias no TCP. No entanto, não há campo relacionado à escolha do CCA, que por sua vez sugere que o LEDBAT é a única opção disponível.

No Linux, em vez disso, os algoritmos de controle de congestionamento disponíveis são armazenados aqui:

 $ ls /lib/modules/'uname -r'/kernel/net/ipv4/
   ah4.ko        ip_gre.ko     tcp_bic.ko        tcp_illinois.ko  tcp_veno.ko      xfrm4_mode_beet.ko
   esp4.ko       ipip.ko       tcp_diag.ko       tcp_lp.ko        tcp_westwood.ko  xfrm4_mode_transport.ko
   gre.ko        ip_tunnel.ko  tcp_highspeed.ko  tcp_probe.ko     tcp_yeah.ko      xfrm4_mode_tunnel.ko
   inet_diag.ko  ip_vti.ko     tcp_htcp.ko       tcp_scalable.ko  tunnel4.ko       xfrm4_tunnel.ko
   ipcomp.ko     netfilter     tcp_hybla.ko      tcp_vegas.ko     udp_diag.ko

Para usar um, basta modificar o módulo relevante e modificar / proc / sys da seguinte forma:

  echo "westwood" > /proc/sys/net/ipv4/tcp_congestion_control 

A Wikipedia tem uma página informativa agradável e cristalina sobre algoritmos de controle de congestionamento. Em particular, o CCA padrão do Linux,

  # sysctl -a | grep net.ipv4 | grep congestion
  net.ipv4.tcp_allowed_congestion_control = cubic reno
  net.ipv4.tcp_available_congestion_control = cubic reno
  net.ipv4.tcp_congestion_control = cubic

O TCP-Cubic, é bem descrito aqui .

Em relação à sua pergunta, afirma-se que:

[CUBIC] ... is a less aggressive and more systematic derivative of BIC TCP, in which the window is a cubic function of time since the last congestion event, with the inflection point set to the window prior to the event.

Um ponto de inflexão é onde as curvas mudam o sinal de curvatura, isto é, vai de côncavo a convexo, ou vice-versa. Isso significa que, próximo a este ponto, a curva é quase exatamente linear , o primeiro termo de correção desaparecendo como descrito acima.

Assim, não é verdade que

TCP's congestion control uses ... multiplicative decrease when adjusting sliding window size

Isso depende do CCA. Além disso, o padrão no Linux, o TCP-Cubic, é efetivamente linear próximo ao último evento de congestionamento.

    
por 17.12.2014 / 16:46