Netzwerkprogrammierung Bei TCP-Anwendungen lauscht der Server im Voraus einen festen Port ab, der Client initiiert aktiv eine Verbindung und nach einem Drei-Wege-Handshake wird eine TCP-Verbindung hergestellt. Was ist die maximale Anzahl gleichzeitiger TCP-Verbindungen für einen einzelnen Computer?
So markieren Sie eine TCP-Verbindung. Bevor wir die maximale Anzahl von Verbindungen ermitteln, werfen wir zunächst einen Blick darauf, wie das System eine TCP-Verbindung markiert. Das System verwendet ein 4-Tupel, um eine TCP-Verbindung eindeutig zu identifizieren: {localip, localport, remoteip, remoteport}.
Maximale Anzahl von TCP-Verbindungen für einen Client: Sofern der Port nicht gebunden ist, wählt das System im Allgemeinen einen freien lokalen Port aus. Dieser Port ist exklusiv und kann nicht mit anderen TCPs geteilt werden Verbindungen. Der Datentyp des TCP-Ports ist unsignedshort, daher beträgt die maximale Anzahl lokaler Ports auf dem Linux-Serversystem nur 65536. Daher sind maximal 65535 Ports verfügbar. Wenn alle als Clients verwendet werden, beträgt die maximale Anzahl der TCP-Verbindungen 65535. Diese Verbindung kann mit verschiedenen Server-IPs verbunden werden.
Maximale Anzahl von TCP-Verbindungen für den Server. Der Server ist normalerweise auf einen lokalen Port festgelegt und wartet auf die Verbindungsanfrage des Clients. Ohne Berücksichtigung der Wiederverwendung von Adressen (die SO_REUSEADDR-Option von Unix) gibt es zwar mehrere IPs auf der Serverseite, der lokale Abhörport ist jedoch ebenfalls exklusiv. Daher gibt es im 4. nur remoteip (dh clientip) und remoteport (client). -Tupel des serverseitigen TCP-Ports) ist variabel, daher ist die maximale TCP-Verbindung die Anzahl der Client-IPs × die Anzahl der Client-Ports. Für IPV4 gilt unabhängig von Faktoren wie der IP-Adressklassifizierung und der Linux-Software das Maximum Die Anzahl der TCP-Verbindungen beträgt ungefähr 2 hoch 32 (Anzahl der IPs) ×2 hoch 16 (Anzahl der Ports). Linux-TCP-Verbindungslimit , d. h. die maximale Anzahl von TCP-Verbindungen auf einer einzelnen Serverseite beträgt ungefähr 2 hoch 48. Potenz.
Wie viele gleichzeitige TCP-Verbindungen können auf einem solchen einzelnen Server sein
Was oben angegeben ist, ist die theoretische maximale Anzahl von Verbindungen für eine einzelne Maschine. In tatsächlichen Umgebungen ist sie durch Maschinenressourcen, Betriebssysteme usw. begrenzt, insbesondere auf der Serverseite, und die maximale Anzahl gleichzeitiger TCP-Verbindungen ist weit entfernt vom Erreichen der theoretischen Obergrenze ab. Die Hauptgründe für die Begrenzung der Anzahl der Verbindungen unter Unix/Linux sind der Videospeicher und die Anzahl der zulässigen Dateideskriptoren (jede TCP-Verbindung belegt eine bestimmte Menge an Videospeicher und jeder Socket ist ein Dateideskriptor). sind grundsätzlich reservierte Ports. Unter der standardmäßigen 2.6-Kernelkonfiguration belegt jeder Socket nach dem Testen zwischen 15 und 20 KB. Zu den Parametern, die sich auf den von einem Socket belegten Speicher auswirken, gehören: rmem_maxwmem_maxtcp_rmemtcp_wmemtcp_memgrepskbuff/proc/slabinfo. Auf der Serverseite ist es kein Problem, den Videospeicher zu reduzieren und die maximale Anzahl von Dateideskriptoren und anderen Parametern zu ändern TCP-Verbindungen auf einer einzelnen Maschine sollen 100.000 überschreiten. Das amerikanische Unternehmen UrbanAirship hat in der Produktionsumgebung 500.000 gleichzeitige Benutzer erreicht. In praktischen Anwendungen, bei großen Netzwerkanwendungen, muss auch das C10K-Problem berücksichtigt werden.
Lassen Sie uns die beiden allgemeinen Bedeutungen von Dateihandle-Einschränkungen und Port-Einschränkungen erklären
Gesunder Menschenverstand 1: Dateizugriffsbeschränkungen
Kollegen, die Netzwerkserverprogramme unter Linux schreiben, müssen wissen, dass jede TCP-Verbindung einen Dateideskriptor belegt. Sobald dieser Dateideskriptor aufgebraucht ist, lautet der Fehler, der bei einer neuen Verbindung an uns zurückgegeben wird, „Socket/File:Can ‚topensemanyfiles‘“.
Zu diesem Zeitpunkt müssen Sie die Beschränkung des Betriebssystems hinsichtlich der maximalen Anzahl von Dateien verstehen, die geöffnet werden können.
Prozessbeschränkung
Die Ausführung von ulimit-n gibt 1024 aus, was darauf hinweist, dass ein Prozess nur bis zu 1024 Dateien öffnen kann. Wenn Sie also diese Standardkonfiguration verwenden, können Sie höchstens Tausende von TCP-Verbindungen gleichzeitig ausführen.
Vorübergehende Änderungen: ulimit-n1000000. Diese vorübergehenden Änderungen gelten nur für die aktuelle Nutzungsumgebung des aktuell angemeldeten Benutzers und werden ungültig, nachdem das System neu gestartet oder der Benutzer abgemeldet wurde.
Änderungen, die nach dem Neustart ungültig werden (aber ich habe es unter CentOS6.5 getestet und nach dem Neustart keine Ungültigkeit festgestellt): Bearbeiten Sie die Datei /etc/security/limits.conf, und der geänderte Inhalt ist
*softnofile1000000
*hardnofile1000000
Permanente Änderungen: Bearbeiten Sie /etc/rc.local und fügen Sie danach den folgenden Inhalt hinzu
ulimit-SHn1000000
Globale Einschränkungen
Die Ausführung von cat/proc/sys/fs/file-nr gibt 93440592026 aus, nämlich: 1. Die Anzahl der zugewiesenen Dateihandles, 2. Die Anzahl der zugewiesenen, aber nicht verwendeten Dateihandles, 3. Die maximale Anzahl der Dateihandles. Aber in der Kernel2.6-Version ist der Wert des zweiten Elements immer 0. Dies ist kein Fehler, sondern bedeutet tatsächlich, dass alle zugewiesenen Dateideskriptoren ohne Verschwendung verwendet wurden.
Wir können diesen Wert auf einen größeren Wert ändern und die Datei /etc/sysctl.conf mit Root-Rechten ändern:
fs.file-max=1000000
net.ipv4.ip_conntrack_max=1000000
filter.ip_conntrack_max=1000000
Gesunder Menschenverstand 2: Ist der Bereich der Portnummern begrenzt?
Die unteren Banner des Betriebssystems unter 1024 sind vom System reserviert und 1024-65535 werden von Benutzern verwendet. Da jede TCP-Verbindung eine Portnummer belegt, können wir bis zu mehr als 60.000 gleichzeitige Verbindungen haben. Ich denke, es gibt viele Studenten, die diese falschen Vorstellungen haben, oder? (Ich habe mich in der Vergangenheit immer so gefühlt)
Lass es uns analysieren
So markieren Sie eine TCP-Verbindung: Das System verwendet ein 4-Tupel, um eine TCP-Verbindung eindeutig zu markieren: {localip, localport, remoteip, remoteport}. Schauen wir uns die Erklärung von „accept“ in Kapitel 4 von „UNIX-Netzwerkprogrammierung: Band 1“ an, um einen Blick auf das Konzept zu werfen. Der zweite Parameter cliaddr stellt die IP-Adresse und Portnummer des Clients dar. Als Server verwenden wir diesen Port tatsächlich nur während der Bindung, was zeigt, dass die Portnummer 65535 keine Grenze für den Umfang der Parallelität darstellt.
Maximale Anzahl von TCP-Verbindungen zum Server: Der Server ist normalerweise an einem lokalen Port fixiert und wartet auf die Verbindungsanfrage des Clients. Ohne Berücksichtigung der Wiederverwendung von Adressen (die SO_REUSEADDR-Option von Unix) gibt es zwar mehrere IPs auf der Serverseite, der lokale Abhörport ist jedoch ebenfalls exklusiv. Daher gibt es im 4. nur remoteip (dh clientip) und remoteport (client). -Tupel der serverseitigen TCP-Verbindung) ist variabel, daher ist die maximale TCP-Verbindung die Anzahl der Client-IPs × die Anzahl der Client-Ports, unabhängig von Anreizen wie der IP-Adressklassifizierung , die maximale Anzahl von TCP-Verbindungen beträgt etwa 2 mal 32 mal Power (Anzahl der IPs) × 2 erhöht auf die 16. Potenz (Anzahl der Ports), also die maximale Anzahl von TCP-Verbindungen auf einer einzelnen Maschine auf der Serverseite ist ungefähr 2 hoch 48.
Das obige ist der detaillierte Inhalt vonAnalyse der maximalen Anzahl gleichzeitiger TCP-Verbindungen und Identifikationsmethoden für eine einzelne Maschine in der Netzwerkprogrammierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!