2010-02-25 18 views
185

Supponendo prestazioni infinite da hardware, può un supporto per Linux box> 65536 connessioni TCP aperte?Qual è il numero massimo teorico di connessioni TCP aperte che una moderna macchina Linux può avere

Capisco 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 supportate più di 65K connessioni se più di uno di questi parametri è libero. per esempio. connessioni a un singolo 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?

risposta

267

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

C'è un limite '64K' che viene spesso citato, ma quello è per client per porta del server e deve essere chiarito.

Ogni pacchetto TCP/IP ha fondamentalmente 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 sono utilizzati come chiave composta da abbinare pacchetti ai collegamenti (ad esempio descrittori di file).

Se un client ha molte connessioni alla stessa porta sulla stessa destinazione, allora tre di questi campi saranno uguali: solo source_port varia per differenziare le diverse connessioni. Le porte sono numeri a 16 bit, quindi il numero massimo di connessioni che un dato client può avere su una data porta host è 64K.

Tuttavia, più client possono avere fino a 64 KB di connessioni ad alcune porte del server, e se il server ha più porte o è multi-homed, è possibile moltiplicare ulteriormente.

Quindi il vero limite sono i descrittori di file. Ad 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 K, ma è configurabile per es. con sysctl.

I limiti realistici che si possono vantare per le normali scatole sono circa 80 K per esempio i server di messaggistica Jabber a thread singolo.

+1

È possibile avere in teoria più di 64.000 connessioni in uscita se (a) si utilizza SO_REUSEADDR e (b) si scelgono indirizzi IP di destinazione diversi. Ma i limiti della memoria del kernel probabilmente ti fermeranno prima. – Darron

+0

@Darron pensavo che SO_REUSEADDR fosse per i server che si legavano al riavvio? – Will

+0

Sì, anche questo. Rilassa sostanzialmente i primi controlli per i conflitti di indirizzi per i nuovi socket. – Darron

13

Se si sta pensando di eseguire un server e si sta tentando di decidere quante connessioni possono essere servite da una macchina, si consiglia di leggere su the C10k problem e sui potenziali problemi connessi al servizio di molti client contemporaneamente.

+10

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

+5

@Chandranshu - leggi cosa? Immagino tu abbia voluto inserire un collegamento nei commenti ... – Krease

+0

urto 11 altro da fare ... –

7

Se è stato utilizzato un raw socket (SOCK_RAW) e TCP ri-implementato in spazio utente, credo che la risposta è limitata in questo caso solo per il numero di (local address, source port, destination address, destination port) tuple (~ 2^64 per ogni indirizzo locale).

Ovviamente 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 disturbi &/o rispondere per tuo conto .

Problemi correlati