Qual è il numero massimo teorico di connessioni TCP aperte che una moderna macchina Linux può avere

Supponendo prestazioni infinite da hardware, un supporto per Linux box> 65536 apre connessioni TCP?

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 supportate più di 65K connessioni se più di uno di questi parametri è libero. es. 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?

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

C’è un limite di “64K” che viene spesso citato, ma che è per client per porta del server , e ha bisogno di chiarimenti.

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 usati come una chiave composta per abbinare i pacchetti alle connessioni (ad esempio i descrittori di file).

Se un client ha molte connessioni alla stessa porta sulla stessa destinazione, allora tre di questi campi saranno uguali – solo la 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 verso la porta di alcuni server, e se il server ha più porte o entrambi sono multi-homed, è ansible 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 ad es. Con sysctl .

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

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

Se hai usato un socket raw ( SOCK_RAW ) e SOCK_RAW implementato nuovamente TCP in userland, penso che la risposta sia limitata in questo caso solo dal numero di tuple ( (local address, source port, destination address, destination port) (~ 2 ^ 64 per 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 arrabbi e / o risponda per tuo conto.