Technologie tcp ip a udp jejich rozdíly. Protokoly přenosu dat TCP a UDP. Servisní model TCP

User Datagram Protocol (UDP)(User Datagram Protocol) je standardní protokol TCP/IP definovaný v RFC 768, "User Datagram Protocol (UDP)". UDP se používá místo TCP k rychlému a nespolehlivému přenosu dat mezi hostiteli TCP/IP.

protokol UDP poskytuje službu bez připojení, takže UDP nezaručuje doručení nebo kontrolu sekvence pro jakýkoli datagram. Host, který potřebuje spolehlivá komunikace musí použít buď TCP protokol nebo program, který bude sám sledovat sled datagramů a potvrzovat příjem každého paketu.

Aplikace citlivé na čas často používají UDP (video data), protože je vhodnější zahazovat pakety, než čekat na zpožděné pakety, což v systémech pracujících v reálném čase nemusí být možné. Také ztráta jednoho nebo více snímků při přenosu video dat přes UDP není tak kritická jako při přenosu binární soubory, kde ztráta jednoho paketu může vést k poškození celého souboru. Další výhodou protokolu UDP je, že délka hlavičky UDP je 4 bajty, zatímco protokol TCP má 20 bajtů.

Zprávy UDP jsou zapouzdřeny a přenášeny v IP datagramech.

UDP hlavička

Obrázek ukazuje pole přítomná v hlavičce UDP.

  • Port odesílatele – Toto pole určuje číslo portu odesílatele. Tato hodnota má specifikovat port, na který bude v případě potřeby odeslána odpověď. V opačném případě by hodnota měla být 0. Pokud je zdrojovým hostitelem klient, bude číslo portu s největší pravděpodobností pomíjivé. Pokud je zdrojem server, pak jeho port bude jeden z „dobře známých“.
  • Port příjemce – Toto pole je povinné a obsahuje port příjemce. Podobně jako u zdrojového portu, pokud je klientem hostitel příjemce, pak je číslo portu efemérní, jinak (server je příjemce) je to „dobře známý port“.
  • Délka datagramu je pole, které udává délku celého datagramu (záhlaví a dat) v bajtech. Minimální délka je rovna délce záhlaví – 8 bajtů. Teoreticky je maximální velikost pole 65535 bajtů pro datagram UDP (8 bajtů pro záhlaví a 65527 pro data). Skutečný limit pro délku dat při použití IPv4 je 65507 (kromě 8 bajtů na hlavičku UDP je vyžadováno dalších 20 na hlavičku IP).
  • Kontrolní součet – Pole kontrolního součtu se používá ke kontrole chyb v záhlaví a datech. Pokud množství není generováno vysílačem, pak je pole vyplněno nulami.

Podívejme se na strukturu záhlaví UDP používáním síťový analyzátor Wireshark:

UDP porty

Vzhledem k tomu, že na stejném počítači může být spuštěno několik programů, pro doručení paketu UDP do konkrétního programu, jedinečný identifikátor každý program nebo číslo portu.

Číslo portu je podmíněné 16bitové číslo od 1 do 65535 udávající, pro který program je balíček určen.

Porty UDP poskytují možnost odesílat a přijímat zprávy UDP. Port UDP funguje jako jediná fronta zpráv pro příjem všech datagramů určených pro program. označený číslem protokolový port. To znamená, že programy UDP mohou přijímat více než jednu zprávu najednou.

Všechna čísla portů UDP, která jsou menší než 1024, jsou rezervována a registrována u úřadu IANA (Internet Assigned Numbers Authority).
Čísla portů UDP a TCP se nepřekrývají.

Každý UDP port identifikovaný rezervovaným nebo známým číslem portu. Následující tabulka ukazuje částečný seznam známých čísel portů UDP, které používají standardní programy UDP.

Protokoly transportní vrstvy, další v hierarchii po IP, se používají k přenosu dat mezi aplikačními procesy běžícími na síťových uzlech. Datový paket přijatý z jednoho počítače do druhého přes internet musí být přenesen do zpracovatelského procesu, a to přesně pro konkrétní účel. Odpovědnost za to přebírá transportní vrstva. Na této vrstvě jsou dva hlavní protokoly – TCP a UDP.

Definice

TCPtransportní protokol přenos dat v sítích TCP/IP, který předem naváže spojení se sítí.

UDP- transportní protokol, který přenáší datagramové zprávy bez nutnosti navazování spojení v IP síti.

Srovnání

Rozdíl mezi protokoly TCP a UDP je tzv. „garance doručení“. TCP vyžaduje odpověď od klienta, kterému byl datový paket doručen, potvrzení doručení a k tomu potřebuje předem vytvořené spojení. Také protokol TCP je považován za spolehlivý, zatímco UDP dokonce obdržel název „nespolehlivý datagramový protokol“. TCP eliminuje ztrátu dat, duplikaci a míchání paketů a zpoždění. UDP toto vše umožňuje a ke své práci nevyžaduje připojení. Procesy, kterým jsou data přenášena prostřednictvím UDP, si musí vystačit s tím, co přijímají, a to i se ztrátami. TCP řídí zahlcení spojení, UDP neřídí nic kromě integrity přijímaných datagramů.

Na druhou stranu, díky této nerozlišitelnosti a nedostatku kontroly, UDP dodává datové pakety (datagramy) mnohem rychleji, proto pro aplikace, které jsou navrženy pro velkou šířku pásma a rychlá výměna,UDP lze považovat za optimální protokol. Patří mezi ně síťové a prohlížečové hry, stejně jako programy pro sledování streamovaného videa a aplikace pro video komunikaci (nebo hlas): úplná nebo částečná ztráta balíčku nic nemění, není nutné opakovat požadavek, ale stahování je mnohem rychlejší. Protokol TCP, který je spolehlivější, se úspěšně používá i v poštovní programy, což vám umožní řídit nejen provoz, ale také délku zprávy a rychlost výměny provozu.

Webové stránky se závěry

  1. TCP garantuje doručení datových paketů v nezměněné podobě, sekvenci a beze ztrát, UDP negarantuje nic.
  2. TCP vyžaduje předem navázané spojení, připojení UDP není vyžadováno.
  3. UDP poskytuje více vysoká rychlost přenos dat.
  4. TCP je spolehlivější a řídí proces výměny dat.
  5. UDP je preferováno pro programy, které hrají streamované video, videofonie a telefonie, síťové hry.

protokol UDP

User Datagram Protocol (UDP) je jednoduchý protokol bez připojení, orientovaný na datagram, který poskytuje rychlou, ale ne nutně spolehlivou přepravní službu. Podporuje interakce typu one-to-many, a proto se často používá pro vysílání a multicast přenos datagramů.

Internetový protokol (IP) je hlavním protokolem Internetu. Transmission Control Protocol (TCP) a UDP jsou protokoly transportní vrstvy postavené na základním protokolu.

TCP/IP je sada protokolů, nazývaná také Internet Protocol Suite, sestávající ze čtyř vrstev. Pamatujte, že TCP/IP není jen jeden protokol, ale rodina nebo sada protokolů, která se skládá z dalších protokolů nižší úrovně, jako jsou IP, TCP a UDP. UDP je umístěn v transportní vrstvě nad IP (protokol síťová vrstva). Transportní vrstva zajišťuje komunikaci mezi sítěmi prostřednictvím bran. Využívá IP adresy k odesílání datových paketů přes internet nebo jinou síť pomocí různých ovladačů zařízení.

Než začnete studovat práce UDP, přejděme k základní terminologii, kterou musíte dobře znát. Níže stručně definujeme hlavní pojmy spojené s UDP:

Balíčky

V datové komunikaci je paket posloupnost binárních číslic představujících data a řídicí signály, které jsou přenášeny a přepínány prostřednictvím hostitele. Uvnitř balení jsou tyto informace umístěny v souladu se speciálním formátem.

Datagramy

Datagram je jediný, nezávislý paket dat nesoucí dostatek informací pro cestu od zdroje k cíli, takže nedochází k žádné další výměně mezi zdrojem, cílem a dopravní síť není vyžadováno.

MTU ( Maximální přenos Jednotka)

MTU charakterizuje odkazová vrstva a odpovídá maximálnímu počtu bajtů, které lze přenést v jednom paketu. Jinými slovy, MTU je největší paket, který může dané síťové prostředí přenášet. Například Ethernet má pevnou MTU 1500 bajtů. Pokud je v UDP velikost datagramu větší než MTU, protokol IP provede fragmentaci rozdělením datagramu na menší části (fragmenty), takže každý fragment je menší než MTU.

Porty

Aby bylo možné přiřadit příchozí data ke konkrétnímu procesu běžícímu na počítači, používá UDP porty. UDP předá paket na příslušné místo pomocí čísla portu uvedeného v hlavičce UDP datagramu. Porty jsou reprezentovány 16bitovými čísly, a proto nabývají hodnot od 0 do 65 535 Porty, které se také nazývají koncové body logického připojení, jsou rozděleny do tří kategorií:

    Dobře známé porty - od 0 do 1023

    Registrované porty - od 1024 do 49151

    Dynamické/soukromé porty – 49152 až 65535

Všimněte si, že porty UDP mohou přijímat více než jednu zprávu v danou chvíli. V některých případech mohou služby TCP a UDP používat stejná čísla portů, například 7 (Echo) nebo 23 (Telnet).

UDP používá následující známé porty:

Seznam portů UDP a TCP spravuje IANA (Internet Assigned Numbers Authority).

IP adresy

IP datagram se skládá z 32bitových zdrojových a cílových IP adres. Cílová IP adresa určuje koncový bod pro UDP datagram a zdrojová IP adresa se používá k získání informací o tom, kdo zprávu odeslal. V cíli jsou pakety filtrovány a ty, jejichž zdrojové adresy nejsou zahrnuty v platné sadě adres, jsou bez upozornění odesílateli zahozeny.

Unicast IP adresa jednoznačně identifikuje hostitele v síti, zatímco multicast IP adresa identifikuje konkrétní skupina adresy v síti. Vysílací IP adresy jsou přijímány a zpracovávány všemi hostiteli místní síť nebo konkrétní podsíť.

TTL

Hodnota time-to-live neboli TTL (time-to-live) umožňuje nastavit horní hranici počtu routerů, kterými může datagram projít. Hodnota TTL zabraňuje dosažení paketů nekonečné smyčky. Inicializuje jej odesílatel a každý směrovač, který zpracovává datagram, sníží o jednu. Když se hodnota TTL stane nulovou, datagram se zahodí.

Skupinová pošta

Multicast je otevřená metoda založená na standardech pro distribuci identických informací více uživatelům současně. Multicast je hlavní vlastností protokolu UDP, u protokolu TCP to není možné. Multicast umožňuje interakci jednoho k mnoha, například umožňuje použití, jako je odesílání zpráv a pošty více příjemcům, internetové rádio nebo demo programy v reálném čase. Skupinové odesílání nezatěžuje síť tolik jako přenos, protože data jsou odesílána několika uživatelům najednou:

Jak funguje UDP

Když aplikace založená na UDP odešle data jinému hostiteli v síti, UDP k nim připojí osmibitovou hlavičku obsahující čísla cílového a zdrojového portu, celkovou délku dat a kontrolní součet. IP přidá svou hlavičku na datagram UDP a vytvoří datagram IP:

Předchozí obrázek ukazuje, že celková délka hlavičky UDP je osm bajtů. Teoretická maximální velikost IP datagramu je 65 535 bajtů. S 20 bajty hlavičky IP a 8 bajty hlavičky UDP může být délka uživatelských dat až 65 507 bajtů. Většina programů však pracuje s daty menší velikost. Pro většinu aplikací je tedy výchozí délka přibližně 8192 bajtů, protože toto je množství dat, které síť čte a zapisuje. souborový systém(NFS). Můžete nastavit velikosti vstupní a výstupní vyrovnávací paměti.

Kontrolní součet je nutný ke kontrole, zda byla data doručena na místo určení správně nebo byla poškozena. Pokrývá jak hlavičku UDP, tak data. Výplňový bajt se použije, pokud je celkový počet oktetů v datagramu lichý. Pokud je přijatý kontrolní součet nula, příjemce zaznamená chybu kontrolního součtu a datagram zahodí. Přestože je kontrolní součet volitelnou funkcí, vždy se doporučuje jej zahrnout.

V dalším kroku vrstva IP přidá 20 bajtů hlavičky, která obsahuje TTL, zdrojovou a cílovou IP adresu a další informace. Tato akce se nazývá zapouzdření IP.

Jak již bylo zmíněno, maximální velikost paketu je 65 507 bajtů. Pokud je balíček větší než výchozí Velikost MTU, pak vrstva IP rozdělí paket na segmenty. Tyto segmenty se nazývají fragmenty a proces rozdělení dat na segmenty se nazývá fragmentace. Záhlaví IP obsahuje všechny informace o fragmentu.

Když odesílající aplikace „hodí“ datagram do sítě, je směrován na cílovou IP adresu uvedenou v IP hlavičce. Při průchodu směrovačem se hodnota doby trvání (TTL) v hlavičce IP sníží o jednu.

Když datagram dorazí na daný cíl a port, vrstva IP zkontroluje jeho záhlaví, aby zjistila, zda je datagram fragmentovaný. Pokud ano, datagram se sestaví podle informací v záhlaví. Konečně aplikační vrstva načte filtrovaná data odstraněním záhlaví.

Nevýhody UDP

Ve srovnání s TCP má UDP následující nevýhody:

    Žádné potvrzovací signály. Před odesláním paketu UDP si odesílající strana nevyměňuje signály handshake s přijímající stranou. Odesílatel tedy nemá žádný způsob, jak zjistit, zda datagram dosáhl cílového systému. V důsledku toho UDP nemůže zaručit, že data budou skutečně doručena na místo určení (například pokud dojde k výpadku koncového systému nebo sítě).

    Naproti tomu TCP je orientován na spojení a umožňuje komunikaci mezi hostiteli připojenými k síti pomocí paketů. TCP používá signály handshaking k ověření, že data byla úspěšně přenesena.

    Pomocí relací. Povaha TCP orientovaná na připojení je podporována relacemi mezi hostiteli. TCP používá identifikátor relace ke sledování spojení mezi dvěma hostiteli. UDP nemá podporu relací kvůli své nespojenosti.

    Spolehlivost. UDP nezaručuje, že příjemci bude doručena pouze jedna kopie dat. K odeslání konečný systém velké množství dat, UDP je rozděluje na malé části. UDP nezaručuje, že tyto díly budou doručeny na místo určení ve stejném pořadí, v jakém byly vytvořeny u zdroje. Naopak TCP používá čísla portů spolu s sériová čísla a pravidelně zasílaná potvrzení, aby bylo zajištěno řádné doručení dat.

    Bezpečnost. TCP je bezpečnější než UDP. V mnoha organizacích firewally a směrovače neumožňují průchod UDP paketům. Je to proto, že hackeři mohou využívat porty UDP, aniž by navazovali explicitní připojení.

    Řízení toku. V UDP ovládání neexistuje žádný stream a v důsledku toho může špatně navržená aplikace UDP zachytit významnou část šířku pásma sítí.

Výhody UDP

Ve srovnání s TCP má UDP následující výhody:

    Nebylo navázáno žádné spojení. UDP je protokol bez připojení, takže eliminuje režii spojenou s navazováním připojení. Vzhledem k tomu, že protokol UDP nepoužívá handshake, je také zabráněno zpoždění připojení. To je důvod, proč DNS upřednostňuje UDP před TCP - DNS by bylo mnohem pomalejší, kdyby běželo přes TCP.

    Rychlost. UDP je rychlejší než TCP. Z tohoto důvodu mnoho aplikací preferuje UDP před TCP. Stejné věci, které činí TCP robustnějším (jako jsou signály handshake), jej také zpomalují.

    Topologická diverzita. UDP podporuje komunikaci typu one-to-one a one-to-many, zatímco TCP podporuje pouze komunikaci one-to-one.

    Režijní náklady. Práce s TCP znamená zvýšenou režii, režie vyvolaná UDP je výrazně nižší. TCP využívá výrazně více zdrojů ve srovnání s UDP operační systém a v důsledku toho se v prostředích, kde servery obsluhují mnoho klientů současně, široce používá UDP.

    Velikost záhlaví. Pro každý paket je hlavička UDP dlouhá pouze osm bajtů, zatímco TCP má 20bajtová hlavička, a proto UDP spotřebovává menší šířku pásma sítě.

User Datagram Protocol - UDP

protokol UDP je jedním ze dvou protokolů transportní vrstvy používaných v zásobníku protokolů TCP/IP. UDP umožňuje aplikačnímu programu přenášet své zprávy po síti s minimální režií spojenou s převodem protokolů aplikační vrstvy na IP. Zároveň však aplikačního programu sám se musí postarat o potvrzení, že zpráva byla doručena na místo určení. Záhlaví UDP datagramu (zprávy) vypadá jako na obrázku 2.10.

Rýže. 2.10. Struktura záhlaví zprávy UDP

Datová jednotka protokolu UDP se nazývá paket UDP nebo uživatelský datagram. Paket UDP se skládá z hlavičky a datového pole, které obsahuje paket aplikační vrstvy. Záhlaví má jednoduchý formát a skládá se ze čtyř dvoubajtových polí:

    Zdrojový port UDP - číslo portu odesílajícího procesu,

    UDP cílový port - číslo portu procesu příjemce,

    Délka UDP zprávy - délka UDP paketu v bajtech,

    Kontrolní součet UDP - kontrolní součet UDP paketu

Ne všechna pole UDP paketu musí být vyplněna. Pokud odeslaný datagram neočekává odpověď, mohou být na místo adresy odesílatele umístěny nuly. Můžete také odmítnout vypočítat kontrolní součet, ale mějte na paměti, že protokol IP vypočítá kontrolní součet pouze pro hlavičku paketu IP, přičemž ignoruje datové pole

Porty v hlavičce definují protokol UDP jako multiplexer, který umožňuje shromažďovat zprávy z aplikací a odesílat je do protokolové vrstvy. V tomto případě aplikace používá konkrétní port. Aplikace komunikující po síti mohou používat různé porty, což se odráží v hlavičce paketu. Celkem lze definovat 216 různých portů. Prvních 256 portů je přiřazeno tzv. „dobře známým službám“, mezi které patří například UDP port 53, který je přiřazen službě DNS.

Pole Délka určuje celkovou délku zprávy. Pole Kontrolní součet slouží ke kontrole integrity dat. Aplikace, která používá protokol UDP by se měl sám starat o integritu dat analýzou polí Kontrolní součet a Délka. Při výměně dat přes UDP se navíc o sledování doručení dat příjemci musí postarat samotný aplikační program. Toho se obvykle dosahuje výměnou potvrzení o doručení mezi aplikačními programy.

Většina známé služby Založené na UDP jsou BIND Domain Name Service a NFS Distributed File System. Vrátíme-li se k příkladu traceroute, tento program také používá přenos UDP. Ve skutečnosti je to zpráva UDP, která je odeslána do sítě, ale používá port, který nemá službu, a proto je generován paket ICMP, který detekuje nedostatek služby na přijímajícím počítači, když paket konečně dosáhne cílový stroj.

Transfer Control Protocol - TCP

Pokud je pro aplikaci důležité sledování kvality přenosu dat po síti, pak je v tomto případě použit protokol TCP. Tento protokol se také nazývá spolehlivý protokol orientovaný na připojení a orientovaný na tok. Než probereme tyto vlastnosti protokolu, uvažme formát datagramu přenášeného po síti (obrázek 2.11). Podle této struktury má TCP, stejně jako UDP, porty. Prvních 256 portů je přiřazeno WKS, porty od 256 do 1024 jsou přiřazeny unixovým službám a zbytek lze použít podle svého uvážení. V terénu pořadové čísločíslo paketu je definováno v posloupnosti paketů, které tvoří celou zprávu, následované polem potvrzení Číslo znalostí a další kontrolní informace.

Rýže. 2.11. Struktura TCP paketu

    Zdrojový port (SOURS PORT) zabírá 2 bajty, identifikuje proces odesílání;

    Cílový port (DESTINATION PORT) zabírá 2 bajty, identifikuje proces příjemce;

    Sekvenční číslo (SEQUENCE NUMBER) zabírá 4 bajty, udává číslo bajtu, které určuje offset segmentu vzhledem k proudu odesílaných dat;

    Potvrzené číslo (ACKNOWLEDGEMENT NUMBER) zabírá 4 bajty, obsahuje maximální počet bajtů v přijatém segmentu, zvýšený o jeden; právě tato hodnota se používá jako účtenka;

    Délka hlavičky (HLEN), 4 bity dlouhá, udává délku hlavičky TCP segmentu, měřenou ve 32bitových slovech. Délka záhlaví není pevná a může se lišit v závislosti na hodnotách nastavených v poli Možnosti;

    Reserve (RESERVED) zabírá 6 bitů, pole je rezervováno pro pozdější použití;

    Kódové bity (CODE BITS) zabírají 6 bitů a obsahují servisní informace o typu daného segmentu, specifikované nastavením odpovídajících bitů tohoto pole na jedničku:

    URG - urgentní zpráva;

    ACK - příjem pro přijatý segment;

    PSH - požadavek na odeslání zprávy bez čekání na zaplnění bufferu;

    RST - požadavek na obnovení spojení;

    SYN - zpráva sloužící k synchronizaci počítadel přenesených dat při navazování spojení;

    FIN je znamení, že vysílací strana dosáhla posledního bajtu v přenášeném datovém toku.

    Okno (WINDOW) zabírá 2 bajty, obsahuje deklarovanou hodnotu velikosti okna v bajtech;

    Kontrolní součet (CHECKSUM) trvá 2 bajty a počítá se na segment;

    Ukazatel naléhavosti (URGENT POINTER) zabírá 2 bajty, používá se ve spojení s bitem kódu URG, označuje konec dat, která musí být urgentně přijata, navzdory přetečení vyrovnávací paměti;

    OPTIONS - toto pole má proměnnou délku a může zcela chybět, maximální velikost pole je 3 bajty;

    používá se k řešení pomocných problémů, například při volbě maximální velikosti segmentu;

PADDING, výplň s proměnnou délkou, je fiktivní pole používané k převedení velikosti záhlaví na celé číslo 32bitových slov. Spolehlivost TCP spočívá v tom, že zdroj dat je odesílá opakovaně, pokud neobdrží od příjemce do určité doby potvrzení, že byl úspěšně přijat. Tento mechanismus se nazývá Pozitivní povědomí s opakovaným přenosem (PAR) . Jak jsme již dříve definovali, jednotka přenosu (datový paket, zpráva atd.) v podmínkách TCP se nazývá segment. V hlavičce TCP je pole kontrolního součtu. Pokud dojde k poškození dat během přenosu, pak modul, který extrahuje TCP segmenty z IP paketů, to může určit. Poškozený paket je zničen a do zdroje se nic neodešle. Pokud data nebyla poškozena, jsou předána do sestavy zpráv aplikace a potvrzení je odesláno zdroji.

Orientace spojení je dána skutečností, že před odesláním datového segmentu si zdrojový a cílový TCP modul vymění řídicí informace. Tato výměna se nazývá podání ruky(doslova „podání ruky“). TCP používá třífázové podání ruky:

Zdroj potvrdí, že přijal cílový segment a odešle první část dat.

Graficky je tento proces znázorněn na obrázku 2.12.

Rýže. 2.12. Navazování TCP spojení

Jakmile je spojení navázáno, zdroj odešle data příjemci a čeká na potvrzení od něj, že byla přijata, pak odešle data znovu a tak dále, dokud zpráva neskončí. Zpráva končí, když je v poli flags nastaven bit FIN, což znamená „žádná další data“.

Je zřejmé, že streamovací povaha protokolu a požadavek na potvrzení příjmu dat způsobují problém s rychlostí přenosu dat. Chcete-li tento problém vyřešit, použijte „okno“ - pole - okno. Myšlenka použití okna je poměrně jednoduchá: přenášet data bez čekání na potvrzení jejich přijetí. To znamená, že zdroj přenese určité množství dat rovnající se oknu, aniž by čekal na potvrzení jejich přijetí, a poté přenos zastaví a čeká na potvrzení. Pokud obdrží potvrzení pouze pro část přenášených dat, začne vysílat novou část z čísla následujícího za potvrzeným. To je graficky znázorněno na obrázku 2.13.

Rýže. 2.13. Mechanismus přenosu dat TCP

V v tomto příkladu okno je nastaveno na šířku 250 bajtů. To znamená, že aktuální segment je segment s SYN offsetem 250 bajtů. Po vyslání celého okna však zdrojový TCP modul obdržel potvrzení o přijetí pouze prvních 100 bajtů. Přenos tedy začne od 101 bajtů, nikoli od 251.

Prozkoumali jsme tedy všechny základní vlastnosti protokolu TCP. Zbývá pouze vyjmenovat nejznámější aplikace, které TCP používá pro výměnu dat. Jedná se především o TELNET a FTP HTTP protokol což je srdce Celosvětově Web.

Přerušme trochu rozhovor o protokolech a zaměřme svou pozornost na tak důležitou součást celého systému TCP/IP, jakou jsou IP adresy.

Moc se mi líbí celá série článků a navíc jsem se vždycky chtěla vyzkoušet jako překladatelka. Možná, zkušení vývojářiČlánek se bude zdát příliš samozřejmý, ale zdá se mi, že v každém případě bude užitečný.

Dobrý den, jmenuji se Glenn Fiedler a vítám vás u prvního článku v mé online knize Network Programming for Game Developers.

V tomto článku začneme tím nejvíce základní aspekty síťové programování- příjem a přenos dat po síti. Příjem a přenos dat je hlavní a nejdůležitější jednoduchá část z celé škály úkolů, kterými se síťoví programátoři zabývají, ale často je obtížné určit, kterou cestou je nejlepší se vydat. Této části věnujte dostatečnou pozornost – pokud zůstanete s nedorozuměním, může to mít později pro vaši hru pro více hráčů hrozné následky!

S největší pravděpodobností jste již něco o soketech slyšeli a možná víte, že existují ve dvou hlavních typech – TCP a UDP. První věc, kterou se musíte při vývoji hry pro více hráčů rozhodnout, je, jaký typ socketů použít – TCP, UDP nebo oba?

Výběr typu zásuvky zcela závisí na žánru hry, kterou vyvíjíte. V tento cyklusčlánky, budu předpokládat, že píšete akční hru - jako Halo, Battlefield 1942, Quake, Unreal, CounterStrike, Team Fortress atd.

Nyní se blíže podíváme na vlastnosti jednotlivých typů socketů (vzhledem k tomu, že vyvíjíme hru v akčním stylu), a půjdeme trochu hlouběji do detailů fungování internetu. Po podrobná recenze správná možnost bude zřejmé!

TCP znamená „protokol řízení přenosu“ a IP znamená „internetový protokol“. Společně podporují téměř vše, co děláte online, od procházení webu po IRC a e-mailovou komunikaci – vše běží na TCP/IP.

Pokud jste někdy používali TCP sockety, pak byste měli vědět, že TCP je protokol, který využívá principu spolehlivého spojení. To znamená, že navážete spojení mezi dvěma počítači a poté mezi nimi posíláte data, stejně jako byste zapisovali informace do souboru na jednom počítači a načítali je ze stejného souboru na jiném.

V tomto případě je připojení považováno za spolehlivé a konzistentní – to znamená, že všechny informace, které odešlete, se zaručeně dostanou k příjemci ve stejném pořadí, v jakém byly odeslány. Také TCP spojení lze považovat za nepřetržitý proud dat – samotný protokol se stará o rozdělování dat do paketů a jejich odesílání po síti.

Ještě jednou - vše je tak jednoduché jako normální zápis nebo čtení ze souboru. Základní, Watsone!

Tato snadnost použití je však zcela odlišná od toho, co se ve skutečnosti děje „pod kapotou“, na nižší úrovni – na úrovni protokolu IP.

Na této úrovni neexistuje žádný koncept spojení – místo toho jednotlivé balíčky přenášeny z jednoho počítače do druhého. Tento proces si můžete představit jako předávání poznámky od jedné osoby druhé v místnosti plné lidí: nakonec se poznámka dostane ke správné osobě, ale zároveň projde mnoha rukama.

Neexistuje však žádná záruka, že se poznámka dostane k adresátovi. Odesílatel jednoduše pošle poznámku v naději, že dorazí, ale ani neví, zda zpráva dorazila nebo ne – dokud se příjemce nerozhodne odepsat.
Ve skutečnosti je samozřejmě vše trochu složitější, protože odesílající počítač nezná přesné pořadí počítačů v síti, přes které musí být paket přenesen, aby dorazil co nejrychleji. Někdy IP přenáší více kopií stejného paketu, které mohou mít různé cesty k dosažení cíle - a s největší pravděpodobností dorazí v různých časech.

Co když chceme přenášet informace mezi počítači nikoli ve stylu čtení/zápisu souborů, ale přímým odesíláním a přijímáním jednotlivých paketů?

No, můžeme to udělat pomocí UDP. UDP je zkratka pro „protokol uživatelských datagramů“ a běží nad IP (jako TCP), ale místo přidávání tuny funkcí je to jen malý doplněk k IP.

Pomocí protokolu UDP můžeme odeslat paket na konkrétní IP adresu (například 112.140.20.10) a port (například 52423) a bude přenášen z počítače na počítač, dokud nedosáhne svého cíle (nebo se ztratí na cesta).

Zároveň na straně přijímače jen sedíme a čekáme, posloucháme určitý port (v našem případě 52423), a když od někoho přijde paket (nezapomeňte, že se nepoužívají žádná spojení), obdržíme o tom upozornění s adresu a port odesílajícího počítače, velikost paketu a poté můžeme číst data z tohoto paketu.

Protokol UDP nezaručuje doručení dat. V praxi většina paketů samozřejmě dorazí, ale vždy dochází ke ztrátě cca 1-5% a někdy jsou časová období, kdy pakety nedorazí vůbec (nezapomeňte, že mezi odesílatelem a příjemcem může dojít k být tisíce počítačů, na kterémkoli z nich může selhat nebo se porouchat).

UDP také nezaručuje pořadí, ve kterém jsou pakety doručeny. Můžete odeslat pět paketů v pořadí - 1, 2, 3, 4, 5 - ale mohou dorazit ve zcela jiném pořadí - například 3, 1, 2, 5, 4. Opět v praxi budou s největší pravděpodobností většinou dorazí ve správném pořadí, ale na to se nelze spolehnout!

A konečně, i když UDP IP moc nepřidává, jednu věc zaručuje. Pokud paket přepošlete, dorazí buď celý, nebo vůbec. Pokud tedy odešlete 256 bajtový paket do jiného počítače, pak nemůže přijmout pouze prvních 100 bajtů z paketu – musí přijmout všech 256 bajtů. To je skutečně jediné, co protokol UDP zaručuje – vše ostatní padá na vaše bedra.

Musíme se tedy rozhodnout, zda použít TCP resp UDP sokety? Pojďme se podívat na jejich vlastnosti:

  • Využívá principu připojení
  • Garantuje dodání a obrat
  • Automaticky rozděluje informace do paketů
  • Zajišťuje, aby data nebyla odesílána příliš intenzivně (řízení toku dat)
  • Snadné použití – jako zápis/čtení ze souboru
UDP:
  • Nevyužívá princip připojení - budete jej muset implementovat ručně
  • Nezaručuje doručení a pořadí doručení balíků - mohou dorazit ve špatném pořadí, s duplikáty nebo nedorazí vůbec!
  • Musíte ručně rozdělit data do paketů a odeslat je
  • Je třeba dávat pozor, abyste data neposílali příliš intenzivně
  • Pokud dojde ke ztrátě paketu, musíte jej nějak sledovat a v případě potřeby znovu odeslat
S takovým seznamem se řešení zdá nasnadě – TCP implementuje veškerou funkcionalitu, kterou potřebujeme, a je snadněji použitelný, zatímco použití UDP slibuje hemeroidy s ručním psaním všeho od nuly. Takže používáme TCP, že?

Ale ne.

Použití TCP je pravděpodobně nejhorší chyba, kterou můžete při vývoji hry pro více hráčů udělat. Abychom pochopili proč, podívejme se na to, proč je použití TCP tak snadné!

Jak funguje TCP
TCP i UDP běží nad IP, ale ve skutečnosti jsou úplně jiné. UDP se chová velmi podobně jako IP, zatímco TCP abstrahuje uživatele od všech problémů s pakety, takže interakce s ním je podobná čtení/zápisu do souboru.

Jak to tedy dělá?

Za prvé, TCP používá abstrakci datového toku – do tohoto toku můžete jednoduše zapisovat bajty dat a TCP se postará, aby se dostaly na místo určení. Protože IP přenáší data v paketech a TCP běží nad IP, musí TCP rozdělit vstupní proud uživatele na jednotlivé pakety. Takže uvnitř TCP nějaká logika sbírá data do fronty, a když je jich dostatek, vytvoří paket a odešle je na místo určení.

Toto chování by mohlo být problémem pro naši hru pro více hráčů, pokud potřebujeme přenášet velmi malé pakety. Může se stát, že se TCP rozhodne nepřenášet naše data, dokud jich nebude dostatek na vytvoření paketu určitou velikost(řekněme více než sto bajtů). A tohle je - velký problém, protože je nutné co nejrychleji přenést data z klienta (stisknutí kláves hráče) na server a pokud dojde ke zpoždění kvůli ukládání dat do vyrovnávací paměti protokolem, nebude hra pro hráče na serveru nejpříjemnější. klientská strana. V tomto případě dojde k aktualizaci herních objektů se zpožděním a zřídka - zatímco my potřebujeme aktualizovat objekty včas a často.

TCP má možnost to opravit - "TCP_NODELAY". Sděluje protokolu, aby nečekal, až se data nashromáždí ve frontě odesílání, ale aby je okamžitě odeslal.

Bohužel, i když je tato možnost nainstalována, má TCP při použití mnoho problémů online hry.

Kořen všech problémů spočívá ve způsobu, jakým TCP zpracovává ztracené nebo neuspořádané pakety, čímž vytváří iluzi spolehlivého a konzistentního připojení.

Jak TCP zajišťuje spolehlivost připojení
Během přenosu TCP rozkládá datový tok na jednotlivé pakety, odesílá je po síti pomocí nespolehlivého IP protokolu a následně je rekonstruuje z přijímajícího počítače. přijaté pakety původní tok.

Co se ale stane, když jeden z paketů nedorazí? Nebo když balíčky dorazí nefunkční nebo s duplikáty?

Aniž bychom se příliš hluboce zabývali podrobnostmi o tom, jak TCP funguje (a to je opravdu velmi složité téma – můžete si to přečíst v TCP/IP Illustrated), proces vypadá takto: TCP odešle paket, zjistí, že paket nedorazil a znovu odešle stejný paket příjemci. Na straně příjemce jsou eliminovány duplicitní pakety a pakety, které dorazí mimo pořadí, jsou přeřazeny tak, aby bylo vše tak, jak má být – spolehlivě a v pořádku.

Problém je v tom, že když TCP „synchronizuje“ datový tok tímto způsobem, dojde v případě ztráty paketu k zastavení přenosu, dokud není ztracený paket znovu odeslán (a přijat cílem). Pokud během čekání dorazí nová data, zařadí se do fronty a nebudete je moci číst, dokud nedorazí ztracený paket. Jak dlouho trvá opětovné odeslání balíčku? Zabere to alespoň dobu oběhu paketu (když TCP určí, který paket je třeba znovu odeslat), plus dobu, kterou zabere opětovné doručení ztraceného paketu. Takže pokud je ping mezi počítači 125 ms, retransmisi Paket bude trvat asi jednu pětinu sekundy a v nejhorším případě až půl sekundy (představte si, že se náhle ztratí i nově odeslaný paket). Veselukha!

Proč byste nikdy neměli používat TCP pro hry pro více hráčů
Problém s používáním TCP v online hrách je ten, že na rozdíl od prohlížečů e-mail a další aplikace spoléhají hry na interakci v reálném čase. U mnoha aspektů hry, jako jsou klávesy stisknuté uživatelem a pozice hráčů ve hře, nezáleží na tom, co se stalo před sekundou, ale pouze na nejaktuálnějším stavu. herní svět.

Podívejme se na jednoduchý příklad hry pro více hráčů, jako je 3D střílečka. Síťová část Struktura hry je velmi jednoduchá: při každé iteraci herního cyklu klient posílá na server popis všech akcí hráče (stisknuté klávesy, poloha myši atd.) a při každé iteraci server tato data zpracovává, aktualizuje model herního světa a posílá zpět aktuální pozice objektů do klientského světa tak, aby pro hráče nakreslil nový rámec.

Takže v naší hře, pokud dojde ke ztrátě paketu při přenosu po síti, hra se zastaví a čeká, dokud nebude paket znovu doručen. Na straně klienta zamrznou herní objekty a na serveru se hráči také nemohou pohybovat nebo střílet, protože server nemůže přijímat nové pakety. Když ztracený paket konečně dorazí, obsahuje zastaralé informace, které již nejsou relevantní. Navíc poté dorazí také všechny pakety, které se nashromáždily ve frontě během čekací doby, a všechny je třeba zpracovat v jedné iteraci smyčky. Úplný zmatek!

Bohužel neexistuje způsob, jak toto chování TCP změnit a není to ani potřeba, protože to je význam TCP. To je nutnost, aby přenos dat přes internet byl spolehlivý a konzistentní datový tok.
Ale nepotřebujeme spolehlivý a konzistentní datový tok.

Chceme, aby se data dostala od klienta na server co nejrychleji, a nechceme čekat na opětovné odeslání dat.
To je důvod, proč byste nikdy neměli používat TCP pro hry pro více hráčů.

Ale počkej! Proč nemohu používat UDP i TCP společně?

Pro herní data v reálném čase, jako jsou kliknutí uživatelů a stav herního světa, jsou důležitá pouze nejaktuálnější data, ale pro jiné typy dat, jako jsou sady příkazů zasílané z jednoho počítače do druhého, spolehlivost a konzistence kanálu. může být velmi důležité.

Samozřejmě je lákavé používat UDP pro vstup uživatele a data o světovém stavu a TCP pro data, jejichž doručení musí být zaručeno. Možná si dokonce říkáte, že byste mohli vytvořit několik „vláknů“ příkazů – například jeden pro načítání úrovní, další pro příkazy AI. Říkáte si: „Nepotřebuji týmy AI čekat ve frontě, pokud se datový paket k načtení úrovně ztratí, protože spolu vůbec nesouvisejí!“ V v tomto případě máte pravdu a můžete se rozhodnout vytvořit podle TCP soket pro každý příkazový proud.

Na první pohled tohle skvělý nápad. Problém je ale v tom, že protože TCP i UDP běží nad IP, pakety obou protokolů se budou vzájemně ovlivňovat - již na úrovni IP. Jak přesně se tento efekt projeví, je velmi složitá otázka a souvisí s mechanismy spolehlivosti v TCP. V každém případě si však uvědomte, že použití TCP obvykle vede ke zvýšené ztrátě paketů UDP. Pokud se o tom chcete dozvědět více, můžete si přečíst




Nahoru