Antworten:
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.
Stream Socket:
Datagrammbuchse:
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.