Programowanie Sieciowe 2 Protokoły komunikacyjne: HTTP mgr inż. Tomasz Jaworski tjaworski@kis.p.lodz.pl http://tjaworski.kis.p.lodz.pl/
Protokoły komunikacyjne HTTP HyperText Transport Protocol 2
Protokół HTTP Hypertext Transport Protocol Hipertekst tekst + odnośniki (linki). Najczęściej (po za DNS) wykorzystywany protokół w sieci Internet Do komunikacji między klientem a serwerem WWW 3
Informacje o protokole HTTP w sieci Internet RFC 1945: http://www.faqs.org/rfcs/rfc1945.html (HTTP 1.0) RFC 2616: http://www.faqs.org/rfcs/rfc2616.html (HTTP 1.1) W3C: http://www.w3.org/protocols/ (HTTP 1.1) http://www.tutorialspoint.com/http/index.htm HTTP Made Really Easy: Practical Guide to Writing Clients and Servers - http://www.jmarshall.com/easy/http/ Protokół HTTP: wszystko, co musisz wiedzieć o modyfikowaniu nagłówków: http://webhosting.pl/protokol.http.wszystko.co.musisz.wiedziec.o. modyfikowaniu.naglowkow Wikipedia EN i PL 4
Idea HTTP Adres URL Tekst HTML, Obrazy, pliki video Model komunikacji: Wielu klientów jeden serwer, Szablon komunikacji: żądanie (wysyła klient) odpowiedź (wysyła serwer) 5
Budowa adresu URL Uniform Resource Locator Ujednolicony format adresowania zasobów, stosowany w Internecie i sieciach lokalnych. protokół (http, ftp, news, gg) nazwa hosta (google.com) port (jeśli nie podany, to domyślny dla danego protokołu) ścieżka do zasobu nazwa zasobu http://tjaworski.kis.p.lodz.pl/ps1/zaliczenie.pdf http://tjaworski.kis.p.lodz.pl:80/ps1/zaliczenie.pdf 6
Protokół HTTP Protokół warstwy niższej to TCP HTTP wykorzystuje strumienie TCP do transmisji danych Domyślny port: 80 Protokół Tekstowy oparty na liniach, zakończonych bajtami \r\n (CR i LF) z elementami binarnymi (np. obrazy) Oparty na kodach, np. 404 Klient wysyła żądania (requests) Serwer odsyła odpowiedzi (responses) Po nawiązaniu połączenia klient rozpoczyna komunikację 7
HTTP a model OSI/TCP Aplikacja (przeglądarka, downloader) Warstwa aplikacji (np. moduł przeglądarki) Warstwa Transportowa HTTP, FTP, SMTP, POP3, GG TCP Warstwa Sieciowa Warstwa Fizyczna IP Ethernet, światłowód 8
Żądanie HTTP Typ metody żądania (np. GET) i jej parametrów 1 linia Nagłówek żądania n linii Nazwa hosta docelowego (wiele hostów, jeden IP) Typ i długość przesyłanych danych (dla POST) 2 linie Typ przeglądarki (User agent) 1 linia Ciasteczka 1 linia Poprzednia strona 1 linia Pusta linia 1 linia Ewentualna treść danych przesyłanych do serwera 9
Przykładowe żądanie (request) przesłane przez klienta do serwera GET / HTTP/1.1 Host: tjaworski.kis.p.lodz.pl User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Firefox/3.6.13 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: pl,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Pusta linia! 10
Metody HTTP (klient -> serwer) GET, POST, HEAD, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH Najważniejsze: GET, POST GET Pobiera z serwera zasób opisany przez adres URL Pobranie obrazka Uruchomienie program CGI (np. PHP), który wygeneruje treść zasobu (plik HTML, obraz PNG, itp.) POST Wysłanie danych do zasobu opisanego przez adres URL, do dalszego przetwarzania. Najczęściej jest to formularz HTML Dane przesłane są w treści żądania Odbierane przez program CGI (np. PHP) Służy do wysyłania nowych lub aktualizacji istniejących zasobów HEAD Wysyła taki sam nagłówek jak GET, jednak serwer nie rozpoczyna transmisji ciała zasobu (przesyłane są jedynie informacje nagłówkowe) Przeglądarka sprawdza, czy w lokalnym cache jest aktualna wersja zasobu 11
Odpowiedź HTTP Wersja protokołu, np. HTTP/1.1 1 linia Kod błędu, np. 404 Opis kodu błędu, np. Not found Nagłówek odpowiedzi n linii Czas serwera 1 linia Informację o serwerze 1 linia Ciasteczka 1 linia Informacje o typie zasobu i jego długości 2 linie Pusta linia 1 linia Treść danych przesyłanych przez serwer 12
Przykładowa odpowiedź (response) przesłana przez serwer do klienta HTTP/1.1 200 OK Date: Mon, 28 Feb 2011 12:15:57 GMT Server: Apache/2.2.11 (FreeBSD) mod_ssl/2.2.11 OpenSSL/0.9.7e-p1 DAV/2 PHP/5.3.3 X-Powered-By: PHP/5.3.3 Content-Length: 7059 Keep-Alive: timeout=60, max=83 Connection: Keep-Alive Content-Type: text/html Linia statusu odpowiedzi Pusta linia! <html><head><meta http-equiv="content-type"content="text/html; charset=utf-8" /> <title>tytuł strony</title></head>. 13
Kody błędów w linii statusu odpowiedzi Tylko w komunikacji serwer -> klient HTTP/1.1 <kod> <opis> Kody: 1xx zarezerwowane na przyszły użytek 2xx powodzenie, polecenie poprawne, zostało zrealizowane 3xx przekierowania, konieczne dalsze polecenia 4xx błąd składni, błąd po stronie klienta 5xx błąd serwera 14
Kody błędów 200 OK + treść zasobu (np. plik zip), 301 Moved permanently, zasób został przeniesiony. Serwer może podać nowy adres URL, 400 Bad request, nieprawidłowe żądanie, błąd składni, 401 Unauthorized, brak dostępu, konieczna autoryzacji, 403 Forbidden, serwer nie może zwrócić danego zasobu ze względu na bezpieczeństwo, 404 Not found, zasób nie został znaleziony, 500 Internal server error, błąd wewnętrzny serwera, np. wyjątek podczas wykonywania 15
Przykład komunikacji Przeglądarka chce pobrać plik: http://tjaworski.kis.p.lodz.pl/ps1/zaliczenie.pdf http:// oznacza użycie protokołu HTTP Sprawdzenie tjaworski.kis.p.lodz.pl w DNS 212.191.89.60 Nawiązanie połączenia TCP na adres: 212.191.89.60, port 80 Wysłanie tekstu: GET /ps1/zaliczenie.pdf\r\n 16
A serwer na to HTTP/1.1 200 OK\r\n Date: Mon, 28 Feb 2011 15:18:05 GMT\r\n Server: Apache/2.2.11 (FreeBSD) mod_ssl/2.2.11 OpenSSL/0.9.7e-p1 DAV/2 PHP/5.3.3 with Suhosin-Patch\r\n Last-Modified: Tue, 19 Oct 2010 15:42:03 GMT\r\n Etag: "1373850-17421-492fa225f68c0 \r\n Accept-Ranges: bytes\r\n Content-Length: 95265\r\n Keep-Alive: timeout=60, max=98\r\n Connection: Keep-Alive\r\n Pusta linia! Content-Type: application/pdf\r\n \r\n %PDF-1.4%ÇěŹ 5 0 obj<</length 6 0 R/Filter /FlateDecode>>stre 95,265 bajtów 17
Drobna uwaga do implementacji Proszę pamiętać, że w protokole HTTP każda linia nagłówka kończy się dwoma bajtami końca linii CR i LF. CR ma kod 13, LF = 10 CR = "\r" LF = "\n" W C#: String nowa_lina = "\r\n"; Alternatywnie: Environment.NewLine Równie ważne: nagłówek oddzielony jest od treści odpowiedzi jedną pustą linią. Proszę pamiętać, że błędna implementacja każdego protokołu powoduje błędy klienta. Jeśli przeglądarka otrzyma odpowiedź, której nie zrozumie najprawdopodobniej przerwie komunikację nie wyświetlając żadnego błędu. 18
Przykład z wykorzystaniem narzędzia TELNET telnet> open google.pl 80 Trying 74.125.77.104... Connected to google.pl. Escape character is '^]'. GET / HTTP/1.0 302 Found Location: http://www.google.pl/ Cache-Control: private Content-Type: text/html; charset=utf-8 Set-Cookie: PREF=ID=b6046eaa.; expires=wed, 27-F Set-Cookie: NID=44=YgL5_...; domain=.google.com; HttpOnly Date: Mon, 28 Feb 2011 17:04:53 GMT Server: gws Content-Length: 218 X-XSS-Protection: 1; mode=block <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>302 Moved</TITLE></HEAD><BODY> <H1>302 Moved</H1> The document has moved <A HREF="http://www.google.pl/">here</A>. </BODY></HTML> Connection closed by foreign host. 19
Co serwer wie o kliencie? Adres IP klienta. Jeśli klient łączy się przez NAT, to IP jest adresem bramy. Jeśli klient łączy się przez serwer proxy, to serwer ten może informować o tym fakcie serwer WWW i podawać adres lokalny klienta. Typ przeglądarki (IE, FF, GCH, ) Adres aktualnej strony Serwer WWW wie, z jakiej strony nastąpiło wywołanie URL Ciasteczka (na stałe kojarzone z domeną) Odpowiedź serwera może zawierać instrukcje co do modyfikacji ciasteczek przechowywanych u klienta, Przeglądarka interpretuje nagłówek odpowiedzi i odpowiednio modyfikuje ciasteczka dla danej domeny Przy kolejnej komunikacji, przeglądarka przesyła zestaw ciasteczek do serwera 20
Ciasteczka Jedna z form monitorowania użytkownika Serwer wysyła prośbę(!) zapisania ciasteczka przez przeglądarkę: Set-Cookie: nazwa=wartosc; expires=data; path=sciezka; domain=domena; secure\r\n Klient (przeglądarka) może ciasteczko zapisać, lub nie. Jeśli ciasteczko jest zapisane, to przy następnej komunikacji z serwerem, klient wysyła je: Cookie: nazwa1=wartosc1; nazwa2=wartosc;...\r\n 21
Niedoskonałości HTTP Brak obsługi sesji z danym klientem Najczęściej stosuje się techniki pośrednie, np. Sesje w PHP Inne metody to: Rozbudowa adresu URL, Ukryte pola formularza, Ciasteczka (głównie strona klienta) Ubogi mechanizm autoryzacji 22
Optymalizacja ruchu Wykorzystanie pola Last-modified odpowiedzi przez klienta cache treści poszczególnych zasobów, Określenie przez serwer wielkości zasobu: Content-Length: 123456 Kompresja strumienia HTTP Accept-Encoding: gzip,deflate HTTP v1.1: Wielokrotna komunikacja na jednym połączeniu (keepalive): Connection: keep-alive (domyślnie: Connection: Close) Keep-Alive: 150, Możliwość pobierania tylko części treści zasobu np. wznawianie pobierania pliku o wielkości 600MB 23
Narzędzia przydatne przy implementacji i testowaniu serwera WWW Mozilla Firefox + Firebug 24
Narzędzia przydatne przy implementacji i testowaniu serwera WWW Mozilla Firefox + Firebug tcpdump, windump, CommView Źródło: http://www.tamos.com/products/commview/ 25
Uwagi odnośnie implementacji serwera WWW (1/3) Klasy sieciowe znajdują się w przestrzeniach System.Net.Sockets oraz System.Net Obsługa wątków oraz strumieni WE/WY: System.Threading System.IO Zamiast klasy Socket można korzystać z TcpListener (serwer) i TcpClient (cześć kliencka w serwerze), Do przyjęcia nowego połączenia w serwerze służy metoda AcceptTcpClient uruchamiana na rzecz obiektu klasy TcpClient, 26
Uwagi odnośnie implementacji serwera WWW (2/3) Zapis/odczyt danych gniazda wykonuje się za pomocą strumienia (obiektu) klasy NetworkStream, zwracanego przez obiekt klasy TcpClient; Można skorzystać z klas StreamReader i StreamWriter, pozwalających na formowanie strumienia bajtów w linie tekstu, np.: this.reader = new StreamReader(this.client.GetStream()); this.writer = new StreamWriter(this.client.GetStream()); 27
Uwagi odnośnie implementacji serwera WWW (3/3) Sensowne minimum serwera WWW powinno potrafić wygenerować 3 typy odpowiedzi: 200 OK, 404 brak zasobu (brak pliku do wysłania), 500 błąd wewnętrzny serwera (w sytuacji, gdy kod serwera generuje wyjątek). Serwer może pracować w trybie: Odbierz połączenie-przeczytaj nagłówek-wyślij danezamknij połączenie. Proszę pamiętać o znakach końca linii! 28
Serwer HTTP - Testowanie W przypadku testowania serwera na porcie 80 i systemie Windows Vista/7, należy wyłączyć usługę World Wide Web Publishing Service. 29
Dziękuję za uwagę!