Vra

Vir algemene protokol boodskap ruil, wat kan duld nie'n paar pakkie verlies.Hoeveel te meer doeltreffend is UDP oor TCP?

Was dit nuttig?

Oplossing

UDP is vinniger as TCP, en die eenvoudige rede hiervoor is omdat sy nie bestaan nie erken pakkie (ACK) wat toelaat dat'n deurlopende pakkie stroom, in plaas van TCP erken dat'n stel van pakkies, bereken deur gebruik te maak van die TCP venster grootte en ronde-trip tyd (RTT).

Vir meer inligting, ek beveel die eenvoudige, maar baie verstaanbaar Skullbox verduideliking (TCP vs.UDP)

Ander wenke

Mense sê dat die groot ding TCP gee jou is betroubaarheid. Maar dit is nie regtig waar. Die belangrikste ding TCP gee jou is opeenhoping beheer: jy kan 100 TCP verbindings oor 'n DSL skakel hardloop al gaan by maksimum spoed, en al 100 verbindings sal produktief wees, omdat hulle almal "gevoel" van die beskikbare bandwydte. Probeer dit met 100 verskillende UDP aansoeke, al stoot pakkies so vinnig as wat hulle kan gaan, en sien hoe goed dinge uitwerk vir jou.

Op 'n groter skaal, hierdie TCP gedrag is wat hou die Internet uit te sluit uit "opeenhoping ineenstorting".

Dinge wat geneig is om aansoeke na UDP stoot:

  • Groep aflewering semantiek: dit is moontlik om betroubare aflewering veel meer doeltreffend te doen om 'n groep mense as TCP se punt-tot-punt erkenning

  • .
  • Buite-order: in baie aansoeke, so lank as wat jy al die data te kry, het jy nie omgee watter volgorde dit kom in; jy kan inligting-vlak latency te verminder deur die aanvaarding van 'n out-of-orde blok.

  • onvriendelikheid:. Op 'n LAN party, jy mag nie om as jou webblaaier funksies mooi so lank as wat jy updates blitting om die netwerk so vinnig as wat jy moontlik kan

Maar selfs as jy omgee vir prestasie, het jy waarskynlik nie wil hê om te gaan met UDP:

  • Jy is op die hoek vir betroubaarheid nou, en 'n groot deel van die dinge wat jy kan doen om te implementeer betroubaarheid kan uiteindelik 'n stadiger as wat TCP reeds doen.

  • Nou is jy netwerk-onvriendelike, wat probleme kan veroorsaak in 'n gedeelde omgewing.

  • Die belangrikste is, sal firewalls jy blok.

Jy kan potensieel oorkom sommige TCP prestasie en latency kwessies deur "dozen" verskeie TCP verbindings saam; iSCSI doen dit om opeenhoping beheer oor lokale area netwerke te kry, maar jy kan dit ook doen om 'n lae-latency skep "dringende" boodskap kanaal (TCP se "DRINGENDE" gedrag is heeltemal gebreek).

In sommige aansoeke TCP is vinniger (beter deurset) as UDP.

Dit is die geval wanneer jy baie klein skryf met betrekking tot die MTU. Byvoorbeeld, lees ek 'n eksperiment waarin 'n stroom van 300 byte pakkies oor Ethernet (1500 byte MTU) en TCP was 50% vinniger as UDP is gestuur.

Die rede hiervoor is omdat TCP sal probeer en buffer die data en vul 'n volle netwerk segment sodoende meer doeltreffende gebruik van die beskikbare bandwydte.

UDP aan die ander kant sit die pakkie op die draad onmiddellik dus die netwerk congesting met baie klein pakkies.

Jy moet waarskynlik nie gebruik UDP, tensy jy 'n baie spesifieke rede om dit te doen nie. Veral omdat jy TCP dieselfde soort latency as UDP kan gee deur die aanskakel van die Nagle algoritme ( byvoorbeeld as jy die oordrag van real-time sensor data en jy is nie bekommerd oor congesting die netwerk met baie se van klein pakkies).

met die verlies verdraagsaam

Bedoel jy "met die verlies verdraagsaamheid" ?

Basies, UDP is nie "verlies verdraagsaam".Jy kan stuur 100 pakkies aan iemand, en hulle dalk net 95 van die pakkies, en sommige mag wees in die verkeerde volgorde.

Vir dinge soos die video streaming, en multiplayer gaming, waar dit is beter om te mis'n pakkie as om te vertraag al die ander pakkies agter dit, dit is die voor die hand liggende keuse

Vir die meeste ander dinge al, 'n vermiste of "herrangskik' pakkie is van kritieke belang.Jy wil hê om te skryf'n paar ekstra kode uit te voer op die top van die UDP te probeer as dinge gemis, en af te dwing korrekte volgorde.Dit sou voeg'n klein bietjie van die oorhoofse in sekere plekke.

Gelukkig, 'n paar baie baie slim mense dit gedoen het, en hulle het dit TCP.

Dink dit op hierdie manier:As'n pakkie gaan ontbreek, sou jy eerder net die volgende pakkie so vinnig as moontlik en voort te gaan (gebruik UDP), of doen jy eintlik nodig het dat die ontbrekende data (gebruik TCP).Die oorhoofse sal nie saak nie, tensy jy in'n baie rand-geval scenario.

Watter protokol voer beter (in terme van deurset) - UDP of TCP - hang af van die netwerk eienskappe en die netwerk verkeer. Robert S. Barnes, byvoorbeeld, wys daarop 'n scenario waar TCP voer beter (klein-grootte skryf). Nou, kyk na 'n scenario waarin die netwerk is dig en het beide TCP en UDP verkeer. Senders in die netwerk wat gebruik TCP, sal die "opeenhoping 'voel en kap op hul stuur tariewe. Maar UDP geen opeenhoping te vermy of opeenhoping beheermeganismes hê, en senders met behulp van UDP sal voortgaan om te pomp in data teen dieselfde tempo. Geleidelik, sou TCP senders hul stuur tariewe minimum gebaar verminder en as UDP senders genoeg data oor die netwerk gestuur word, sou hulle hog op die meerderheid van bandwydte beskikbaar. So, in so 'n geval, UDP senders sal groter deurset hê, as hulle die groter sirkel van die netwerk bandwydte kry. Trouens, dit is 'n aktiewe navorsingsonderwerp - Hoe om TCP deurset te verbeter in teenwoordigheid van UDP verkeer. Een manier, waarvan ek weet, die gebruik van wat TCP aansoeke deurset te verbeter is deur die opening van verskeie TCP verbindings. Op dié manier, selfs al is, deurset elke TCP-verbinding se mag beperk word, die somtotaal van die deurset van alle TCP verbindings kan groter wees as die deurset vir 'n aansoek met behulp van UDP wees.

Elke TCP-verbinding vereis 'n aanvanklike handdruk voor data oorgedra word. Ook, die TCP kop bevat 'n baie oorhoofse bedoel vir verskillende seine en boodskap aflewering opsporing. Vir 'n boodskap ruil, sal UDP waarskynlik voldoende wees as 'n klein kans van mislukking is aanvaarbaar. Indien ontvangs moet geverifieer, TCP is jou beste opsie.

@Andrew , ek smeek om te verskil . UDP is die keuse in 'n paar vorme van aansoek as gevolg van prestasie vereistes. Een klassieke voorbeeld is videokonferensie. Hierdie soort van aansoek nie goed reageer op TCP beheer.

Ander aspek te neem in ag is as jy gaan om multicast nodig. Indien wel, gebruik UDP.

Wanneer praat van "wat is vinniger" - daar is ten minste twee baie verskillende aspekte: deurset en latency

.

As praat oor deurset - TCP se vloei beheer (soos genoem in ander antwoorde), is uiters belangrik en iets vergelykbaar oor UDP doen, terwyl seker moontlik, sal 'n groot kopseer (tm) wees. As gevolg daarvan -. Die gebruik van UDP wanneer jy dit nodig deurset , selde kwalifiseer as 'n goeie idee (tensy jy wil 'n onregverdige voordeel bo TCP kry)

As praat oor latencies - die hele ding is heeltemal anders. Terwyl hy in die afwesigheid van pakkie verlies TCP en UDP tree uiters soortgelyke (enige verskille, indien enige, wat marginale) - na die pakkie verlore, die hele patroon verander drasties.

Na 'n pakkie verlies, sal TCP wag vir weer te stuur vir ten minste 200 ms (1sec per paragraaf 2.4 van RFC6298, maar praktiese moderne implementering is geneig om dit te verminder tot 200 ms). Verder, met TCP, selfs dié pakkies wat gedoen bereik bestemming gasheer - sal nie afgelewer word by jou app totdat die vermiste pakkie ontvang (dit wil sê, die hele kommunikasie is vertraag deur ~ 200 ms) - BTW, hierdie effek, bekend as Hoof-van LINE Blokkering, is inherent aan alle betroubare bestel strome, of TCP of betroubare + bestel UDP. Om dinge nog erger te maak - as die herversend pakkie ook verlore, dan sal ons praat oor die vertraging van ~ 600 ms (as gevolg van sogenaamde eksponensiële backoff, 1 weer te stuur is 200 ms en tweede een is 200 * 2 = 400 ms). As ons kanaal het 1% pakkie verlies (wat nie sleg is volgens vandag se standaarde), en ons het 'n wedstryd met 20 updates per sekonde - so 600 ms vertragings sal plaasvind op gemiddeld elke 8 minute. En as 600 ms is meer as genoeg om ontslae jy vermoor in 'n vinnige spel - goed, dit is baie sleg vir die spel. Hierdie effekte is presies die rede waarom gamedevs dikwels verkies UDP oor TCP.

Maar wanneer die gebruik van UDP te latencies verminder - dit is belangrik om te besef dat net "met behulp van UDP" is nie voldoende om aansienlike latency verbetering kry, dit is al oor die manier waarop jy met behulp van UDP. In die besonder, terwyl RUDP biblioteke gewoonlik vermy dat "eksponensiële backoff" en gebruik korter weer te stuur keer - as dit gebruik word as 'n "betroubare bestel" stroom, hulle moet nog ly aan Hoof-van-Line Blokkering (so in die geval van 'n dubbele pakkie verlies, in plaas van dat 600 ms ons kry ongeveer 1,5 * 2 * RTT - of vir 'n goeie 80ms RTT, dit is 'n ~ 250ms vertraging, wat 'n verbetering is, maar dit is steeds moontlik om beter te doen). Aan die ander kant, as die gebruik van tegnieke bespreek in http://gafferongames.com/networked-physics/ snapshot-kompressie / en / of http: // ithare com / UDP-uit-mog-perspektief / # lae-latency-kompressie , dit moontlik is om te skakel Hoof-van-Line heeltemal blokkeer (so vir 'n dubbel-pakkie verlies vir 'n wedstryd met 20 updates / tweede , sal die vertraging ongeag RTT wees 100ms).

En as 'n kant nota - as jy toevallig net toegang tot TCP maar geen UDP het (soos in die leser, of as jou kliënt is agter een van 6-9% van lelike firewalls blokkeer UDP) - daar lyk om 'n manier te implementeer UDP-over-TCP sonder inagneming van te veel latencies, sien hier wees: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (maak seker om kommentaar te lees (!)).

As jy nodig het om vinnig 'n boodskap oor die netto blaas tussen twee IP's wat nog nie eens gepraat, dan 'n UDP gaan ten minste 3 keer vinniger aankom, gewoonlik 5 keer vinniger.

UDP is effens vinniger in my ervaring, maar nie veel nie. Die keuse moet nie gemaak word op prestasie, maar op die boodskap inhoud en kompressie-tegnieke.

As dit is 'n protokol met boodskap ruil , ek raai dat die baie geringe prestasie getref jy neem met TCP is meer as die moeite werd. Jy kry 'n verband tussen twee eindpunte wat jy alles wat jy nodig sal gee. Moenie probeer om te vervaardig jou eie betroubare tweerigting-protokol op die top van UDP tensy jy regtig, regtig vol vertroue in wat jy onderneem.

Hou in gedagte dat TCP hou gewoonlik verskeie boodskappe op draad. As jy wil om dit te implementeer in UDP jy nogal 'n baie werk hê as jy dit wil betroubaar doen. Jou oplossing is óf gaan minder betroubaar, minder vinnig of 'n ongelooflike hoeveelheid werk te wees. Daar is geldige aansoeke van UDP, maar as jy hierdie vraag is gevra joune is waarskynlik nie.

Ek sal net dinge duidelik maak. TCP / UDP is twee motors wat gedryf op die pad. veronderstel dat verkeerstekens en struikelblokke foute TCP omgee vir verkeerstekens, respekteer alles rondom. Stadig ry, want iets kan gebeur met die motor. Terwyl UDP net dryf af, volle spoed geen respek vir straat tekens. Niks, 'n mal bestuurder. UDP nie 'n fout herstel, As daar 'n hindernis, sal dit net bots met dit dan voortgaan. Terwyl TCP maak seker dat alle pakkies gestuur en ontvang perfek, Geen foute, so, die motor gaan net struikelblokke sonder 'n botsing. Ek hoop dit is 'n goeie voorbeeld vir jou om te verstaan, Hoekom UDP verkies in die spel. Spel moet spoed. TCP word Voorkeur in downloads, of afgelaai lêers kan beskadig.

Daar is sommige werk wat gedoen is om die programmeerder om die voordele van beide wêrelde.

SCTP

Dit is'n onafhanklike vervoer laag protolol, maar dit kan gebruik word as'n biblioteek verskaffing van bykomende laag oor UDP.Die basiese eenheid van kommunikasie is'n boodskap (koppel aan een of meer UDP pakkies).Daar is opeenhoping beheer gebou in.Die protokol het knoppe en twiddles om oor te skakel op

  • ten einde die lewering van boodskappe
  • outomatiese herversending van verlore boodskappe, met die gebruiker gedefinieerde parameters

indien enige van hierdie is wat nodig is vir jou spesifieke aansoek.

Een probleem met hierdie is dat die verbinding vestiging is'n ingewikkelde (en dus stadige proses)

Ander soortgelyke dinge

Een meer soortgelyke eiendom eksperimentele ding

Dit het ook probeer om te verbeter op die drie-manier handdruk van TCP en verander die opeenhoping beheer om beter te gaan met'n vinnige lyne.

Dit is betekenisloos oor TCP of UDP te praat sonder om die netwerk toestand in ag neem. As die netwerk tussen die twee punt het 'n baie hoë gehalte, UDP is absoluut vinniger as TCP, maar in 'n ander geval soos die GPRS-netwerk, kan TCP vinniger en meer betroubaar as UDP is.

Die netwerk opstelling is van kardinale belang vir enige metings. Dit maak 'n groot verskil as jy kommunikeer via voetstukke op jou plaaslike rekenaar of met die ander kant van die wêreld.

Drie dinge wat ek wil toe te voeg tot die gesprek:

  1. Jy kan hier 'n baie goeie artikel vind oor TCP teen UDP in die konteks van die spel ontwikkeling.
  2. Verder iperf ( jperf verbeter iperf met 'n GUI) is 'n baie mooi instrument vir die beantwoording van jou vraag self deur die meting.
  3. Ek geïmplementeer 'n maatstaf in Python (sien hierdie SO bevraagteken ). In gemiddeld van 10 ^ 6 iterasies die verskil vir die stuur van 8 grepe is ongeveer 1-2 mikrosekondes vir UDP.
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top