vyuka:psi:cviceni:uloha2-udp-zadani

Úloha č.2 - UDP Klient

Robot Karel byl vyslán na průzkumnou misi do hlubokého vesmíru na planetu Indri VIII. Bohužel však během několika hodin po přistání přestal komunikovat. V řídícím centru si dlouho vědci mysleli, že robot havaroval, protože jeho poslední hlášení obsahovalo řetězec “594 ROBOT SE ROZPADL”. Kód 594 sice nebyl ve specifikaci definovaný, vědci se však domnívali, že jde o malou chybu vzniklou během přenosu.

Přelom nastal po 14 dnech, kdy do řídícího centra přišla náhle zpráva: “200 Au.”, která vyvolala paniku. Okamžitě bylo zahájeno skenování, které přineslo pouze dva nové poznatky. Prvním poznatkem byl fakt, že robot stále žije a občas komunikuje. Druhým závěrem bylo zjištění, že si ohnul tykadlo a ztratil teplotní senzor.

Nastalo období, kdy vědci zkoušeli všechno, co je napadlo, jen aby získali kontrolu nad robotem. Nedařilo se. Až jednou kdosi omylem vyzkoušel přečíst data ze ztraceného teplotního senzoru. Teplotu sice vědci nezjistili, avšak nastal významný moment: procesor se během čtení teploty zrestartoval tak šťastně, že jeho datový segment byl nastaven na hodnotu, kterou nebohý robot celou dobu hledal. Jak bylo později zjištěno, ohnuté tykadlo zkratovalo hlavní procesor a došlo k opakovaným restartům robota. Když po dvou týdnech tykadlo vlivem atmosféry zkorodovalo, procesor obnovil činnost, ovšem bez několika klíčových bloků. Blok zavaděče operačního systému sice fungoval, operační systém však nezavedl, protože jeden z CD-ROMů měl v sobě díru. Navíc byl zavaděč zmatený a tak se svou špatnou hodnotou datového segmentu, kterou získal z díry v CD-ROMu, rozesílal zmatené zprávy.

Poté, co vědci pochopili, co se s robotem děje, úspěšně obnovili zavaděč a nastartovali robota do režimu, kdy lze načíst základní údaje ze senzorů a také provést upload nového firmwaru. V tomto režimu se robot nachází i nyní.

Vaším úkolem je:

  1. načíst fotografii okolí, aby mohli vědci zjistit, v jakém terénu se robot nachází
  2. provést upload nového firmwaru do robota

Robot komunikuje pomocí protokolu UDP a přijímá data na portu 3999. Proces zavaděče v robotovi budeme nazývat serverem a proces, který s robotem komunikuje, klientem.

identifikátor 'spojení'sekvenční čísločíslo potvrzenípříznakdata
4B2B2B1B0-255B
  • identifikátor 'spojení' - vygenerovaný serverem (pro umožnění transportu dat více souborů najednou),
  • sekvenční číslo - číslo prvního byte v posílaných datech,
  • číslo potvrzení - číslo očekávaného byte v přijímaných datech (číslo potvrzení + délka dat),
  • příznak - uveden dále,
  • data - přenášená data

Identifikátor spojení a sekvenční čísla se přenášejí v reprezentaci network byte order (big endian). Příklad:

dekadickyhexadecimálněpořadí bytů
1234 04D2h 04h D2h
34566 8706h 87h 06h

Identifikátor spojení

Identifikátor spojení je nenulové číslo. Při navazování spojení posílá klient identifikátor spojení nastavený na nulu. Při další komunikaci použije klient identifikátor spojení, který mu vrátí server v prvním paketu.

Příznaky

číslo bitu76543 2 1 0
příznak - - - - - RST FIN SYN
příznakvýznam
SYN Otevření nového spojení. Posílá klient i server (pouze) na začátku v prvním paketu. Pokud posílá paket klient, musí být v datové části 1 byte s kódem příkazu.
FIN Ukončení spojení. Posílá klient i server, pokud již nemají žádná další data k odeslání. Paket s nastaveným příznakem FIN již nemůže obsahovat žádná data. Ukončení spojení nelze odvolat. Oba směry spojení se uzavírají zvlášť. Sekvenční číslo se po odeslání FIN již nesmí zvětšit.
RST Zrušení spojení kvůli chybě. Posílá klient i server v případě detekování logické chyby v hodnotách v hlavičce. Např. přijatý paket neobsahuje příznak SYN a ID spojení není evidováno. Nebo je hodnota potvrzovacího čísla menší, než byla v posledním přijatém paketu (klesá). Pozor na přetečení sekvenčních a potvrzovacích čísel. Žádná z komunikujících stran po odeslání paketu s příznakem RST již dále neukončuje spojení standardním způsobem - spojení je přenosem paketu s příznakem RST definitivně ukončeno.

Jednotlivé příznaky (SYN, FIN, RST) nelze spolu kombinovat.

Sekvenční číslo je pořadové číslo prvního bytu v proudu posílaných dat. Na začátku je toto číslo nastaveno na nulu. Nastavení příznaku SYN nebo FIN toto číslo nemění.

Číslo potvrzení sděluje protistraně pořadové číslo očekávaného bytu v proudu přijímaných dat. Potvrzuje zároveň všechny byty s nižším pořadovým číslem.

Tato čísla nemají znaménko a mohou přetéct. Přetečení nemá na komunikaci vliv.

Délka dat je určena velikostí paketu mínus velikost hlavičky. Poslat lze najednou maximálně 256 bytů dat, takže nejmenší velikost datagramu je 9 B (pouze hlavička) a největší 9 + 256 = 265 B. Data lze poslat pouze v paketu bez nastaveného příznaku FIN a RST. Pokud má paket nastaven příznak SYN a odesílatelem je klient, musí být v datové část 1 byte s kódem příkazu.

Data poslaná klientem se v číslují pomocí sekvenčního čísla, avšak pouze tehdy, pokud není nastaven žádný příznak (zejména SYN).

Iniciátorem spojení je vždy klient.

Klient pošle první datagram s příznakem SYN a s identifikátorem spojení, sekvenčním číslem a číslem potvrzení nastaveným na nulu. Datová část musí obsahovat právě 1 byte s kódem příkazu:

příkazvýznam
01hDownload fotografie okolí
02hUpload nového firmwaru

Server odpoví datagramem s nastaveným příznakem SYN, nenulovým identifikátorem spojení a se sekvenčním číslem a číslem potvrzení nastavenými na nulu. Datová část je prázdná.

Po přijetí tohoto datagramu klientem je navázáno spojení. V dalším paketu začne klient nebo server odesílat data (podle poslaného příkazu).

Pokud se paket s příznakem SYN ztratí, musí klient odeslat nový. Případné spojení vytvořené na straně serveru se po 10 sekundách uzavře (bude odeslán paket s příznakem RST a nastaveným identifikátorem spojení).

Data lze posílat až po navázání spojení. Posílání dat je neslučitelné s nastavováním libovolných příznaků (SYN, RST, FIN) (v této terminologii nechápeme příkaz v prvním paketu poslaným klientem jako data). V dalším textu nazveme vysílačem tu stranu, která data odesílá a přijímačem protistranu.

Pokud posílá některá ze stran soubor dat delší než 256 bajtů (což je v této uloze vždy), používá se okénkové potvrzovací schéma s fixní velikostí okénka W = 2048 bytů a timeoutem Tout = 200 ms.

Vysílač se snaží mít v komunikačním kanále právě tolik nepotvrzených bytů odesílaného proudu dat, jako je velikost okénka. Při zahájení komunikace zapíše do kanálu W bytů a čeká na potvrzení. Klient (přijímací strana) reaguje na všechny příchozí pakety odesláním potvrzovacího paketu (paketu s nastaveným potvrzovacím číslem). Potvrzovací číslo popisuje pořadové číslo očekávaného bytu v proudu přijímaných dat, takže každé potvrzovací číslo potvrzuje příjem všech dat až do tohoto pořadového čísla (bez něj). Pokud přijme klient (přijímač) data mimo pořadí, zapamatuje si je a odešle potvrzovací číslo nastavené za poslední přijatý byte v proudu dat bez mezer. Jakmile jsou mezery zaplněny nově přijatými daty, posune klient potvrzovací číslo tak, aby opět ukazovalo za poslední přijatý byte v celistvém proudu přijímaných dat. Data mimo pořadí jsou tedy nakonec využita, klient je však zprvu nepotvrzuje. Potvrzuje vždy pouze přijatý datový proud bez mezer.

Jakmile vysílací strana přijme paket s takovým potvrzením, které snižuje počet nepotvrzených dat v odesílaném proudu, odešle další data, tak, aby bylo v kanále opět W nepotvrzených bytů (říkáme, že posune okénko).

Vysílač si pamatuje čas odeslání posledního paketu (označme T). Pokud server nepřijme do času T + Tout žádné nové potvrzení, které snižuje počet nepotvrzených dat, odešle vysílač W bytů od nevyššího přijatého potvrzovacího čísla (říkáme, že odešle celé okénko). Nastaví také T na novou hodnotu.

Pokud vysílač přijme 3x po sobě stejné potvrzovací číslo, odešle ihned do kanálu 1 paket s maximálním možným množstvím dat od pořadového čísla shodného s přijatým potvrzovacím číslem a nastaví T na novou hodnotu.

Pokud vysílač odešle celý soubor a má všechna odeslaná data potvrzená, uzavře spojení nastavením příznaku FIN. Tento příznak nelze kombinovat s odesláním posledních dat. Přijímač vzápětí odešle také paket s příznakem FIN.

Spojení je oboustranně ukončeno v momentě, kdy obě strany, které již odeslaly paket s nastaveným příznakem FIN, obdrží paket s nastaveným příznakem FIN a potvrzovacím číslem se stejnou hodnotou, jako je sekvenční číslo.

Pokud dojde 10x po sobě k opakovanému odvysílání celého okénka dat, aniž by bylo přijato potvrzení, je spojení přerušeno, klient musí vypsat chybu při přenosu. To platí i při uzavírání spojení, kdy je odesílán příznak FIN.

příkaz 01h - fotografie okolí

Jakmile robot odešle první paket s nastaveným příznakem SYN, začne ihned odesílat fotografii okolí. Pokud byl první paket (SYN) ztracen, spojení po 10 sekundách expiruje (klient žádá o nové spojení posláním nového SYN paketu).

Poslaná fotografie je ve formátu PNG a posílá se pouze její obsah, nikoliv název souboru nebo nějaká další informace. Každá odeslaná fotografie je jedinečná (fotografie získané v rámci různých spojení se liší).

příkaz 02h - upload nového firmwaru

Jakmile klient přijme od serveru první paket s nastaveným příznakem SYN, začne odesílat obsah souboru s firmwarem. Neposílá se žádná jiná doplňující informace, jako např. jméno souboru nebo jeho délka.

Po přijetí chybného paketu odešle příjemce (klient i server) paket s příznakem RST. Chybný paket je paket, který:

  • neobsahuje platné ID spojení a nemá nastaven příznak SYN
  • nemá potvrzovací číslo v intervalu <seq - velikost okénka, seq> kde seq je sekvenční číslo příjemce
  • má nastaven více příznaků najednou
  • má nastaven příznak SYN a datová část neobsahuje platný příkaz (délka dat není 01h a/nebo příkaz není 01h nebo 02h)
  • má nastaven příznak FIN a zároveň obsahuje data

Pozor, sekvenční a potvrzovací čísla mohou přetéct, což nesmí mít na komunikaci vliv.

Možné chyby na síti:

  • ztráta libovolného paketu,
  • duplikace libovolného paketu,
  • prohození libovolných 2 paketů,
  • proměnné zpoždění sítě (10us - 1000ms),

Server tyto chyby emuluje. Může se stát, že server 10x způsobí ztrátu stejného paketu a dojde k odeslání paketu s příznakem RST a rozpadu spojení.

/*

Posílají se řetězce a binární data. Znaky mimo rozsah se ignorují. Jméno souboru má maximálně 200 znaků.

LIST

LIST\0

GET <jmeno souboru>

GET jmeno souboru\0

  • 250 OK
  • 251 DATA <data>
  • 500 <jmeno souboru> neexistuje

PUSH <jmeno souboru>

PUSH jmeno souboru\0

  • 250 OK
  • 501 konflikt <jmeno souboru>
  • 502 spatne jmeno <jmeno souboru>

DATA <data>

  • 503 UNKNOWN <prvnich 6 znaku neznameho prikazu>

*/

  • program musí 100% fungovat s protistranou na serveru baryk.felk.cvut.cz (viz níže),
  • program musí být stabilní a odolný proti neočekávaným vstupům,
  • přenesený soubor (download i upload) nesmí být poškozen,
  • program se musí umět vyrovnat s faktem, že UDP pakety se občas ztratí, zduplikují či prohodí,
  • program by měl vypisovat alespoň základní informace o svém stavu (např. posílané a přijímané příkazy či odpovědi),
  • IP adresa nebo DNS jméno serveru a port se zadávají jako parametr v příkazové řádce při spuštění programu (tzn. není zadrátovaná ve zdrojového kódu), syntaxe viz níže,
  • zdrojový text musí být komentovaný, v hlavičce všech zdrojových textů musí být uveden autor,
  • povolené programovací jazyky jsou následující: Java, C, C++.
  • program pište do jednoho zdrojového souboru. Tento soubor můžete pojmenovat jakkoliv, avšak s příponou .c, .cpp nebo .java. Tyto soubory musí být přeložitelné řádkovým překladačem (gcc/g++/javac). Odevzdává se pouze tento jeden zdrojový kód, neimplementujte tedy nic do dalších souborů mimo něj.
  • pokud použijete jazyk Java, napište na začátek zdrojového textu package robot a třídu s metodou main pojmenujte Robot. Můžete použít připravenou šablonu, která je k dispozici ke stažení mezi příklady programů.
  • program musí přijímat parametry z příkazové řádky s následující syntaxí:

Download fotografie (příkaz 01h): ./robot <server>
Výsledná fotografie bude uložena v souboru foto.png.

Upload firmwaru (příkaz 02h): ./robot <server> <firmware.bin>

<server> je jméno nebo IP adresa serveru a <firmware> je soubor s novým firmwarem pro robota.

Příklad volání: java robot.Robot 81.25.17.115 /data/firmware.bin

  • každý student má povinnost průběžně uploadovat aktuální stav svého zdrojového kódu přes WWW rozhraní serveru Baryk. Předpokládá se, že vždy po ukončení práce na programu nahrajete svůj kód na server Baryk. Také se předpokládá, že pokud k danému dni není záznam o uploadu Vašeho programu, tak jste na programu tento den nepracoval(a). Jinak řečeno, uploadováním svého programu vykazujete činnost (stejně jako v komerčním prostředí) a zároveň se chráníte před obviněním z nepoctivého jednání (přečtěte si obecné požadavky na úlohy na hlavní stránce předmětu).

Testovací server běží na baryk.felk.cvut.cz na portu 4000. Proti tomuto serveru můžete zkoušet funkčnost Vašeho řešení klienta. Pozor, server může být schován za NATem, který bude komunikaci filtrovat. Proto bylo na serveru Baryk vyrobeno rozhraní, přes které můžete uploadovat svůj zdrojový kód a Baryk jej:

  1. zaarchivuje
  2. přeloží
  3. spustí a otestuje

Překlad bude proveden podle použitého jazyka takto:

C gcc -o robot source.c
C++ g++ -o robot source.c
Java javac source.java

Pokud budete testovat váš program přes síť, výsledek testování bude zobrazen na webu serveru Baryk.

Pro testování uploadu firmwaru do robota využijte poslední verzi firmwaru, která je k dispozici o pár řádek níže.

souborodkazsha1
firmware v1.6.0firmware-karel-1.6.0.bin ea0fc5e48008b827f845b427f3ce8ff574db2da8

Úlohu je třeba odevzdat do 26.4./28.4./3.5./5.5. (podle termínu Vašeho cvičení, tj. cvičení, kam jste zapsáni podle rozvrhu).

Za každý týden prodlení je penalizace -0,5 bodu (jako přelom týdne se počítá konec cvičení). Úlohu je možné odevzdat pouze do konce července.

Odevzdat lze pouze takový program, který:

  • je přeložitelný na serveru baryk.felk.cvut.cz
  • dodržuje syntaxi příkazové řádky (je tedy možno jej otestovat na serveru baryk.felk.cvut.cz)
  • komunikuje se serverem baryk.felk.cvut.cz a je schopný úspěšně stáhnout fotografii (pro odevzdání stačí předvést úspěšné stažení souboru s fotografií bez ohledu na následky u serveru či klienta)

Postup odevzdání:

  1. otestujte svoje řešení na serveru Baryk
  2. připravte si zdrojové texty k nahlédnutí
  3. připravte si internetový prohlížeč na server Baryk a připravte se na překlad zdrojového kódu
  4. spusťte terminál, nastavte adresář s Vaší úlohou jako aktuální a zadejte příkaz ls -l
  5. zavolejte cvičícího

Za úlohu můžete dostat max. 8 bodů. Penalizace:

  • program neumí stáhnout fotografii: nelze odevzdat !
  • program neumí provést upload firmwaru: -4
  • nebylo korektně uzavřeno spojení: -1
  • chybně implementovaný okénkový protokol: dle povahy -1 až -4
  • nestabilita: -3
  • malá odolnost vůči nestandardním vstupům: -3
  • chyby v programu, které se neprojevily přímo: dle povahy -1 až -5
  • nečistý zdrojový kód: -1
  • zdrojový kód nebyl průběžně uploadován na server Baryk: -5
  • vyuka/psi/cviceni/uloha2-udp-zadani.txt
  • Last modified: 2011/03/10 08:31
  • by misko