Verschil tussen Unix Domain Stream en Datagram-aansluitingen?

Deze vraag bevindt zich niet voor het verschil tussen streamtype en internetcontacten in datagram. Ik weet dat stream-aansluitingen TCP gebruiken, Datagram-aansluitingen gebruiken UDP en alle TCP, UDP-dingen, pakketten die in orde zijn, ACK, NACK, enz.
Ik begrijp het belang van deze via internet.

Q1) Wanneer ik een UNIX-domeincontactdoos maak, welke plaatselijke socket is, hoe zou het dan uitmaken als de aansluiting streamcontactdoos of datagramaansluiting is. Dit type socket zou de gegevens naar het socketbestand schrijven, zou het protocol kwestie in dit geval sinds ik geen gegevens over een netwerk verzendt? Is er in dit geval een kans op gegevensverlies als ik Unix-gebaseerde datagram-aansluitingen gebruik?

Q2) Geeft Unix Datagram-aansluitingen betere prestaties dan UNIX-stream-aansluitingen?

Q3) Hoe kan ik beslissen voor een stream / datagram UNIX-socket in mijn aanvraag?

Bedankt


Antwoord 1, Autoriteit 100%

Net zoals de handmatige pagina zegt UNIX-aansluitingen altijd betrouwbaar. Het verschil tussen SOCK_STREAMen SOCK_DGRAMbevindt zich in de semantiek van het consumeren van gegevens uit de socket.

Streamcontactdoos zorgt voor het lezen van willekeurig aantal bytes, maar behoud nog steeds byte-sequentie. Met andere woorden, een afzender kan 4K gegevens naar de socket schrijven en de ontvanger kan consumeren dat gegevens byte door byte. De andere manier is ook waar – Afzender kan verschillende kleine berichten aan het stopcontact schrijven dat de ontvanger in één lees kan consumeren. Stream Socket behoudt geen berichtgrenzen.

Datagramaansluiting, aan de andere kant, behoudt deze grenzen – een schrijven door de afzender komt altijd overeen met één gelezen door de ontvanger (zelfs als de buffer van de ontvanger aan read(2)of recv(2)is kleiner dan dat bericht).

Dus als uw aanvraagprotocol kleine berichten heeft met een bekende bovengrens op het berichtformaat, bent u beter af met SOCK_DGRAMsindsdien gemakkelijker te beheren.

Als uw protocol opneemt op payloads met een willekeurige lange boodschap, of slechts een ongestructureerde stroom (zoals onbewerkte audio of iets) is, kiest u SOCK_STREAMen voert u de gewenste buffering uit.

De prestaties moeten hetzelfde zijn, aangezien beide typen gewoon door het lokale geheugen in de kernel gaan, alleen het bufferbeheer is anders.


Antwoord 2, Autoriteit 35%

Het belangrijkste verschil is dat er een verbinding is gebaseerd (STREAM) en de andere is -verbindingsminder (DGRAM) – Het verschil tussen stroom- en pakketgeoriënteerde communicatie is meestal veel minder belangrijk.

Met SOCK_STREAMkrijg je nog steeds alle connectieafhandeling, dat wil zeggen listen/ accepten je kunt zien of een verbinding door de andere is gesloten kant.

Merk op dat er ook een SEQPACKETSETSET TYPE is die nog steeds verbindingsgericht is, maar behoudt de berichtgrenzen (die u kan opslaan van het implementeren van een berichtgeoriënteerde laag bovenop een STREAMSocket).

Ik zou verwachten dat gegevensoverdrachtsprestaties vergelijkbaar zijn voor al deze typen, het belangrijkste verschil is precies welke semantiek u wilt.


Antwoord 3, Autoriteit 2%

  1. Eén waarschijnlijk verschil zijn berichtgrenzen. Datagrammen worden als geheel geleverd met de datagrammen als de grenzen van natuurlijke berichten. Met streamcontacten kunt u n bytes lezen en de aansluiting blokkeert totdat N BYTES klaar is. Maar dit betekent geen voor de hand liggende berichtgrenzen.

  2. Alle dingen die gelijk zijn, als de snelheid een zorg, instrument en maatregel is. (Ik neem aan dat u al weet dat alleen een stream-socket ingebouwd betrouwbaar in-ordervervoer biedt, en alleen datagram-aansluitingen kunnen worden gebruikt om naar meerdere ontvangers te verzenden).


Antwoord 4

Als de clients en servers altijd op dezelfde machine staan ​​en het doel is om minimale latentie en maximale bandbreedte te hebben, gebruikt u het gedeelde geheugen.

Other episodes