Qual è il numero massimo teorico di connessioni TCP aperte che può avere un moderno box Linux


236

Supponendo infinite prestazioni dall'hardware, può un box Linux supportare> 65536 connessioni TCP aperte?

Comprendo che il numero di porte effimere (<65536) limita il numero di connessioni da un IP locale a una porta su un IP remoto.

La tupla (ip locale, porta locale, ip remoto, porta remota) è ciò che definisce in modo univoco una connessione TCP; ciò implica che possono essere supportati più di 65 KB di connessioni se più di uno di questi parametri è gratuito. ad es. connessioni a un unico numero di porta su più host remoti da più IP locali.

C'è un altro limite di 16 bit nel sistema? Numero di descrittori di file forse?

Risposte:


350

Una singola porta di ascolto può accettare più di una connessione contemporaneamente.

Esiste un limite di "64 KB" che viene spesso citato, ma vale per client per porta del server e deve essere chiarito.

Ogni pacchetto TCP / IP ha sostanzialmente quattro campi per l'indirizzamento; questi sono:

source_ip source_port destination_ip destination_port
< client            > < server                      >

All'interno dello stack TCP, questi quattro campi vengono utilizzati come chiave composta per abbinare i pacchetti alle connessioni (ad es. Descrittori di file).

Se un client ha molte connessioni alla stessa porta sulla stessa destinazione, tre di questi campi saranno uguali - source_portvaria solo per differenziare le diverse connessioni. Le porte sono numeri a 16 bit, quindi il numero massimo di connessioni che un determinato client può avere a una determinata porta host è 64 KB.

Tuttavia, più client possono avere fino a 64 KB di connessioni alla porta di alcuni server e se il server ha più porte o è multihome, è possibile moltiplicare ulteriormente.

Quindi il vero limite sono i descrittori di file. A ogni singola connessione socket viene assegnato un descrittore di file, quindi il limite è in realtà il numero di descrittori di file che il sistema è stato configurato per consentire e le risorse da gestire. Il limite massimo è in genere superiore a 300 KB, ma è configurabile, ad esempio, con sysctl .

I limiti realistici di cui si vantano per le scatole normali sono circa 80 KB, ad esempio server di messaggistica Jabber a thread singolo.


3
In teoria puoi avere più di 64 KB di connessioni in uscita se (a) usi SO_REUSEADDR e (b) scegli come target indirizzi IP di destinazione diversi. Ma i limiti di memoria del kernel probabilmente ti fermeranno per primi.
Darron,

4
Il limite di sysctl è per l'intero sistema, giusto? C'è anche un limite configurabile con ulimit, che limita il numero massimo di descrittori di file per un processo. Questo è di default molto meno di 300K, di solito 1024.
pacoverflow

1
Un leggero tecnicismo: una macchina client può anche avere più indirizzi IP assegnati da un router. Questi possono essere tutti assegnati a un singolo MAC, oppure quella macchina può avere più interfacce di rete fisiche per ulteriori indirizzi IP. L'OP ha specificato 1 IP, ma è importante per gli altri non escludere più indirizzi IP.
Todd,

2
@Will splendidamente spiegato !! Molto utile ... Vorrei dare +100 voti ... grazie :-)
Tom Taylor il

1
Tenere presente che tcp_fin_timeout blocca lo stesso socket (sorgente, destinazione, combinazione di porte) per altri 60 secondi per impostazione predefinita, il che riduce notevolmente il numero di connessioni tcp effettivamente disponibili tra due sistemi, se le connessioni vengono disconnesse e ricollegate frequentemente. Questo problema può essere minimizzato consentendo di riutilizzare (tcp_tw_reuse = 1) socket nello stato TIME_WAIT (non sempre supportato) o rompendo lo standard TCP / IP nel ridurre questo timeout a un valore inferiore (di solito funziona comunque bene).
fgwaller,

17

Se stai pensando di eseguire un server e stai cercando di decidere quante connessioni possono essere servite da una macchina, potresti voler leggere il problema C10k e i potenziali problemi associati al servizio di molti client contemporaneamente.


14
C10k ha 10 anni e non è più divertente. [Leggi questo] per vedere come C1024K può essere affrontato.
Chandranshu,

@Chandranshu - intendevi metabrew.com/article/… ?
Mikko Rantalainen,

1
@MikkoRantalainen - sì. Penso che ora ci siano benchmark migliori disponibili. I ragazzi di Phoenix l'hanno già spinto a 2 milioni di connessioni simultanee.
Chandranshu,

3
@Chandranshu - c'è una demo Dell con connessioni 12M: mrotaru.wordpress.com/2013/06/20/…
Mikko Rantalainen,

1
Qualche anno fa: Intel Atom D2700, 2 GB di RAM, connessioni simultanee 1,2M. Gli unici problemi che ho avuto sono stati con le scatole di Windows nel lavoro di test; questi andavano regolarmente a gonfie vele mentre cercavano di fare la Intel Atom box ...
Klaws

12

Se hai usato un raw socket ( SOCK_RAW) e reimplementato TCP in userland, penso che la risposta sia limitata in questo caso solo dal numero di (local address, source port, destination address, destination port)tuple (~ 2 ^ 64 per indirizzo locale).

Naturalmente ci vorrebbe molta memoria per mantenere lo stato di tutte quelle connessioni, e penso che dovresti impostare alcune regole di iptables per evitare che lo stack TCP del kernel si arrabbi e / o risponda per tuo conto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.