2016-03-23 3 views
0

folgenden Artikel lesen: 10M concurrent websocketsmaintaning mehr als 65.535 Verbindungen auf einzelne IP-

So gibt es 1000 websocket Server auf Ports hören 10.000-11.000. Wenn eine Verbindung zu einem dieser Server hergestellt wird, gehe ich davon aus, dass sie die Kommunikation von einer zufällig eingerichteten TCP-Verbindung mit zufälligen Ports fortsetzen. Also, wie eine IP verwendet wird, und es gibt 64K Ports, wie kann man 10M Verbindungen aufrechterhalten? Werden Verbindungen durch IP-Port-Paare identifiziert? Können zwei verschiedene Verbindungen von verschiedenen IPs zu demselben Port hergestellt werden? Wie funktioniert das unter der Haube?

Antwort

2

Wenn eine Verbindung zu einem dieser Server hergestellt wird, gehe ich davon aus, dass sie die Kommunikation von einer zufällig eingerichteten TCP-Verbindung mit zufälligen Ports fortsetzen.

Falsche Annahme. Sie kommunizieren mit den Clients über die gleiche lokale Portnummer, die sie gerade hören.

Also, wie eine IP verwendet wird, und es 64K-Ports gibt, wie kann man 10M Verbindungen aufrechterhalten?

Kein Problem.

Werden Verbindungen durch IP-Port-Paare identifiziert?

Ja.

Können zwei verschiedene Verbindungen von verschiedenen IPs zu demselben Port hergestellt werden?

Ja.

Wie funktioniert das unter der Haube?

Siehe oben. IP: Portpaare. Du hast deine eigene Frage beantwortet.

0

Ich denke, der Teil, den Sie vermissen, ist eine TCP-Verbindung ist eigentlich zwei Paare von IP: PORT.

Eine für den Server, eine für den Client.

Die zuhörende Seite eines TCP-Sockels ist im Allgemeinen immer das gleiche IP/Port-Paar.

Beispiel: net.Listen("tcp", ":8080") hört auf Port 8080 (an allen Schnittstellen in diesem Fall)

Die Verbindungs ​​(Client) Seite ist in der Regel verwendet eine einzelne abgehende IP zusammen mit einem zufälligen Port.

Beispiel: net.Dial("tcp","server:8080) Wählt einen zufälligen verfügbaren kurzlebigen Port und versucht dann, eine Verbindung zu server:8080 herzustellen.

also im obigen Beispiel, daß die Verbindung ist: client.ip:32768 -> server.ip:8080 (wobei 32768 ist die ephemeren Port ausgewählt)

die beide eine einzigartige Verbindung herzustellen kombinierten Paare.

Die Serverseite kann so viele Verbindungen von einem einzelnen Client annehmen, wie verfügbare (clientseitige) Ports vorhanden sind. Es kann auch so viele Clients aufnehmen, wie es IP-Adressen gibt.

Betrachten Sie es als, für eine hörende Steckdose können Sie theoretisch 2^16 (Häfen) * 2^32 (ipv4 addrs) Verbindungen haben.

In der Realität gibt es reservierte IPs, Ports, Speicherbeschränkungen usw., so dass die Anzahl viel kleiner ist. Zum Beispiel ist der flüchtige Port-Bereich unter Linux 32768 - 61000. Was bedeutet, dass ich Fehler bekommen werde, wenn ich net.Dial("tcp", "server:8080") mehr als 28232 mal habe, da ich meinen kurzlebigen Portbereich für die gegebene Serveradresse erschöpft haben werde. Aber wenn der Server auf zwei separaten Ports abhört, kann ich 28232 zum ersten Port und einen weiteren 28232 zum zweiten Port tun.

Wenn man die Leute die 10MM Verbindungstests sehen zu tun, haben sie mehrere Client-IPs oder mehrere Server-IP-Adressen/Ports verwenden, um dieses zu erreichen (oder eine Kombination aus beiden zu bekommen 10MM eindeutige Client: IP/Server: IP-Paare)

2

Entschuldigung, dass ich meine Antwort komplett geändert habe.

Linux kann problemlos Millionen offener Sockets unterstützen, wenn die Maschine über genügend Arbeitsspeicher und Verarbeitungsleistung verfügt. Der TCP/IP-Stack ermöglicht dies, weil der Socket, den das Betriebssystem für ein bestimmtes TCP-Paket bestimmt, durch das Quell- und Ziel-IP und das Port-Tupel bestimmt wird.

Der Server, der das Websocket-Protokoll implementiert, muss nur einen einzelnen TCP-Socket abhören, der oft durch die HTTP- oder HTTPS-Portnummer definiert ist, aber nicht in diesem Beispiel. Im Rahmen des standardmäßigen TCP-Handshaking öffnen das Serverbetriebssystem und die Anwendung einen eindeutigen Socket für die TCP-Verbindung zum neuen Client, wenn die HTTP-Anforderung, die eine Websocketanforderung ist, empfangen wird. Das Websocket-Paket sorgt dafür, dass das auf diesem neuen Socket verwendete Protokoll von Standard-HTTP auf Websocket aktualisiert wird.

Im Beispiel wird eine Goroutine für jeden Websocket-Socket gestartet.

Die Clientseite, die Seite, die die TCP-Verbindungen initiiert, ist durch die Anzahl der kurzlebigen Ports begrenzt, die das Betriebssystem für einen bestimmten Zielhost und -port öffnen kann. Ehrlich gesagt, weiß ich nicht, ob dies eine Einschränkung des Client-Betriebssystems oder der TCP/IP-Spezifikation selbst ist.

+0

Wenn es alles über einen Socket ist, warum brauchen der Server und der Client all diese FDs und diesen riesigen Rückstand, und was ist alles über inkrementierende Portnummern? – EJP

+0

Meine erste Antwort war falsch. Die steigenden Portnummern sind jedoch nur erforderlich, weil der Test ein einzelnes Betriebssystem zum Ausführen der Clientseite verwendet. – WeakPointer

Verwandte Themen