Qual é o número máximo teórico de conexões TCP abertas que uma caixa Linux moderna pode ter

236

Supondo um desempenho infinito do hardware, uma caixa Linux pode suportar> 65536 abrir conexões TCP?

Entendo que o número de portas efêmeras (<65536) limita o número de conexões de um IP local para uma porta em um IP remoto.

A tupla (ip local, porta local, ip remoto, porta remota) é o que define exclusivamente uma conexão TCP; isso implica que mais de 65K conexões podem ser suportadas se mais de um desses parâmetros estiver livre. por exemplo, conexões com um único número de porta em vários hosts remotos a partir de vários IPs locais.

Existe outro limite de 16 bits no sistema? Número de descritores de arquivos, talvez?

fadedbee
fonte

Respostas:

350

Uma única porta de escuta pode aceitar mais de uma conexão simultaneamente.

Existe um limite de '64K' que é frequentemente citado, mas que é por cliente por porta do servidor e precisa ser esclarecido.

Cada pacote TCP / IP possui basicamente quatro campos para endereçamento; esses são:

source_ip source_port destination_ip destination_port
< client            > < server                      >

Dentro da pilha TCP, esses quatro campos são usados ​​como uma chave composta para corresponder pacotes a conexões (por exemplo, descritores de arquivo).

Se um cliente tiver muitas conexões com a mesma porta no mesmo destino, três desses campos serão os mesmos - source_portvaria apenas para diferenciar as diferentes conexões. As portas são números de 16 bits; portanto, o número máximo de conexões que qualquer cliente pode ter para qualquer porta do host é de 64K.

No entanto, vários clientes podem ter conexões de até 64 K na porta de algum servidor e, se o servidor tiver várias portas ou se for multi-homed, você poderá multiplicar ainda mais.

Portanto, o limite real são os descritores de arquivos. Cada conexão de soquete individual recebe um descritor de arquivo; portanto, o limite é realmente o número de descritores de arquivo que o sistema foi configurado para permitir e recursos para manipular. O limite máximo normalmente é superior a 300 K, mas é configurável, por exemplo, com sysctl .

Os limites realistas dos gabaritos normais são de cerca de 80K, por exemplo, servidores de mensagens Jabber de thread único.

Vai
fonte
3
Teoricamente, você pode ter mais de 64K conexões de saída se (a) usar SO_REUSEADDR e (b) direcionar endereços IP de destino diferentes. Mas os limites de memória do kernel provavelmente o impedirão primeiro.
Darron
4
O limite sysctl é para todo o sistema, certo? Há também um limite configurável com ulimit, que limita o número máximo de descritores de arquivo para um processo. Que é, por padrão muito menos do que 300K, normalmente 1024.
pacoverflow
1
Um pequeno detalhe técnico: uma máquina cliente também pode ter vários endereços IP atribuídos a partir de um roteador. Todos eles podem ser atribuídos a um único MAC ou essa máquina pode ter várias interfaces de rede física para endereços IP adicionais. O OP especificou 1 IP, mas é importante que outros não descartem mais endereços IP.
Todd
2
@ Will maravilhosamente explicado !! Muito útil ... gostaria de dar +100 upvotes ... obrigado :-)
Tom Taylor
1
Esteja ciente de que o tcp_fin_timeout bloqueia o mesmo soquete (origem, destino, combinação de portas) por mais 60 segundos por padrão, o que reduz bastante o número de conexões tcp realmente disponíveis entre dois sistemas, se as conexões forem desconectadas e reconectadas com freqüência. Esse problema pode ser minimizado permitindo a reutilização (tcp_tw_reuse = 1) de soquetes no estado TIME_WAIT (nem sempre é suportado) ou quebrando o padrão TCP / IP ao reduzir esse tempo limite para um valor mais baixo (geralmente funciona de qualquer maneira).
fgwaller
17

Se você estiver pensando em executar um servidor e tentar decidir quantas conexões podem ser atendidas em uma máquina, leia sobre o problema do C10k e os possíveis problemas envolvidos no atendimento a vários clientes simultaneamente.

Spaceghost
fonte
14
C10k tem 10 anos e não é mais divertido. [Leia isto] para ver como o C1024K pode ser combatido.
Chandranshu
@Chandranshu - você quis dizer metabrew.com/article/… ?
Mikko Rantalainen
1
@MikkoRantalainen - sim. Eu acho que existem melhores benchmarks disponíveis agora. Os caras do Phoenix já o enviaram para 2 milhões de conexões simultâneas.
Chandranshu
3
@Chandranshu - há uma demonstração da Dell com conexões 12M: mrotaru.wordpress.com/2013/06/20/…
Mikko Rantalainen
1
Há alguns anos: Intel Atom D2700, 2 GB de RAM, 1,2 milhões de conexões simultâneas. Os únicos problemas que tive foram com as caixas do Windows no trabalho de teste; estes iam regularmente barriga para cima durante a tentativa de DoS caixa Intel Atom ...
Klaws
12

Se você usou um soquete bruto ( SOCK_RAW) e reimplementou o TCP na terra do usuário, acho que a resposta é limitada neste caso apenas pelo número de (local address, source port, destination address, destination port)tuplas (~ 2 ^ 64 por endereço local).

É claro que seria necessário muita memória para manter o estado de todas essas conexões, e acho que você teria que configurar algumas regras do iptables para impedir que a pilha TCP do kernel se chateie e / ou responda em seu nome.

sbirch
fonte