From afba13edfe35a8224afb0e3be0c65503f518e97c Mon Sep 17 00:00:00 2001 From: Piotr Maslanka <piotr.maslanka@henrietta.com.pl> Date: Thu, 16 Mar 2017 02:24:36 +0100 Subject: [PATCH] first --- build.py | 2 +- src/lab1.json | 2 +- src/lab1.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 136 insertions(+), 4 deletions(-) diff --git a/build.py b/build.py index 1c85fa9..d6b3136 100644 --- a/build.py +++ b/build.py @@ -27,12 +27,12 @@ if __name__ == '__main__': d['lp'] = unicode(ex_no) for k, v in d.iteritems(): - print k, v plab = plab.replace(u'$%s$' % (k, ), v) with open('dist/lab1/%s.md' % (ex_no, ), 'wb') as labout: labout.write(plab.encode('utf8')) os.system('pandoc dist/lab1/%s.md -s -o dist/lab1/%s.pdf' % (ex_no, ex_no)) + os.unlink('dist/lab1/%s.md' % (ex_no, )) diff --git a/src/lab1.json b/src/lab1.json index 81ed610..71ffd3d 100644 --- a/src/lab1.json +++ b/src/lab1.json @@ -1,5 +1,5 @@ [ { - + "http_hostname": "onet.pl" } ] \ No newline at end of file diff --git a/src/lab1.md b/src/lab1.md index 8f89aab..6c64bce 100644 --- a/src/lab1.md +++ b/src/lab1.md @@ -1,2 +1,134 @@ -# Nr $lp$ -ZaşóĹÄ gÄĹlÄ jaźŠ+Informatyka II +============== +EE-DI, WEiI PRz +--------------- +Laboratorium 1 +-------------- + +Z tego laboratorium przygotowujesz sprawozdanie. MoĹźe mieÄ ono dowolnÄ formÄ, byleby treĹÄ siÄ +zgadzaĹa. + +Rzeczy oznaczone cytatami blokowymi oznaczajÄ to, co masz zawrzeÄ w sprawozdaniu. Na przykĹad: + + Twoje imiÄ, nazwisko, adres e-mail, kierunek i rok studiĂłw oraz + grupÄ laboratoryjnÄ i numer albumu + +MogÄ byÄ to teĹź pytania, na ktĂłre w sprawozdaniu udzielisz odpowiedzi. + +KaĹźde Äwiczenie poprzedzaĹ bÄdzie wstÄp teoretyczny. Nie jest on dĹugi i mÄczÄ cy, wiÄc moĹźesz go przeczytaÄ. +Doskonale. Zaczynamy! + +# HTTP jako protokóŠtekstowy TCP +JednÄ z rzeczy, ktĂłrÄ poczÄ tkujÄ cym informatykom trudno jest zrozumieÄ, jest róşnica +w protokoĹach TCP i UDP. Oba sÄ protokoĹami warstwy transportowej OSI dziaĹajÄ cymi +na podstawie protokoĹu IP (czyli do komunikacji naleĹźy mieÄ adres IP), jednak +implementujÄ cymi nieco inne usĹugi. + +TCP, czyli _Transmission Control Protocol_, to poĹÄ czeniowy, niezawodny i strumieniowy protokĂłĹ. + +* **poĹÄ czeniowy** - zanim dojdzie do transmisji danych, naleĹźy zestawiÄ _poĹÄ czenie_. Obie maszyny +muszÄ wiÄc uzgodniÄ, Ĺźe bÄdÄ ze sobÄ rozmawiaÄ. Nie moĹźna wysĹaÄ pakietu TCP tak po prostu (no, +chyba Ĺźe to pakiet _nawiÄ Ĺź poĹÄ czenie_). +* **niezawodny** - jeĹli programista powie "wyĹlij bajty A B C D", to albo dojdÄ one kompletne, +w caĹoĹci, oraz tylko raz (sĹowem, tak jak zostaĹy wysĹane), albo nie dojdÄ wcale (awaria poĹÄ czenia). +Mimo, Ĺźe pakiety IP mogÄ byÄ po drodze gubione, a nawet duplikowane, TCP zapewnia Ĺźe dane dojdÄ tak, +jak zostaĹy wysĹane. +* **strumieniowy** - do TCP wysyĹamy ciÄ g bajtĂłw i otrzymujemy po drugiej stronie ciÄ g bajtĂłw. Ze wzglÄdu +na jego _niezawodnoĹÄ_, te bajty mogÄ byÄ dzielone, ĹÄ czone, ogĂłlnie mogÄ dziaÄ siÄ z nimi po drodze +róşne rzeczy. JeĹli wyĹlemy pakiet TCP o treĹci **Ala ma kota**, to niekoniecznie wĹaĹnie taki pakiet +dojdzie do nadawcy. MogÄ dojĹÄ do niego na przykĹad dwa pakiety - **Ala m**, oraz po jakimĹ czasie +dopiero **a kota**. + +Z jednej strony wiÄc rozpatrujÄ c TCP dostajemy pewne gwarancje, ktĂłrych sama warstwa sieciowa (w ktĂłrej) +dziaĹa tu IP, nam nigdy nie da, ale tracimy kontrolÄ nad swoimi pakietami. Pakiety mogÄ byÄ +gubione i przychodziÄ nie po kolei - TCP uĹoĹźy je oraz ponowi transmisjÄ za nas. PiszÄ c programy +korzystajÄ ce z TCP **nie wolno zakĹadaÄ** Ĺźe dane dojdÄ w takich czÄĹciach w jakich zostaĹy wysĹane. +Po prostu sÄ to ciÄ gi bajtĂłw. + +Z tego teĹź powodu naleĹźaĹo wymyĹliÄ sposĂłb, jak zaznaczyÄ Ĺźe jeden pakiet protokoĹu wyĹźszej warstwy +(np. takie zdanie) siÄ koĹczy, a drugi zaczyna. MoĹźliwe rozwiÄ zania sÄ trzy: +1. BÄdziemy na poczÄ tku wysyĹaÄ jak dĹugi jest pakiet, a dopiero potem pakiet. +2. UmĂłwimy siÄ, Ĺźe jakiĹ znak (bajt) bÄdzie rozdzielaĹ pakiety. +3. UmĂłwimy siÄ, Ĺźe kaĹźdy pakiet bÄdzie miaĹ identycznÄ , z gĂłry znanÄ dĹugoĹÄ. + +MoĹźliwoĹÄ 3 ogranicza nam pole manewru, wiÄc odrzucimy jÄ . W praktyce wykorzystywane sÄ pierwsze dwie +opcje. + +ProtokoĹy binarne, czyli zrozumiaĹe przez maszyny, wykorzystujÄ pierwszÄ moĹźliwoĹÄ, gdyĹź +Ĺatwo jest pisaÄ programy korzystajÄ ce z takich programĂłw, jest to rĂłwnieĹź bardziej wydajne. +Niestety, protokoĹy binarne w czystej formie sÄ bardzo trudne do zrozumienia dla czĹowieka +(chyba Ĺźe jest siÄ ekspertem z danego protokoĹu). + +Na szczÄĹcie **HTTP** jest protokoĹem tekstowym. Oznacza to, Ĺźe czĹowiek mĂłgĹby podejrzeÄ komunikacjÄ i bez wiÄkszego +problemu zrozumieÄ, o co chodzi. Nie zobaczy on _krzakĂłw_ (chyba Ĺźe wĹaĹnie ĹciÄ gamy taki plik), +a czytelny tekst. Zastosowano w nim moĹźliwoĹÄ 2 - tym znakiem jest **znak koĹca linii**. + +HTTP jest protokoĹem synchronicznym. Oznacza to, Ĺźe przy nawiÄ zanym poĹÄ czeniu to klient wysyĹa +zapytanie, a serwer odpowiada. Serwer sam z siebie nie moĹźe zaczÄ Ä "mĂłwiÄ" (chyba Ĺźe w _bardzo_ +szczegĂłlnych przypadkach). Po nawiÄ zaniu poĹÄ czenia (HTTP korzysta z TCP, wiÄc musi najpierw nawiÄ zaÄ) +serwer czeka na ĹźÄ danie klienta, a po jego otrzymaniu wysyĹa odpowiedĹş i kod statusu. + +Najbardziej znany kod statusu to HTTP 404. Poprawne odpowiedzi to kody 2xx, a "przeniesiono" to 3xx. +BĹÄdy strony serwera (czyli nie z winy klienta) to 5xx. + + Co to znaczy HTTP 404? + +WspominajÄ c o protokoĹach tekstowych raczej nie mĂłwimy o pakietach. W koĹcu czytajÄ c ksiÄ ĹźkÄ teĹź +ciÄĹźko o nich mĂłwiÄ - sÄ tam wyrazy, zdania, ale nie pakiety. + +WadÄ protokoĹu tekstowego jest fakt, Ĺźe maszyna musi siÄ nieco bardziej wysiliÄ, aby skorzystaÄ z +tego protokoĹu. SÄ one rĂłwnieĹź wolniejsze. ZaletÄ jest ich zrozumiaĹoĹÄ bez wyspecjalizowanego +oprogramowania, co w poczÄ tkach Internetu byĹo bardzo waĹźne. Ĺatwiej teĹź pisaÄ _bardzo proste_ +programy, ktĂłre majÄ z nich korzystaÄ. + + Z ktĂłrego roku jest obecnie wykorzystywana wersja HTTP - HTTP/1.1? + +Pobierz [PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html). +PuTTY jest uniwersalnym klientem protokoĹĂłw tekstowych. MoĹźemy wiÄc nim obsĹuĹźyÄ wiele +róşnych protokoĹĂłw. Zazwyczaj korzystajÄ z niego administratorzy do logowania na serwery, +ale moĹźemy nim rĂłwnieĹź obsĹuĹźyÄ HTTP (choÄ nie jest to wygodne). + +ZarĂłwno TCP, jak i UDP do wysĹania danych wymagajÄ podania (oprĂłcz adres IP) tzw. _portu_. Port +to liczba od 0 do 65536. + + Ilu bitĂłw wymaga zapisanie jednego portu TCP/UDP? + +Port sĹuĹźy do okreĹlenia _czego dokĹadnie_ chcemy od docelowej maszyny. MoĹźe mieÄ ona bowiem +wiele usĹug - np. WWW, poczta elektroniczna czy serwer plikĂłw. Port pozwala na okreĹlenie tej usĹugi. +Znane protokoĹy majÄ rĂłwnieĹź znane numery portĂłw. Nadawaniem ich zajmuje siÄ IANA - _Internet Assigned +Numbers Authority_ - jedna z organizacji zarzÄ dzajÄ cych Internetem. Aby poĹÄ czyÄ siÄ za pomocÄ HTTP, +musimy znaÄ jego port. + + Ustal, na ktĂłrym porcie ĹÄ czy siÄ HTTP + +ZnajdĹş w sieci Internet, jak wyglÄ da przykĹadowe ĹźÄ danie i odpowiedĹş HTTP. SĹowa kluczowe: **GET**, **HTTP/1.1**. + + Zapisz tÄ przykĹadowÄ parÄ, wraz z ĹşrĂłdĹem + +W pierwszej linii zawarto tzw. metodÄ HTTP oraz wersjÄ protokoĹu. NastÄpnie wystÄpuje seria nagĹĂłwkĂłw +ĹźÄ dania, czyli par _nazwa nagĹĂłwka_ - _wartoĹÄ_, ktĂłre klient decyduje siÄ podaÄ serwerowi. + + Czy przy uĹźyciu PuTTY mĂłgĹbyĹ uĹźyÄ protokoĹu HTTP/2.0? + +Gdy to zrobisz, uruchom PuTTY. Istotne sÄ trzy pola: +* **Host Name** - nazwa docelowej strony. W twoim przypadku wpisz tu **$http_hostname$** +* **Port** - port, z ktĂłrym bÄdziemy siÄ ĹÄ czyÄ. Wpisz odpowiedni +* **Connection type** - w niektĂłrych protokoĹach maszyna musi nam pomĂłc (np. bo sÄ szyfrowane). HTTP +takim nie jest, wiÄc wybierz _Raw_ + +JeĹli poĹÄ czenie zostanie poprawnie nawiÄ zane, wyĹwietli siÄ czarne okno. Wpisz kompletne zapytanie +HTTP o TwojÄ stronÄ, sugerujÄ c siÄ znalezionym przykĹadem. + + Zapytaj o zasĂłb gĹĂłwny (/) strony $http_hostname$. Wzoruj siÄ + na znaleziony przykĹadzie. Wynikiem zapytania musi byÄ kod 2xx + lub 3xx. + + Zapisz caĹoĹÄ sesji. AbyĹ miaĹ na to czas, przydatne moĹźe byÄ uĹźycie + nagĹĂłwka Keep-Alive. + + Najprawdopodobniej nie zadziaĹa to bez uĹźycia nagĹĂłwka Host. + PamiÄtajÄ c, Ĺźe adres strony, ktĂłry wpisaĹeĹ, zostaĹ zamieniony + na adres IP przed poĹÄ czeniem (a nie przesĹany do serwera), + sprĂłbuj uzasadniÄ dlaczego. + +sds -- GitLab