2016-12-30 1 views
1

Ist dies, weil eine TCP-Verbindung eine persistente Verbindung ist, so dass der Server gleichzeitige Verarbeitung viele Anfrage benötigt, daher verschiedene Verbindungssockets benötigen?Warum benötigt die TCP-Socket-Programmierung zwei Sockets (einen Welcome-Socket und einen Connection-Socket), aber UDP benötigt nur einen?

Wenn jedoch eine UDP-Übertragung beendet wird, wird die nächste Verbindung zum selben Server-Socket initiiert, so dass UDP nur einen Socket benötigt.

Das sind meine Vermutungen. Ist das korrekt?

+0

TCP ist eine direkte Verbindung. Etwas muss mit etwas anderem verbunden sein. Daher Client-> Server-Beziehung. –

+0

Es ist nicht der * Programmierung * -Teil von TCP, die dies erfordern. Es ist die Art, wie TCP entworfen wurde (sogar alternative Programmiermodelle von TCP, wie die nicht existierenden Ströme von SVR4, hatten etwas Ähnliches). –

+0

Kumpel, Sie haben ein Chaos aus der Frage gemacht. Du hast Steckdosen, Pakete und Protokolle in einer Suppe gemischt.TCP-Socket und UDP-Socket sind zum größten Teil alle gleich. TCP und UDP-Protokolle unterscheiden sich, da TCP einen speziellen Handshake erfordert, der die Verbindung bestätigt. TCP-Protokoll verwendet TCP-Pakete und UDP verwendet UDP-Pakete, die bis auf ihre Header ähnlich sind. Sockets sind nur Software-API-Layer zu den genannten Protokollen. Bevor Sie solche Fragen starten, sollten Sie etwas mehr über das Networking lesen. – Dalen

Antwort

6

Der Grund dafür ist, dass TCP hat zwei verschiedene Arten von Staat, die Sie steuern möchten, während UDP nur einen hat.

Wenn TCP-Verbindungen an einem Port überwacht werden, muss der Netzwerkstapel die Portnummer und die Schnittstelle (n), die Sie mit diesem Socket überwachen, sowie die Liste der eingehenden TCP-Verbindungsanforderungen für diese Liste protokollieren Dieses Socket behält diesen Status in einer internen Datenstruktur, die mit dem Socket verknüpft ist, den Sie an listen()/bind()/accept() übergeben. Diese Datenstruktur wird so lange aktualisiert, wie der Socket existiert, und wird verworfen, wenn Sie diesen Socket schließen().

Sobald Sie eine TCP-Verbindung akzeptiert haben, hat der neue TCP-Socket, der von accept() zurückgegeben wird, einen eigenen verbindungsspezifischen Status, der getrennt verfolgt werden muss. Dieser Status besteht aus der IP-Adresse des Clients und Quellport, TCP-Paket-ID-Sequenzen, TCP-Fenstergröße und Sendefrequenz, die eingehenden Daten, die für diese TCP-Verbindung empfangen wurden, ausgehende Daten, die für diese TCP-Verbindung gesendet wurden (und möglicherweise später erneut gesendet werden müssen, wenn ein Paket gelöscht wird)), usw. All dies wird in einer separaten internen Datenstruktur gespeichert, die speziell diesem neuen Socket zugeordnet ist, der aktualisiert wird, bis der neue Socket geschlossen ist() 'd, an diesem Punkt wird er verworfen.

Beachten Sie, dass die Lebensdauern dieser beiden Arten von Zuständen sehr unabhängig voneinander sind. Sie können beispielsweise entscheiden, dass Sie keine weiteren eingehenden TCP-Verbindungen akzeptieren möchten und daher die erste schließen möchten (Connections-Accepting) Socket, während weiterhin der zweite (TCP-verbindungsspezifische) Socket für die Kommunikation mit dem bereits verbundenen Client verwendet wird. Oder Sie können das Gegenteil tun und entscheiden, dass Sie die Konversation mit diesem bestimmten Client nicht fortsetzen möchten, also schließen Sie den zweiten Socket, aber Sie möchten weiterhin mehr TCP-Verbindungen akzeptieren, so dass Sie den ersten Socket geöffnet lassen. Wenn nur ein einziger Socket vorhanden wäre, um alles zu handhaben, wäre es unmöglich, den einen oder anderen Kontext zu schließen. Ihre einzige Option wäre close() der einzelne Socket und damit verlieren Sie den ganzen Staat, auch die Teile, die Sie eigentlich behalten wollten. Das wäre bestenfalls peinlich.

UDP dagegen hat keine Ahnung von "Verbindungen akzeptieren", also gibt es nur eine Art von Zustand, und das ist die Menge gepufferter gesendeter und/oder empfangener Pakete (unabhängig von ihrer Quelle und/oder Ziel). Daher ist es im Allgemeinen nicht notwendig, mehr als einen UDP-Socket zu haben.

+0

Danke für deine Antwort. Es ist sehr hilfreich für mich. –

-1

UDP ist ein spezielles Protokoll, bei dem der Datenverlust zulässig ist. Daher wird in einem UDP-Szenario wird der Empfänger nicht an den Server zu halten, müssen die Berichterstattung zurück, die es erfolgreich die Pakete empfangen usw.

Bitte lassen Sie uns wissen, ob dies hilfreich dank

Verwandte Themen