Część 1: TCP - Podstawy Protokół służy do utworzenia (i utrzymania) połączenia między dwoma komputerami. tomek@ZUERST:~/pliki/work/pjwstk.home/sko1> javac Echo.java Echo.java:40: warning: unmappable character for encoding UTF8 System.err.println("Gniazdo nie zamkni?te"); ^ Echo.java:53: warning: unmappable character for encoding UTF8 System.out.println("Serwer Wystartowa? !!!"); ^ 2 warnings tomek@ZUERST:~/pliki/work/pjwstk.home/sko1> java Echo Serwer Wystartowa? !!! _____________________________
Po uruchomieniu serwera w systemie operacyjnym zarezerwowany zostanie port 7777 na usługę Echo. tomek@ZUERST:~> telnet localhost 7777 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. haloo? haloo? dziala dziala ^] telnet> quit Connection closed. Poniższy rysunek pokazuje DIAGRAM STANÓW DLA POŁĄCZENIA KLIENTA Rozpoczynamy w stanie CLOSED, po wysłaniu pakietu z flagą SYN klient przechodzi w stan SYN_SENT. Po otrzymaniu pakietu ACK oraz SYN (zapalone obie flagi) klient wysyła ACK, które kończy fazę ustalanie połączenia. Połączenie przechodzi w stan ESTABILISHED. Wymieniane są komunikaty z danymi i potwierdzenia. Strona, która kończy połączenie (w tym przypadku klient) wysyła FIN. Klient przechodzi w stan FIN_WAIT_1, a po odebraniu potwierdzenia pakietu z FIN, przechodzi w FIN_WAIT_2, w którym oczekuje na FIN od serwera. Po otrzymaniu takiego pakietu odsyłane jest ACK i klient przechodzi w tryb TIME_WAIT, po którym to czasie wszystkie zasoby wracają do systemu operacyjnego. Poniższy rysunek pokazuje DIAGRAM STANÓW DLA POŁĄCZENIA SERWERA Rozpoczynamy w stanie CLOSED, serwer tworząc gniazdo nasłuchujące wykonuje systemową metode bind i dostaje numer portum na którym rozpoczyna nasłuchiwanie na połączenia. Po otrzymaniu pakietu z flagą SYN od klienta serwer wysyła SYN i ACK a następnie przechodzi w stan SYN_RECEIVED. Po otrzymaniu pakietu ACK kończy się faza ustalanie połączenia, które przechodzi w stan ESTABILISHED. Wymieniane są komunikaty z danymi i potwierdzenia. Strona, która kończy połączenie (w tym przypadku klient) wysyła FIN. Serwer potwierdza pakiet klienta pakietem ACK i przechodzi w stan CLOSE_WAIT. Serwer wysyła flagę FIN kończąc połączenie (przechodzi w stan LAST_ACK). Po odebraniu potwierdzenia pakietu z FIN, przechodzi w stan CLOSED, gdzie zasoby zwracane zostają do systemu operacyjnego. Część 2: Działanie TCP
Po włączeniu programu wireshark należy wykonać następujące ćwiczenie.
Trzy pierwsze pakiety (syn, syn_ack, ack) służą do ustanowienia połączenia, trzy ostatnie (fin, fin_ack, ack) do jego zakończenia. Pozostałe pakiety (psh_ack, ack) zostają przesyłane podczas transmisji danych (zależnie od charakteru uslugi będzie to ruch w inną stronę). W komunikatach TCP możemy wyróżnić pole "flagi". Rysunek poniżej przedstawia kolejność bitową flag w protokole. Flaga może mieć ustawiony bit 0 (zgaszona) lub 1 (zapalona). W zależności od użycia flag TCP traktuje pakiet w specjalny sposób:
ZADANIE NA OCENĘ (PUNKTOWANE)Polecenie: wykonaj 6 kroków zgodnie z opisem w na początku części 2 tego wykładu (wysłanie 1 znaku do Echo). Korzystając ze sniffera uzupełnij poniższą tabelę. Rozwiązania w dowolnej postaci cyfrowej (html, doc, jpg) proszę umieszczać do końca listopada w odpowiednim dziale w EDU.
Część 3: Opcje TCP Opcje tcp przesyłane są zwłaszcza w pakietach rozpoczynających połączenie (SYN). Kolejność opcji w nagłówku TCP nie ma znaczenia, jednak różne systemy operacyjne mogą zmieniać ich kolejność. Skutkiem ubocznym jest możliwość pasywnej identyfikacji systemów operacyjnych poprzez sprawdzenie kolejności opcji w przesyłanych pakietach. Opcje TCP są rozbudową protokołu.
Selective Acknowledgment (SACK)Pozwala na potwierdzanie bloków odebranych danych. W przypadku normalnego potwierdzenia, które może potwierdzić dane "do pierwszego nieodebranego bajtu" występuje zbyt dużo retransmisji. Gdy obie strony umożliwiają użycie SACK retransmisje dotyczą tylko faktycznie utraconych danych. Window ScaleJest to modyfikacja Flow Control (Kontrola Przepływu). Rozmiar okna przesuwnego używanego w transmisji oblicza się ze wzoru: Część 4: Timeout TCP W przypadku, gdy pakiet nie dotrze do odbiorcy (lub nie przyjdzie ACK) strona wysyłająca powinna jak najszybciej wysłać retransmisję pakietu. Nie jest to jednak łatwe, gdyż czas oczekiwania po którym następuje retransmisja powinien być zależny od czasu w jakim docierają dane do odborcy. Dlatego wykorzystuje się wzorów które pozwalają ustalić wartość timeout'u uwzględniając pomiar RTT (opóźnienie pakietu)
R = oszacowany RTT (estimated) |