Was ist der Unterschied zwischen Streams und Datagrammen in der Netzwerkprogrammierung?

131

Was ist der Unterschied zwischen Sockets (Stream) und Sockets (Datagrammen)? Warum übereinander verwenden?

RoR
quelle

Antworten:

303

Vor langer Zeit habe ich eine großartige Analogie gelesen, um den Unterschied zwischen den beiden zu erklären. Ich kann mich nicht erinnern, wo ich es gelesen habe, daher kann ich dem Autor die Idee leider nicht zuschreiben, aber ich habe der Kernanalogie trotzdem viel eigenes Wissen hinzugefügt. Also los geht's:

Ein Stream-Socket ist wie ein Telefonanruf - eine Seite tätigt den Anruf, die andere antwortet, Sie sagen einander Hallo (SYN / ACK in TCP) und tauschen dann Informationen aus. Sobald Sie fertig sind, verabschieden Sie sich (FIN / ACK in TCP). Wenn sich eine Seite nicht verabschiedet, ruft sie normalerweise die andere zurück, da dies ein unerwartetes Ereignis ist. Normalerweise stellt der Client die Verbindung zum Server wieder her. Es gibt eine Garantie dafür, dass Daten nicht in einer anderen Reihenfolge als der von Ihnen gesendeten ankommen, und es gibt eine angemessene Garantie dafür, dass Daten nicht beschädigt werden.

Ein Datagramm-Socket ist wie das Übergeben einer Notiz in der Klasse. Stellen Sie sich den Fall vor, in dem Sie sich nicht direkt neben der Person befinden, an die Sie die Notiz weitergeben. Die Notiz wird von Person zu Person übertragen. Es kann sein Ziel nicht erreichen und es kann geändert werden, bis es dort ankommt. Wenn Sie zwei Notizen an dieselbe Person weitergeben, kommen diese möglicherweise in einer von Ihnen nicht beabsichtigten Reihenfolge an, da die Route, die die Notizen durch das Klassenzimmer nehmen, möglicherweise nicht dieselbe ist und eine Person eine Notiz möglicherweise nicht so schnell wie eine andere weitergibt .

Sie verwenden also einen Stream-Socket, wenn es wichtig ist, dass die Informationen in Ordnung und intakt sind. Dateiübertragungsprotokolle sind hier ein gutes Beispiel. Sie möchten keine Datei herunterladen, deren Inhalt zufällig gemischt und beschädigt ist!

Sie würden einen Datagramm-Socket verwenden, wenn die Reihenfolge weniger wichtig ist als die rechtzeitige Lieferung (denken Sie an VoIP- oder Spielprotokolle), wenn Sie nicht den höheren Overhead eines Streams wünschen (aus diesem Grund ist DNS in erster Linie ein Datagrammprotokoll, damit Server dies können sehr schnell auf viele, viele Anfragen gleichzeitig reagieren) oder wenn es Ihnen egal ist, ob die Daten jemals ihr Ziel erreichen.

Um den VoIP- / Spielfall zu erweitern, enthalten solche Protokolle einen eigenen Datenordnungsmechanismus. Wenn jedoch ein Paket beschädigt ist oder verloren geht, möchten Sie nicht auf das Stream-Protokoll (normalerweise TCP) warten, um eine Anforderung zum erneuten Senden auszugeben. Sie müssen sich schnell erholen. Die Wiederherstellung von TCP kann bis zu einigen Minuten dauern, und für Echtzeitprotokolle wie Spiele oder VoIP sind sogar drei Sekunden möglicherweise nicht akzeptabel! Die Verwendung eines Datagrammprotokolls wie UDP ermöglicht es der Software, sich extrem schnell von einem solchen Ereignis zu erholen, indem die verlorenen Daten einfach ignoriert oder früher als TCP erneut angefordert werden.

VoIP ist ein guter Kandidat, um die verlorenen Daten einfach zu ignorieren - eine Partei würde nur eine kurze Lücke hören, ähnlich wie es passiert, wenn sie mit jemandem auf einem Handy spricht, wenn dieser einen schlechten Empfang hat. Spielprotokolle sind oft etwas komplexer, aber die ergriffenen Maßnahmen bestehen normalerweise darin, entweder die fehlenden Daten zu ignorieren (wenn später empfangene Daten die verlorenen Daten ersetzen), die fehlenden Daten erneut anzufordern oder eine vollständige Statusaktualisierung anzufordern Stellen Sie sicher, dass der Status des Clients mit dem des Servers synchron ist.

cdhowie
quelle
3
Einfach großartig, um die Details von SYNACK aufzunehmen.
LazerSharks
2
Dieses oder ein sehr ähnliches Beispiel stammt aus der Linux-Programmierschnittstelle. Die Ausgabe 2010 enthält diese Beispiele auf den Seiten 1155 und 1159.
Josh
30

Stream Socket:

  • Dedizierter & End-to-End-Kanal zwischen Server und Client.
  • Verwenden Sie das TCP-Protokoll für die Datenübertragung.
  • Zuverlässig und verlustfrei.
  • Daten in ähnlicher Reihenfolge gesendet / empfangen.
  • Lange Zeit für die Wiederherstellung verlorener / fehlerhafter Daten

Datagrammbuchse:

  • Kein dedizierter End-to-End-Kanal zwischen Server und Client.
  • Verwenden Sie UDP für die Datenübertragung.
  • Nicht 100% zuverlässig und kann Daten verlieren.
  • Die gesendete / empfangene Bestellung der Daten ist möglicherweise nicht identisch.
  • Es ist Ihnen egal oder Sie können verlorene / fehlerhafte Daten schnell wiederherstellen.
Alejandro Blasco
quelle
Werden die Daten nicht in derselben Reihenfolge gesendet (nicht nur "ähnlich")? dh. Es wäre nicht sinnvoll, einen Paketbestellmechanismus in einen Stream-Socket einzubauen
Matthew D. Scholefield,
Pakete in einer Stream-Kommunikation werden in "ähnlicher" Reihenfolge in dem Sinne gesendet und empfangen, dass die Pakete selbst NICHT garantiert in der richtigen Reihenfolge an den empfangenden Host zugestellt werden. TCP ermittelt jedoch die Diskrepanzen, ordnet die Pakete bei ihrem Eintreffen neu an und fordert etwas an das scheint auf dem Weg verloren gegangen zu sein.
Alejandro Blasco
Das macht Sinn. Vielleicht entfernen Sie das dann einfach als Unterschied und setzen es darunter (da, wenn ich es richtig verstehe, wenn ich mich nur auf die Reihenfolge beziehe, in der die Pakete gesendet werden, in beiden Fällen die Reihenfolge, in der die Daten gesendet / empfangen werden, möglicherweise nicht ist das Gleiche).
Matthew D. Scholefield
@Rick Genauer gesagt werden Sockets als End-to-End-Punkte bezeichnet, da Transportprotokolle für die Zustellung von Nachrichten an einen oder mehrere Netzwerkendpunkte verantwortlich sind.
Alejandro Blasco
0

Wenn es sich um die Netzwerkprogrammierung handelt, wäre es meiner Meinung nach ein guter Anfang, von Sockets aus zu starten.
Socket = IP + Port
Es gibt drei Arten von Sockets-
Streams (TCP, Bestellung und Lieferung garantiert, keine Duplizierung, keine Längen- oder Zeichengrenzen für Daten, verbindungsorientiert, zuverlässig, parallel)
Datagramm (UDP, paketbasiert, verbindungslos, Datagramm) Größenbeschränkung, Daten können verloren gehen oder dupliziert werden, Reihenfolge nicht garantiert, nicht zuverlässig)
Rohdaten (direkter Zugriff auf Protokolle der unteren Schicht IP, ICMP)
Ich sehe keine strenge Regel für den Transportprotokolltyp, welcher Socket welches Transportprotokoll verwenden muss und Zuverlässigkeit sollte nicht verwechselt werden, da UDP realisierbar ist, wenn beide Enden aktiv sind.
Zuverlässigkeit bezieht sich eher auf die Zuverlässigkeit der Zustellung, da Sequenznummernprüfungen unter Verwendung von TCP als Transportprotokoll durchgeführt werden, die in UDP nicht vorhanden sind. Es ist besser, einen Netzwerkprotokollanalysator wie Wireshark TCPDump usw. zu verwenden, um zu sehen, was Ihre Software genau tut. Art der Überprüfung oder Verschmelzung der Theorie auf dem Papier mit Ihrer Arbeit in Aktion.

Hakkican
quelle