GNU/Linux >> Znalost Linux >  >> Linux

Rozdíl mezi sockety UNIX domény STREAM a DATAGRAM?

Jak říká manuálová stránka Unixové sockety jsou vždy spolehlivé. Rozdíl mezi SOCK_STREAM a SOCK_DGRAM je v sémantice konzumace dat mimo soket.

Stream socket umožňuje čtení libovolného počtu bajtů, ale stále zachovává bajtovou sekvenci. Jinými slovy, odesílatel může zapsat 4K dat do soketu a přijímač může tato data spotřebovat bajt po bajtu. Platí to i naopak - odesílatel může do soketu napsat několik malých zpráv, které může příjemce spotřebovat na jedno čtení. Streamový soket nezachovává hranice zpráv.

Datagramová zásuvka na druhou stranu tyto hranice zachovává – jeden zápis odesílatelem vždy odpovídá zápisu přečtenému příjemcem (i když je vyrovnávací paměť přijímače přidělena read(2) nebo recv(2) je menší než tato zpráva).

Pokud tedy váš aplikační protokol obsahuje malé zprávy se známou horní hranicí velikosti zprávy, je lepší použít SOCK_DGRAM protože je to jednodušší na správu.

Pokud váš protokol vyžaduje libovolně dlouhé užitečné zatížení zpráv nebo se jedná pouze o nestrukturovaný stream (jako nezpracovaný zvuk nebo něco podobného), vyberte SOCK_STREAM a proveďte požadované ukládání do vyrovnávací paměti.

Výkon by měl být stejný, protože oba typy pouze procházejí lokální vnitřní pamětí jádra, jen správa vyrovnávací paměti je odlišná.


  1. Jedním z pravděpodobných rozdílů jsou hranice zpráv. Datagramy budou dodávány jako celek, přičemž datagramy budou přirozenými hranicemi zpráv. Pomocí streamových soketů můžete číst N bajtů a soket se zablokuje, dokud nebude připraveno N bajtů. To však neznamená žádné zjevné hranice zpráv.

  2. Všechny věci jsou stejné, pokud je rychlost zájmem, nástrojem a měřítkem. (Předpokládám, že již víte, že pouze streamový soket poskytuje vestavěný spolehlivý přenos v pořadí a pouze datagramové sokety lze použít k odesílání do více přijímače).


Hlavní rozdíl je v tom, že jeden je založen na připojení (STREAM ) a druhý je bez připojení (DGRAM ) - rozdíl mezi proudovou a paketově orientovanou komunikací je obvykle mnohem méně důležitý.

S SOCK_STREAM stále máte veškerou správu připojení, tj. listen /accept a můžete zjistit, zda je spojení uzavřeno druhou stranou.

Všimněte si, že existuje také SEQPACKET typ soketu, který je stále orientovaný na připojení, ale zachovává hranice zpráv (což vám může ušetřit implementaci vrstvy orientované na zprávy nad STREAM zásuvka).

Očekával bych, že výkon přenosu dat bude u všech těchto typů podobný, hlavní rozdíl je v tom, jakou sémantiku chcete.


Linux
  1. Rozdíl mezi přihlašovacím prostředím a nepřihlašovacím prostředím?

  2. Jaký je rozdíl mezi Sudo Su – a Sudo Su –?

  3. Rozdíl mezi [0-9], [[:digit:]] a D?

  1. Rozdíl mezi velikostí bloku a velikostí clusteru?

  2. Rozdíl mezi potrubím a rozšířením příkazů?

  3. Rozdíl mezi uživatelem Sudo a uživatelem root?

  1. Rozdíl mezi Snat a Masquerade?

  2. erlang:Podpora soketu domény UNIX?

  3. rozdíl mezi cgroups a jmennými prostory