Introdução ao Linux Support TFO (TCP Fast Open)

1. Visão geral do TFO

O TCP Fast Open ( TFO ) é uma extensão do TCP para simplificar os procedimentos de handshake e é usado para aumentar a velocidade de abertura das conexões entre as duas extremidades. Em resumo, dados realmente úteis são transmitidos durante o handshake de três vias do TCP. Esta extensão foi originalmente implementada em sistemas Linux, servidores Linux, navegadores Chrome em sistemas Linux ou outro software suportado em execução no Linux (como shadowocks). (Nota: Shadowsocks é um excelente software de fonte aberta para proxy Socks.)

Ele usa o cookie TFO no pacote SYN no início do handshake para verificar um cliente conectado anteriormente. Se a verificação for bem-sucedida, ela poderá começar a enviar dados antes que o pacote ACK final do handshake de três vias seja recebido, o que pula um desvio e reduz o atraso no início da transmissão. Esse cookie criptografado é armazenado no cliente e é definido no início da conexão. Então, toda vez que o cliente se conecta, esse cookie é retornado repetidamente. (Referência: Wikipedia )

2. Diagrama esquemático do TFO

O processo de conexão TCP comum é mostrado abaixo



O processo de conexão do TFO é o seguinte



Depois que o cliente se desconecta por um período, o processo de conexão é o seguinte

Pode-se observar que, após o uso do TFO, o tempo de conexão é reduzido por um atraso de RTT.

3. A abertura do TFO

A função TFO está integrada no kernel do Linux 3.7, portanto, o RHEL7 / CentOS7 é suportado, mas não está ativado por padrão.Use o seguinte método para habilitá-lo:

echo 3 > /proc/sys/net/ipv4/tcp_fastopen
#3的意思是开启TFO客户端和服务器端
#1表示开启客户端,2表示开启服务器端

Além do suporte ao kernel, os aplicativos também devem habilitar o suporte, por exemplo, o método de abertura nginx (1.5.8+) é o seguinte:

 server {
        listen 80 backlog=4096 fastopen=256 default;
        server_name _;

Quarto, suporte ao cliente TFO

O kernel após o Linux 3.7 pode ser iniciado manualmente. Os kernels após a versão 3.13 são ativados por padrão (o padrão é 1).
O Windows 10 tem 1607+ ativado por padrão (quando a atualização automática está ativada),
o navegador Edge padrão do Windows, versão 14352 ou posterior.
Versão do navegador Chrome no Linux e Android. A versão não é suportada no Windows.
O navegador Firefox está fechado por padrão e pode ser aberto manualmente.
O iOS 9 e OS X 10.11 da Apple podem ser suportados, mas podem não estar ativados por padrão.
Suportado pelo curl 7.49 e posterior no linux.

Cinco, teste TFO

Ativamos o TFO no servidor e configuramos o nginx para oferecer suporte ao TFO.
O cliente abre o TFO e as atualizações são atualizadas para a versão 7.61 . Em seguida, use curl para acessar a página HTTP para teste.
O cliente é o seguinte

# curl -s -o/dev/null --tcp-fastopen http://10.140.10.16/
使用ip tcp_metrics show可以看到cookie
# ip tcp_metrics show | grep "fo_cookie"
10.140.10.16 age 41.955sec tw_ts 282422045/42sec ago rtt 250us rttvar 250us cwnd 10 metric_5 2380 metric_6 1190 fo_mss 1460 fo_cookie 1640a20f99195995

O servidor captura o pacote da seguinte maneira: você pode ver o cookie enviado 1640a20f99195995.

20:17:10.533466 IP 10.140.12.45.28722 > 10.140.10.16.80: Flags [S], seq 1532602092, win 29200, options [mss 1460,sackOK,TS val 982198124 ecr 0,nop,wscale 9,tfo cookiereq,nop,nop], length 0
20:17:10.533518 IP 10.140.10.16.80 > 10.140.12.45.28722: Flags [S.], seq 108109466, ack 1532602093, win 28960, options [mss 1460,sackOK,TS val 282422044 ecr 982198124,nop,wscale 9,tfo cookie 1640a20f99195995,nop,nop], length 0


Use o comando a seguir para visualizar as estatísticas de conexão TFO

# grep '^TcpExt:' /proc/net/netstat | cut -d ' ' -f 87-92 | column -t
TCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenActiveFail TCPFastOpenPassive
9306 29958 2457 0 0 11

6. Outras questões

Os seguintes problemas não foram resolvidos:

  1. Por quanto tempo o cookie TFO do cliente será excluído, quem o manterá e o excluirá?
  2. O que exatamente significa a fila TFO do nginx? O que acontece quando a fila está cheia? Quão apropriada é a configuração do valor?
    A fila é um mecanismo de proteção de segurança para o servidor no RFC7413. Os pacotes de dados além da fila serão rebaixados para o modo de conexão comum sem fogão, ou seja, a função TFO falhará. No entanto, a configuração específica desse valor não é fácil de determinar.

7. Materiais de referência

http://martinbj2008.github.io/2016/11/23/what-is-tfo/
https://zhuanlan.zhihu.com/p/36239657
http://abcdxyzk.github.io/blog/2018/07 / 30 / kernel-tcp_metric /
https://tools.ietf.org/html/rfc7413

Publicado 59 artigos originais · 21 elogios · Mais de 20.000 visualizações

Acho que você gosta

Origin blog.csdn.net/tony_vip/article/details/105203109
Recomendado
Clasificación