Uitsending soos UDP met die betroubaarheid van TCP
-
09-06-2019 - |
Vra
Ek werk op'n .netto oplossing wat loop heeltemal binne-in'n enkele netwerk.Wanneer gebruikers'n verandering aan die stelsel, ek wil om te begin'n aankondiging en almal hoor dit en dienooreenkomstig op te tree.Is daar'n manier wat ons kan uitsending uit boodskappe soos hierdie (soos UDP sal laat jy dit doen), terwyl die behoud van gewaarborgde lewering (soos TCP)?
Dit is op'n klein netwerk (30ish kliënte), as sou dit'n verskil maak.
Oplossing
Byna al gespeel het 'n behoefte aan die vinnig reageer eienskappe (en tot 'n mindere mate, die verbindinglose eienskappe) van UDP en die betroubaarheid van TCP. Wat hulle doen, is hulle bou hul eie betroubare protokol op die top van UDP. Dit gee hulle die vermoë om net bars pakkies aan whereever en opsioneel maak hulle betroubare, sowel.
Die betroubare pakkie stelsel is gewoonlik 'n eenvoudige weer probeer-tot-erkende stelsel eenvoudiger as TCP maar daar is protokolle wat ver verby wat TCP kan bied gaan.
Jou situasie klink baie eenvoudig. Jy sal waarskynlik in staat wees om die skoonste oplossing jouself te maak -. Net maak elke kliënt stuur terug 'n "ek jou hoor" reaksie en het die bediener te hou probeer totdat dit raak dit (of gee up)
As jy iets meer wil hê nie, die meeste persoonlike protokol biblioteke is in C ++, so ek is nie seker hoeveel gebruik hulle sal vir julle wees. Maar ek weet hier is 'n paar jaar oud - miskien 'n paar protokolle is oor oorgedra deur die nou. Hmm ... RakNet en eNet is twee C / C ++ biblioteke wat in jou gedagtes opkom.
Ander wenke
Neem 'n blik op sctp wat 'n kombinasie van TCP en UDP funksies het. Daar is 'n Windows implementering beskikbaar.
Jy kan Smeer om groep kommunikasie te doen.
@epatel - ek tweede die SCTP voorstel (ek het nie, maar kan nie kommentaar lewer nie, maar tog so bykomende dinge hier).
SCTP het baie groot funksies en buigsaamheid. Jy kan sub-verdeel jou verband in verskeie strome, en kies die reliablity van elke en of dit nie beveel of. Alternatiewelik, met die Gedeeltelik Betroubaarheid uitbreiding, kan jy beheer oor betroubaarheid op 'n per boodskap basis.
Broadcast is nie wat jy wil hê. Aangesien daar kan en waarskynlik sal wees toestelle gekoppel aan hierdie netwerk wat nie omgee vir jou boodskap, moet jy Multicast gebruik. In teenstelling met uitsending boodskappe wat na deur elke kliënt op die netwerk gestuur moet word en verwerk word, is Multicast boodskappe gelewer net belangstel kliënte (dws diegene wat 'n paar voorneme het om hierdie spesifieke tipe van boodskap en daarop te reageer dit ontvang).
As jy later skaal hierdie stelsel op sodat dit moet oor 'n groot netwerk te verslaan, kan multicast skaal aan daardie, terwyl uitgesaai sal nie, so jy kry 'n scalability voordeel wat jy later kan waardeer. Intussen jy elimineer onnodige oorhoofse in skakelaars en ander toestelle wat nie nodig het om hierdie "iets verander" boodskappe te sien.
Jy mag dalk wil om te kyk na RFC 3208 "PGM betroubare vervoer protokol spesifikasie".
Hier is die opsomming:
Pragmatic General Multicast (PGM) is 'n betroubare multicast vervoer
protokol vir aansoeke wat vereis bestel of ongeordende, Woordeboek dupliseer-vrye, multicast data lewering van verskeie bronne om
verskeie ontvangers. PGM waarborge dat 'n ontvanger in die groep óf ontvang al die data pakkies van uitsendings en herstelwerk, of is kan nie herwin data op te spoor pakkie verlies. PGM is spesifiek bedoel as 'n werkbare oplossing vir multicast aansoeke met basiese betroubaarheid vereistes. sy sentrale ontwerp doel is eenvoud van werking met inagneming van scalability en netwerk doeltreffendheid.
Jy kan 'n boodskap Broker, gebruik soos ActiveMQ .
Publiseer jou boodskappe na 'n onderwerp en het die kliënte duursame inskrywing registreer om die onderwerp, sodat hulle geen boodskappe sal mis selfs al is hulle nie aanlyn.
Apache ActiveMQ is 'n boodskap makelaar geskryf in Java saam met 'n volle JMS kliënt. Maar Apache ActiveMQ is ontwerp om oor te kommunikeer 'n aantal van protokolle soos Stomp en OpenWire saam met die ondersteuning van 'n aantal ander taal spesifieke kliënte.
kliënt platform ondersteuning sluit c # en NET
Jy kan jou eie TCP-agtige gedrag by die aansoek laag te implementeer.
So byvoorbeeld, sal jy stuur uit die UDP uitgesaai, maar dan verwag 'n antwoord reaksie van elke gasheer. As jy 'n antwoord binne X sekondes nie gekry het nie, dan stuur 'n ander en so aan totdat die bereiking van 'n soort van drumpel. As die drempelwaarde bereik (dit wil sê die gasheer het glad nie reageer), dan rapporteer 'n fout.
Om hierdie al doen, sal jy 'n pre-gedefinieerde lys van gashere benodig om die antwoorde terug vanaf verwag.
Skep 'n TCP bediener. Het elke kliënt te verbind. In jou TCP-protokol met die kliënte, skep elke pakkie met 'n 2-byte voorvoegsel van die totale grootte van die volgende boodskap.
Kliënte noem dan read(max_size=2)
op die aansluiting van die grootte van die volgende boodskap te bepaal, en dan read(max_size=s)
om die boodskap in te samel.
Jy kry betroubare, beveel boodskappe, eenvoudig. Jy hoef nie 'n boodskap raamwerk vir hierdie een nodig het.
'n Mens sou beslis wil om te kyk na Pragmatic General Multicast :
Hoewel TCP gebruik ACKs om groepe van pakkies gestuur erken (iets wat sal wees onekonomies oor multicast ), PGM gebruik die konsep van 'n negatiewe Erkennings (Naks).
Vir verdere G-duik , die term wat jy soek is
Wat jy kan doen is dat na die uitsending het die kliënte inisieer die TCP verbindings. Anders sal jy net moet 'n lys van al die kliënte die verbindings aan elke kliënt jouself te hou en te inisieer.
Ek dink daar is drie opsies, breedweg:
- In plaas van uitsaai UDP, jy kan skep'n entiteit ('n draad, proses, bediener, diens, of wat ook al die ding is wat bestaan in jou oplossing) wat hou'n lys van intekenaars en stuur unicast UDP boodskappe aan hulle.
- Gebruik UDP multicast, maar jy sal hê om te skryf'n soort van die meganisme wat sal neem sorg van betroubare lewering vir jou (d. w. s, pogingen, time-outs, ens).Dit beteken ook jy het om te kry'n antwoord van jou kliënte.
- As jy nie bang is van die eksperimentele vervoer protokolle, kan jy kyk hier vir voorstelle.,
JoJ moet 'n blik op die Norm (Nack-georiënteerde Betroubare Multicast) spesifikasie neem. Jy kan inligting oor Norm hier vind.
Die norm protokol is ontwerp om bied end-tot-end betroubare vervoer van grootmaat data voorwerpe of strome oor generiese IP multicast routing en aanstuur dienste. NORM gebruik van 'n selektiewe, negatiewe erkenning (Nack) meganisme vir vervoer betroubaarheid en bied bykomende protokol meganismes om uit te voer betroubare multicast sessies met beperkte "a priori" koördinasie tussen senders en ontvangers
Dit ietwat baie bekende in die militêre wêreld.
Hoekom iets van nuuts af te bou as jy biblioteek kan gebruik? Veral vir so 'n klein projek?
Probeer gebruik Emcaster wat self met behulp van betroubare multicast boodskappe - PGM, is geskryf in. NET en met volle bron. Jy sal lekker kroeg / sub-enjin met onderwerp filter geredelik beskikbaar te kry. Of jy kan leer uit-kode hoe om dit te doen en baseer jou eie uitbreiding op dit.
Ek dink die mees irriterende funksie van TCP in hierdie scenario is die vermoë / manier van sorteer inkomende pakkies aan hul oorspronklike orde - die konsep van 'n stroom. Jy kan 'n greep nie lees totdat die byte voordat dit aankom.
As jy kan leef sonder dit, jy het jou kans om jou protokol, vinnige en betroubare, maar nie vir die bestel van pakkies het! Dit is eenvoudig onmoontlik om beide van hulle te bestuur, omdat jy nie jou grepe kan bestel totdat jy 'n ander kopie van 'n verlore pakkie ontvang, dit is die belangrikste nadeel.
doen 'n RDP multicast.