it-swarm.com.de

Unterschied zwischen UNIX-Domänen-STREAM- und DATAGRAM-Sockets?

Diese Frage ist NICHT für den Unterschied zwischen STREAM-Typ und DATAGRAM-INTERNET-Buchsen. Ich weiß, dass STREAM-Sockets TCP verwenden, Datagram-Sockets verwenden UDP und das gesamte TCP, UDP-Material, Pakete, die in der Reihenfolge ankommen, ACK, NACK usw. Ich verstehe die Bedeutung dieser über das Internet.

F1) Wenn ich einen UNIX-Domänensocket als lokalen Socket erstelle, wie wäre es dann, wenn der Socket ein STREAM-Socket oder ein DATAGRAM-Socket ist. Dieser Socket-Typ würde die Daten in die Socket-Datei schreiben. Wäre das Protokoll in diesem Fall von Bedeutung, da ich keine Daten über ein Netzwerk übertrage? Besteht in diesem Fall die Gefahr eines Datenverlusts, wenn ich UNIX-basierte DATAGRAM-Sockets verwende?

F2) Bieten UNIX DATAGRAM-Sockets eine bessere Leistung als UNIX STREAM-Sockets?

F3) Wie kann ich mich für einen STREAM/DATAGRAM UNIX-basierten Socket in meiner Anwendung entscheiden?


Vielen Dank

49
Manik Sidana

Genau wie die Handbuchseite sagt, sind Unix-Sockel immer zuverlässig. Der Unterschied zwischen SOCK_STREAM und SOCK_DGRAM liegt in der Semantik des Datenverbrauchs aus dem Socket.

Stream-Socket ermöglicht das Lesen einer beliebigen Anzahl von Bytes, wobei die Bytereihenfolge erhalten bleibt. Mit anderen Worten, ein Sender schreibt möglicherweise 4 KB Daten in den Socket, und der Empfänger kann diese Daten byteweise verbrauchen. Der umgekehrte Weg ist auch richtig - der Sender kann mehrere kleine Nachrichten in die Buchse schreiben, die der Empfänger in einem Lesevorgang verbrauchen kann. Stream-Socket behält keine Nachrichtengrenzen bei.

Datagram-Socket hingegen behält diese Grenzen bei - ein Schreiben des Senders entspricht immer einem Lesevorgang des Empfängers (auch wenn der Puffer des Empfängers, der read(2) oder recv(2) kleiner ist als diese Nachricht) .

Wenn Ihr Anwendungsprotokoll kleine Nachrichten mit bekannter Obergrenze für die Nachrichtengröße enthält, sind Sie mit SOCK_DGRAM besser dran, da dies einfacher zu verwalten ist.

Wenn für Ihr Protokoll beliebig lange Nachrichtennachrichten erforderlich sind oder es sich lediglich um einen unstrukturierten Stream handelt (wie roher Ton oder etwas anderes), wählen Sie SOCK_STREAM und führen Sie die erforderliche Pufferung durch.

Die Leistung sollte gleich sein, da beide Typen nur den lokalen Kernel-Speicher durchlaufen, nur die Pufferverwaltung ist unterschiedlich.

56

Der Hauptunterschied besteht darin, dass einer der Verbindungen verbindungsbasiert (STREAM) und der andere verbindungslos (DGRAM) ist - der Unterschied zwischen Stream- und paketorientierter Kommunikation ist in der Regel weniger wichtig.

Mit SOCK_STREAM erhalten Sie weiterhin die gesamte Verbindungsverarbeitung, d. H. listen/accept, und Sie können feststellen, ob eine Verbindung von der anderen Seite geschlossen wird.

Beachten Sie, dass es auch einen SEQPACKET-Socket-Typ gibt, der immer noch verbindungsorientiert ist, aber die Nachrichtengrenzen beibehält (was Sie möglicherweise vor der Implementierung einer nachrichtenorientierten Schicht auf einem STREAM-Socket bewahren kann).

Ich würde erwarten, dass die Datenübertragungsleistung für alle diese Typen ähnlich ist. Der Hauptunterschied besteht darin, welche Semantik Sie wünschen.

17
cmeerw
  1. Ein wahrscheinlicher Unterschied sind die Nachrichtengrenzen. Datagramme werden als Ganzes ausgeliefert, wobei die Datagramme die natürlichen Nachrichtengrenzen sind. Mit Stream-Sockets können Sie N Bytes lesen und der Socket wird blockiert, bis N Bytes bereit sind. Dies bedeutet jedoch keine offensichtlichen Botschaftsgrenzen.
  2. Könnte sein. Ein Stream-Socket mit TCP benötigt mindestens den ersten 3-Wege-Handshake, um die Verbindung herzustellen. Ein UDP-Socket tut dies nicht.
  3. Wenn alle Dinge gleich sind, ist Geschwindigkeit ein Anliegen, ein Instrument und ein Maß. (Ich nehme an, Sie wissen bereits, dass nur ein TCP - Stream-Socket einen integrierten zuverlässigen In-Order-Transport bietet und nur Datagramm-Sockets zum Senden an multiple receiver verwendet werden können. 
3
Jens

Wenn sich die Clients und Server immer auf demselben Computer befinden und das Ziel minimale Latenz und maximale Bandbreite ist, verwenden Sie Shared Memory.

0
Arun Taylor