Als we uitgaan van oneindige prestaties van hardware, kan een Linux-box dan >65536 open TCP-verbindingen ondersteunen?
Ik begrijp dat het aantal kortstondige poorten (<65536) het aantal verbindingen van één lokaal IP-adres naar één poort op één extern IP-adres beperkt.
De tuple (lokale ip, lokale poort, externe ip, externe poort) is wat een unieke TCP-verbinding definieert; houdt dit in dat meer dan 65K verbindingen kunnen worden ondersteund als meer dan één van deze parameters vrij is. bijv. verbindingen met een enkel poortnummer op meerdere externe hosts vanaf meerdere lokale IP’s.
Is er nog een limiet van 16 bits in het systeem? Aantal bestandsbeschrijvingen misschien?
Antwoord 1, autoriteit 100%
Een enkele luisterpoort kan meer dan één verbinding tegelijk accepteren.
Er is een ’64K’-limiet die vaak wordt genoemd, maar die is per client per serverpoorten moet worden verduidelijkt.
Elk TCP/IP-pakket heeft in principe vier velden voor adressering. Dit zijn:
source_ip source_port destination_ip destination_port
<----- client ------> <--------- server ------------>
Binnen de TCP-stack worden deze vier velden gebruikt als een samengestelde sleutel om pakketten af te stemmen op verbindingen (bijv. bestandsdescriptors).
Als een client veel verbindingen heeft met dezelfde poort op dezelfde bestemming, dan zullen drie van die velden hetzelfde zijn – alleen source_port
varieert om de verschillende verbindingen te onderscheiden. Poorten zijn 16-bits nummers, daarom is het maximale aantal verbindingen dat een bepaalde client kan hebben met een bepaalde hostpoort 64K.
Meerdere clients kunnen echter elk tot 64K verbindingen hebben met de poort van een bepaalde server, en als de server meerdere poorten heeft of een van beide multi-homed is, kunt u dat verder vermenigvuldigen.
Dus de echte limiet zijn bestandsdescriptors. Elke individuele socketverbinding krijgt een bestandsdescriptor, dus de limiet is in feite het aantal bestandsdescriptors waarvoor het systeem is geconfigureerd en de bronnen die kunnen worden verwerkt. De maximale limiet is meestal hoger dan 300K, maar kan worden geconfigureerd, b.v. met sysctl.
De realistische limieten waarover wordt geschept voor normale boxen liggen rond de 80K, bijvoorbeeld single-threaded Jabber-berichtenservers.
Antwoord 2, autoriteit 5%
Als u overweegt een server te gebruiken en probeert te beslissen hoeveel verbindingen er vanaf één machine kunnen worden bediend, wilt u misschien meer lezen over het C10k-probleemen de mogelijke problemen bij het gelijktijdig bedienen van veel klanten.
Antwoord 3, autoriteit 3%
Als je een onbewerkte socket (SOCK_RAW
) hebt gebruikt en TCP opnieuw hebt geïmplementeerd in userland, denk ik dat het antwoord in dit geval alleen wordt beperkt door het aantal (local address, source port, destination address, destination port)
tuples (~2^64 per lokaal adres).
Het zou natuurlijk veel geheugen kosten om de status van al die verbindingen bij te houden, en ik denk dat je een aantal iptables-regels moet instellen om te voorkomen dat de kernel-TCP-stack overstuur raakt en/of namens jou reageert .