Passive und aktive Sockets

8

Zitieren von diesem Socket-Lernprogramm :

  

Sockets gibt es in zwei Hauptgeschmacksrichtungen.   Ein aktiver Socket ist mit einem verbunden   Remote Active Socket über eine offene Daten   Verbindung ... Eine passive Steckdose ist   nicht verbunden, sondern erwartet ein   eingehende Verbindung, die wird   spawn einen neuen aktiven Socket einmal a   Verbindung ist hergestellt   ...

     

Jeder Port kann eine einzelne passive haben   Steckdose gebunden an sie, warten   eingehende Verbindungen und   mehrere aktive Sockets, jeweils   entspricht einem offenen   Verbindung am Port. Es ist als ob   Der Fabrikarbeiter wartet auf Neues   Nachrichten ankommen (er repräsentiert   die passive Buchse), und wenn einer   Nachricht kommt von einem neuen Absender, er   initiiert eine Korrespondenz (a   Verbindung) mit ihnen durch   jemand anderen delegieren (ein aktiver   Socket), um das Paket tatsächlich zu lesen   und antworte auf den Absender, wenn   notwendig. Dies erlaubt die Fabrik   Arbeiter frei zu sein, um neu zu empfangen   Pakete.   ...

Dann erklärt das Lernprogramm, dass der aktive Socket nach dem Herstellen einer Verbindung weiterhin Daten empfängt, bis keine verbleibenden Bytes mehr vorhanden sind, und schließt dann die Verbindung.

Was ich nicht verstanden habe, ist folgendes: Angenommen, es gibt eine eingehende Verbindung zum Port und der Sender möchte alle 20 Minuten ein paar kleine Daten senden. Wenn der aktive Socket die Verbindung schließt, wenn keine verbleibenden Bytes vorhanden sind, muss der Sender jedes Mal, wenn er Daten senden möchte, erneut eine Verbindung zum Port herstellen? Wie halten wir eine einmal etablierte Verbindung länger aufrecht? Kannst du mir sagen, was ich hier vermisse?

Meine zweite Frage ist, wer bestimmt die Grenze der gleichzeitig aktiven Sockets?

    
aslisabanci 14.01.2011, 22:50
quelle

3 Antworten

6

Der Sender sollte in regelmäßigen Abständen ein KEEPALIVE-Paket senden, um die Verbindung aufrecht zu erhalten. Das Format des KEEPALIVE hängt vom Protokoll ab. Es könnte so klein wie ein einzelner NULL im TCP-Datensegment sein.

Was die zweite Frage betrifft ... hängt es von der I / O ab. Wenn es E / A blockiert, möchten Sie nur eine bestimmte Anzahl von Threads auf Ihrem Computer ausführen, so dass Sie nicht viele Clients haben können. Wenn es nicht blockiert, können Sie viel mehr Clients haben. Programmiersprachen sollten sowohl blockierende als auch nicht blockierende E / A unterstützen. (Ich weiß, dass Java das tut.)

Es hängt auch von Dingen wie Bandbreite, Datentransfer für jeden Client, Speicher, Taktgeschwindigkeit usw. ab. Nicht blockierend vs. blockierend kann jedoch einen großen Unterschied in der Anzahl der Clients ausmachen, die Sie akzeptieren können. Sie können wahrscheinlich nicht mehr als 5-10 Clients blockieren, ohne dass Ihr Server abstürzt ... aber Sie können Tausende haben, wenn Sie nicht blockieren.

    
ktm5124 14.01.2011, 22:51
quelle
3

Bitte verwirren Sie nicht die tatsächlichen Pakete, die von der TCP / IP-Implementierung über das Netzwerk und die Interaktion zwischen Ihrem Programm und einer Bibliothek gesendet werden, die TCP / IP implementiert.

Der Socket ist nur eine Abstraktion, die Ihrem Programm von der TCP / IP-Implementierung (Bibliothek oder Kernel-OS) präsentiert wird. Sie können den Socket als Verbindung zur Pipe visualisieren (localIP: port-remoteIP: port). Ihr Programm öffnet den Socket, überträgt Daten über den Socket und schließt den Socket, wenn er nicht mehr benötigt wird, um Ressourcen freizugeben. Das ist normaler Fluss. Die TCP / IP-Implementierung kann den Socket jedoch aus eigenen gültigen Gründen schließen. Einige dieser Gründe: Netzwerkzugangs-Kabeltrennung, Netzwerk-Routingfehler, Serverausfall usw. Ihr Programm kann tcp / ip socket geschlossen finden, selbst wenn es nicht geschlossen wurde.

Nun Ihre erste Frage, was mache ich, wenn mein Programm kleine Datensegmente mit langer Pause zwischen ihnen sendet. Die Antwort ist: hängt davon ab, wie lange die Pause ist und welches Programm Sie auf der anderen Seite hört. Die meisten TCP / IP-Implementierungen haben eine Vorstellung von Verbindungstimeout, um Abstraktionen zuverlässiger Verbindungen über reale unzuverlässige Netzwerke zu ermöglichen. Wenn Ihr Programm also länger als tcp / ip timeout pausiert, wird Ihr Socket von der Library geschlossen und Sie müssen den Socket erneut öffnen. Das kann auch dazu führen, dass Sie die Kommunikation wieder neu starten, abhängig von einem Programm, das auf der anderen Seite der TCP / IP-Verbindungsleitung auf Sie wartet.

Es gibt Möglichkeiten, das tcp / ip-Timeout zu erhöhen und am Leben zu halten. Diese können als Teil der Netzwerkkonfiguration, der Server-Softwarekonfiguration am anderen Ende oder durch explizite Aufforderung zum Offenhalten des Sockets durch Einstellen der KEEPALIVE-Parameter in Ihrem tcp / ip-Bibliotheksaufruf erfolgen. Wäre es noch offen oder nicht abhängig. Die vollständigen Details darüber, wie tcp / ip den Socket geöffnet hält, sollten Sie nicht verwirren, da er nichts mit Ihrem Code zu tun hat. TCP / IP hat viele Einstellungen und verschiedene Timeouts, um Ihrem Programm die Illusion einer stabilen, zuverlässigen Verbindung zu vermitteln. Der gute Teil ist alles aus Ihrem Programmcode versteckt, solange Sie es nicht missbrauchen. Halten Sie Ihre Pause in wenigen Sekunden :) Eine Reihe von Timeout-Einstellungen funktioniert möglicherweise gut für kleine Anwendungen in einem zuverlässigen lokalen Netzwerk und funktioniert nicht für Anwendungen mit hoher Auslastung oder über Kontinentkonnektivität. Jede spezifische Situation hat ihre eigene Lösung, oft mehr als nur eine.

In dieser speziellen Frage "um einige kleine Daten alle 20 Minuten zu senden" würde ich Ihnen empfehlen, die Socket-Verbindung für jede Kommunikation zu schließen und zu öffnen. Die Zeit, um einen zu öffnen, ist weniger als eine Sekunde und sollte sich nicht auf Ihre Kommunikation auswirken. Im Gegenzug erhalten Sie weniger Komplexität in Ihrem Kommunikationsprotokoll. Receiver startet immer neu bei einer neuen Socket-Verbindung und beide Systeme können über 20 Minuten freie Ressourcen in der TCP / IP-Kommunikation genießen, wenn Sie sie nicht benötigen.

    
smile-on 16.06.2015 16:56
quelle
0

Erste Frage: Ja, sobald ein Socket geschlossen ist, müssen Sie einen Open-Befehl ausführen, um die Kommunikation erneut zu initiieren.

Zweite Frage: Sie machen. Wenn Sie möchten, können Sie 64k-Verbindungen zu Ihrem Server erstellen und Port-Erschöpfung erleiden (ich empfehle das nicht). Wie ktm5124 sagte, hängt alles von Ihrer Anwendung ab. Es gibt verschiedene Möglichkeiten, Ihren Server skalierbar zu machen, einschließlich der Verwendung von asynchronen E / A und eines Thread-Pools zur Verarbeitung von Clientanforderungen.

    
SRM 14.01.2011 23:00
quelle

Tags und Links