Sieci Komputerowe Protokół TCP Transmission Control Protocol
Transkrypt
Sieci Komputerowe Protokół TCP Transmission Control Protocol
Sieci Komputerowe Protokół TCP Transmission Control Protocol dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska 48 50-204 Opole [email protected] Zagadnienia Protokół TCP Transmisja strumieniowa Niezawodność TCP Opis Segmentu TCP Przykład segmentu TCP (TCP Connect Request Telnetu) Struktura nagłówka segmentu TCP Porty i połączenia TCP Aplikacje i protokoły korzystające z TCP Mechanizm przesuwających się okien Przesyłanie z użyciem buforów 2 Protokół TCP TCP, ang. Transmission Control Protocol. RFC 793, J. Postel, Transmission Control Protocol, 1981. RFC 813, David D. Clark, WINDOW AND ACKNOWLEDGEMENT STRATEGY IN TCP, 1982. RFC-896, J. Nagle, Congestion Control in IP/TCP, January 1984. RFC 1122, R. Braden, Requirements for Internet Hosts - Communication Layers, 1989. RFC 3168, K. Ramakrishnan, S. Floyd, D. Black, The Addition of Explicit Congestion Notification (ECN) to IP, 2001. RFC 2474, K. Nichols, S. Blake, F. Baker, D. Black, Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers, 1998. RFC 4379, K. Kompella, G. Swallow, Detecting Multi-Protocol Label Switched (MPLS) Data Plane Failures, 2006. RFC 6093, F. Gont, A. Yourtchenko, On the Implementation of the TCP Urgent Mechanism, 2011. RFC 6528, F. Gont, S. Bellovin, Defending against Sequence Number Attacks, 2012. V. Jacobson, Congestion Avoidance and Control, ACM SIGCOMM-88, 1988. P. Karn, C. Partridge, Round Trip Time Estimation, ACM SIGCOMM-87, 1987. 3 Protokół połączeniowy TCP jest protokołem warstwy transportowej modelu OSI. Pakiet danych TCP nazywa się segmentem, RFC 793, 1122. Protokół TCP jest protokołem połączeniowym umożliwiającym wykrywanie błędów transmisji. Cechy protokołu TCP: • stosuje pozytywne potwierdzanie odbioru danych (pole ACK=1), • ma możliwość ustalania priorytetu przesyłania segmentów, • ma możliwość kontroli i usuwania błędów (retransmisji niepotwierdzonych pakietów). 4 Protokół połączeniowy Proces trasmisji składa się z trzech etapów: • budowa połączenia, • przesyłanie danych, • zamknięcie połączenia. Budowa połączenia polega na: • lokalizacji odbiorcy, • ustaleniu parametrów połączenia. Połączenie to logiczna ścieżka transmisji między dwoma gniazdami (RFC 793). Połączenie TCP to zbiór parametrów (RFC 793): • numer portu, adres IP odbiorcy (pola: Source port, Source Address) • numer portu, adres IP nadawcy (pola: Destination port, Destination Address) • kolejny numer wysłanego segmentu (pole: Sequence number) • wielkość okna (pole: Window). 5 Transmisja strumieniowa W transmisji wykorzystującej protokół TCP między nadawcą a odbiorcą wymieniany jest strumień bajtów. Protokół TCP nie umieszcza znaczników początku i końca danych, usługa strumienia bajtów (byte stream service). Jeśli nadawca wyśle kolejno 100 bajtów, 200, 300 bajtów to odbiorca nie wie jakiej wielkości segmenty były wysłane. Do odbiorcy dane mogą dotrzeć w 4 segmentach po 150 bajtów każdy. Nadawca wysyła strumień danych i odbiorca odbiera strumień danych. 6 Niezawodność TCP Protokół TCP umożliwia weryfikację czy transmitowane dane są: • uszkodzone, • zgubione, • powielone, • dostarczone w nieodpowiedniej kolejności do odbiorcy. W celu zapewnienia niezawodności transmisji: • każdy wysłany segment danych TCP jest numerowany, • każdy segment TCP potwierdzający odbiór jest numerowany, • protokół wykorzystuje mechanizm pozytywnego potwierdzenia odbioru danych z retransmisją PAR, (ang.) Positive Acknowledgment with Re-transmission. 7 Pozytywne potwierdzanie z retransmisją (PAR) Protokół TCP stosuje mechanizm 'pozytywnego potwierdzania z retransmisją’, tzn. potwierdzany jest poprawny odbiór danych. Nadawca po wysłaniu segmentu TCP, uruchamia zegar mierząc czas oczekiwania na potwierdzenie odbioru. Po odebraniu segmentu TCP odbiorca wysyła pakiet w którym flaga ACK = 1. Nadawca wysyła ponownie segment jeżeli: • zostanie przesłany komunikat z wartością pola ACK=0 (brak pozytywnego potwierdzenia), • po określonym czasie nie nadejdzie potwierdzenie prawidłowego obioru danych. Odbiorca po prawidłowym odebraniu segmentu TCP wysyła potwierdzenie odbioru do nadawcy. Jeżeli potwierdzenie nie nadejdzie w określonym czasie, nadawca wysyła segment ponownie. Pakiet jest wysyłany tak długo dopóki nadawca nie otrzyma potwierdzenia o bezbłędnie odebraniu pakietu. 8 Przykład. Pozytywne potwierdzenie odbioru danych. # ----- Naglowek Ethernetowy ----Packet 7 arrived at 17:37:24.00 Packet size = 60 bytes Destination = 8:0:20:86:35:4b, Sun Source = 0:e0:f7:26:3f:e9, CISCO Router Ethertype = 0800 (IP) # ----- Naglowek IP ----Version = 4 Header length = 20 bytes Type of service = 0x00 (normal) Total length = 40 bytes Identification = 43773 Flags = 0x0 .0.. .... = may fragment ..0. .... = last fragment Fragment offset = 0 bytes Time to live = 252 seconds/hops Protocol = 6 (TCP) Header checksum = 3a56 Source address = 150.168.233.2, server.math.edu.pl Destination address = 150.168.27.110, client No options # ----- Naglowek TCP ----Source port = 23 Destination port = 36869 Sequence number = 2486243368 Acknowledgement number = 1913975089 Data offset = 20 bytes Flags = 0x10 ..0. .... = No urgent pointer ...1 .... = Acknowledgement .... 0... = No push .... .0.. = No reset .... ..0. = No Syn .... ...0 = No Fin Window = 8760 Checksum = 0x1c65 Urgent pointer = 0 No options 9 Numerowanie bajtów w segmentach TCP Do numerowania wysłanych bajtów danych i informowania o liczbie bezbłędnie odebranych bajtów danych nadawca i odbiorca wykorzystują pola 'Sequence number' i Acknowledgement number w nagłówku protokołu TCP. Pole 'Sequence number' zawiera liczbę ISN + N, gdzie N jest liczbą wysłanych bajtów, przy czym numeruje się pierwszy bajt danych w przesłanym segmencie. Segmenty TCP są kapsułkowane w warstwie sieci w datagramy IP. Protokół IP jest protokołem bezpołączeniowym bez obsługi błędów dlatego, datagramy IP mogą nie dotrzeć do odbiorcy lub dotrzeć w rożnej kolejności. Pole 'Sequence number‘ pozwala sprawdzić czy jakiś segment TCP nie zaginął, służy również do uporządkowania odebranego strumienia danych we właściwej kolejności. Obiorca wysyła pakiet z flagą ACK = 1 (pakiety potwierdzające prawidłowy odbiór danych) wykorzystuje pole Numer potwierdzenia (Acknowledgement number) do poinformowania nadawcy o liczbie prawidłowo odebranych bajtów i o spodziewanej wartości w polu 'Sequence number‘. 10 Suma kontrolna w nagłówku segmentu TCP Mechanizm sum kontrolnych służy zapewnieniu integralności danych podczas transmisji. Nagłówek protokołu TCP zawiera pole 'Checksum'. Wartość pola jest liczbą 16-bitowych słów w pseudonagłówku, nagłówku i polu 'dane'. Jeżeli segment zostanie nadesłany z niepoprawną sumą kontrolną, odbiorca porzuca go i nie wysyła potwierdza odbioru. 11 Sterowanie szybkością transmisji Pole 'Window' w nagłówku segmentu TCP służy do informowania nadawcy ile bajtów może odebrać odbiorca. Zmieniając wartość w polu 'Window' odbiorca może określać wielkość/liczbę wysyłanych segmentów. Np. wysłany segment TCP z wartością pola 'Window = 0' wstrzymuje transmisję. Jeżeli odległość między nadawcą a odbiorcą jest duża, liczona liczbą routerów, i są możliwe opóźnienia w transmisji, odbiorca danych stopniowo zwiększa wartość pola 'Window ‘ – stosuje mechanizm ‘slow start’. Algorytm TCP slow start stosowany przez protokół TCP ma na celu określenie optymalnej wartości dla pola ‘Window’, gdy nadawca i odbiorca znajdują się w różnych sieciach (segmentach sieci), RFC 2001. W segmentach TCP nadawcy i odbiorcy wartość w polu ‘Window’ może być różna. 12 Psedonagłówek TCP Pseudonagłówek poprzedza nagłówek segmentu TCP (RFC 793). Wilekość pseudonagłówka 12 bajtów (96 bitów). Pole: Adres nadawcy. Wielkość pola: 32 bity. Pole określa adres IP nadawcy. Pole: Adres odbiorcy. Wielkość pola: 32 bity. Pole określa adres IP odbiorcy. Pole: Zero Pole: Protokół. Wielkość pola: 8 bitów. Pole określa typ protokołu. Wartość: 6 oznacza TCP. Pole: Długość TCP. Wielkość pola: 16 bitów. Liczba bajtów w nagłówku i polu dane segmentu TCP. W polu nie uwzględnia się wielkości pseudonagłówka. Pole ‘długość TCP’ nie jest przesyłane w pakietach. W nagłówku datagramu IP po polu ‘Protokół’ jest pole ‘Suma kontrolna nagłówka’. Bity 1-4 5-8 Zero 9-12 13-16 17-20 Source Address Destination Address Protocol 21-24 25-28 29-32 TCP Length Pseudonagłówek TCP 13 Pola w nagłówku segmentu TCP Pole: Port źródłowy (Source port). Wielkość pola: 16 bitów. 1-4 5-8 9-10 11-12 Bity 13-16 17-20 Source port Pole: Port docelowy (Destination port). Wielkość pola: 16 bitów. Pola zawierają numery portów aplikacji wymieniających dane. 21-24 25-28 Destination port Sequence number Acknowledgement number Data offset Not used Checksum Flags Options Window Urgent pointer Padding Data … Pole: Kolejny numer (Sequence number). Wielkość pola: 32 bity. Struktura segmentu TCP Numer pierwszego bajtu przesyłanych danych w segmencie liczony od początku transmisji. Przy nawiązywaniu połączenia, gdy pole SYN= 1, w polu 'kolejny numer' jest wpisywany początkowy numer ISN od którego rozpoczęta będzie numeracja przesyłanych segmentów (pierwszy wysłany bajt danych ma numer ISN + 1). Liczba ISN jest generowana losowo z gwarancją niepowtórzenia się w sieci przez około 4.55 godz.. Pole: Numer potwierdzenia (Acknowledgement number). Wielkość pola: 32 bity. Jeśli flaga ACK = 1, to pole 'numer potwierdzenia' zawiera oczekiwaną wartość w polu 'kolejny numer‘ . Pole: Długość nagłówka (Data offset). Wielkość pola: 4 bity. Wartość w polu określa liczbę 32-bitowych słów w nagłówku TCP. Pole pozwala określić początek bitów z danymi. Pole: Pole nieużywane. Wielkość pola: 6 bitów. Pole jest przeznaczone dla przyszłych zastosowań. 14 29-32 Pola w nagłówku segmentu TCP 1-4 Pole: 5-8 Atrybuty pola flagi: UGR, ACK, PSH, RST, SYN, FIN. 11-12 Bity 13-16 17-20 Source port Flagi, (Flags). Wielkość pola: 6 bitów. Pole zawiera parametry określające tryb transmisji. 9-10 21-24 25-28 Destination port Sequence number Acknowledgement number Data offset Wartości atrybutów pola flagi: 0,1. UGR - wskaźnik pilności ACK - określa ważność pola numer potwierdzania. Not used Checksum Flags Options Window Urgent pointer Padding Data … Struktura segmentu TCP PSH - wskazuje na zastosowanie funkcji wymuszającej. RST - wyzerowanie połączenia (dla wartości 1 oznacza polecenie zerowania połączenia). SYN - wskazuje, że w polu 'kolejny numer' umieszczony jest inicjujący numer INS. Wartość 0 nowe połączenie. oznacza FIN - wartość 1 oznacza koniec połączenia. Pole: Okno, (Window). Wielkość pola: 16 bitów. Pole służy do sterowania transmisją danych. Pole określa liczbę bajtów jaką może jeszcze odebrać odbiorca (wielkość bufora odbiorcy). Pole 'Okno' o wartości zero, oznacza, ze nadawca powinien wstrzymać transmisje, dopóki nie otrzyma potwierdzenia z niezerowa wartością pola. 15 29-32 Pola w nagłówku segmentu TCP Pole: Suma kontrolna (Checksum). Wielkość pola: 16 bitów. Suma kontrolna jest liczbą 16-bitowych słów w pseudonagłówku (12 bajtów), nagłówku i polu dane segmentu TCP . Jeżeli liczba bajtów jest nieparzysta to dodawany jest bajt zer w polu dane tak, aby suma kontrolna była liczona dla 16-bitowych słów. Dodany bajt zer w polu dane nie jest transmitowany. Pole: Priorytet (Urgent pointer). Wielkość pola: 16 bitów. Pole określa pilności przesyłanego segmentu, jest interpretowane tylko wtedy, gdy flaga 'UGR' ma wartość 1. Pole zawiera kolejny numer bajtu następującego po pilnych danych. Pole: Opcje (Options). Wielkość pola: zmienna, wielokrotność 8 bitów. Pole zawiera numery opcji, każdy numer zapisany w jednym bajcie. Dla protokołu TCP zdefiniowano trzy opcje: 0 - koniec listy opcji 1 - brak działania 1-4 5-8 9-10 11-12 Bity 13-16 17-20 21-24 25-28 29-32 2 - maksymalna długość segmentu. Source port Destination port Sequence number Acknowledgement number Data offset Not used Checksum Flags Options Window Urgent pointer Padding Data … Struktura segmentu TCP 16 Pola w nagłówku segmentu TCP Pole: Uzupełnienie (Padding). Wielkość pola: zmienna. Pole zawiera uzupełnienia zerami nagłówka TCP do wielkości 32 bitów. Pole: Dane (Data). Wielkość pola: zmienna. Pole zawiera dane aplikacji. 1-4 5-8 9-10 11-12 Bity 13-16 17-20 Source port 21-24 25-28 29-32 Destination port Sequence number Acknowledgement number Data offset Not used Checksum Flags Options Window Urgent pointer Padding Data … Struktura segmentu TCP 17 Budowa połączenia TCP W procesie synchronizacji 'połączenia TCP' między nadawcą (A) i odbiorcą (B) wymieniane są trzy segmenty TCP. Proces uzgadniania wartości w polach 'Sequence number‘, ‘Acknowledgement number w wysyłanych i potwierdzanych pakietach (RFC 793). (1) A ----> B flaga ACK=0, SYN=1 (2) A <---- B flagi ACK=1, SYN=1 pole ‘Sequence number=X’, ISN nadawcy (A), Np. X=100 pole ‘Sequence number=Y’, ISN odbiorcy (B), pole ‘Acknowledgement number=X+1’ Np. SeqNumber=Y = 300, AckNumber = X+1 = 101 Uwaga: B spodziewa się, że w następnym segmencie A w polu Seq. Number wpisze wartość X+1=101. (3) A ----> B flaga ACK=1 SYN=0 pole ‘Acknowledgement number=Y+1, Np. SeqNumber=X+1=101, AckNumber=Y+1=301 18 Synchronizacja numeracji segmentów Uzgadnionie wartości w polu Sequence number (Kolejny numer) jest wymagana ponieważ, wartości początkowe ISN (initial sequence number) są wyliczane na podstawie lokalnego czasu nadawcy i odbiorcy. Maximum Segment Lifetime (MSL) w sieci dla segmentów TCP wynosi 2 minuty (RFC 793). Każdy przesłany bajt ma swój ‘sequence number’. Mechanizm potwierdzania pakietów jest przyrostowy, tzn. potwierdzenie odebrania bajtu o numerze X (wartość w polu ‘sequence number’=X), oznacza, że potwierdzony jest odbiór strumienia X bajtów. 19 Przykład segmentu TCP # ----- naglowek ethernetowy ----- # ----- naglowek TCP ----- Packet 10 arrived at 12:35:32.17 Source port = 23 Packet size = 69 bytes Destination port = 36869 Destination = 8:0:20:85:55:4b, Sun Sequence number = 2486243368 Source = 0:e0:f7:22:3f:d9, CISCO Router Ethertype = 0800 (IP) # ----- naglowek IP ----Version = 4 Header length = 20 bytes Acknowledgement number = 1913975089 Data offset = 20 bytes Flags = 0x18 ..0. .... = No urgent pointer Type of service = 0x00 (normal) ...1 .... = Acknowledgement Total length = 55 bytes .... 1... = Push Identification = 43775 .... .0.. = No reset Flags = 0x0 .... ..0. = No Syn .0.. .... = may fragment .... ...0 = No Fin ..0. .... = last fragment Window = 8760 Fragment offset = 0 bytes Checksum = 0xc10c Time to live = 252 seconds/hops Urgent pointer = 0 Protocol = 6 (TCP) No options Header checksum = 3a45 Source address = 152.148.13.32, server.math.edu.pl # ----- dane aplikacji TELNET: ----dane Destination address = 155.181.171.109, client No options 20 Porty i połączenia TCP Aby dane trafiły do odpowiednich aplikacji uruchomionych na danym hoscie protokół TCP numeruje połączenia. Każdemu połączeniu aplikacja przypisuje liczbę, port TCP, z przedziału 1 - 65355. Gniazdo internetowe TCP, (ang.) TCP internet socket, to adres IP hosta, numeru portu, wartość pola typ portu = TCP. Aplikacja która chce przesłać dane musi zbudować połączenie: • odnaleźć odbiorcę • wysłać komunikat z zadaniem budowy połączenia. Zarezerwowane numery portów dla 'dobrze znanych aplikacji' sieciowych służą serwerom aplikacji do nasłuchiwania żądań usługi przez klientów aplikacji. Protokoły korzystające w warstwie transportowej z TCP: ftp, porty: 20, 21 ssh, port: 22 telnet, port: 23 SMTP, port: 25 kerberos, porty: 88, 464, 749 21 Transmisja danych między klientem a serwerem HTTP Pobieranie pliku 192 kB ze strony WWW. Pole Wielkość okna = 64240 bajtów K->S HTTP seq: 2428465110 ack: 404447982 S->K TCP seq: 404447982 ack: 2428466109 S->K TCP seq: 404449442 ack: 2428466109 S wysłał do K 1460 B K->S TCP seq: 2428466109 ack: 404450902 S->K TCP seq: 404450902 ack: 2428466109 S->K TCP seq: 404452362 ack: 2428466109 S wysłał do K 1460 B K->S TCP seq: 2428466109 ack: 404453822 S->K TCP seq: 404453822 ack: 2428466109 S->K TCP seq: 404455282 ack: 2428466109 S wysłał do K 1460 B K->S TCP seq: 2428466109 ack: 404456742 S->K TCP seq: 404456742 ack: 2428466109 S->K TCP seq: 404458202 ack: 2428466109 S wysłał do K 1460 B ... S->K TCP seq: 404643622 ack: 2428466109 S->K HTTP seq: 404645082 ack: 2428466109 K->S TCP seq: 2428466109 ack: 404645384 K->S TCP seq: 404645384 ack: 2428466109 (FIN=1) Liczba odebranych bajtów: 404645082 - 404447982 = 19 7100 22 Czas retransmisji segmentów TCP Czas RTO (retransmission timeout) to czas po którym następuje retransmisja segmentu TCP. Czas retransmisji jest obliczany dynamicznie dla każdego segmentu TCP. Czas RTT (Round Trip Time) to czas jaki upłynął od wysłania segmentu z danym numerem sekwencyjnym (pole Seq.Number) do odebrania segmentu potwierdzenia. Występowanie retransmisji segmentów TCP powoduje: • problemy z wyliczeniem czasu RTT, • problemy z wyliczeniem średniego czasu RTT (czasu SRTT), ponieważ są zbyt duże odchylenia od kolejnych wartości czasu RTT. 23 Algorytm Jacobson’a, algorytm Karn’a RFC 1122, R. Braden, Requirements for Internet Hosts - Communication Layers, 1989. Do wyznaczania czasu retransmisji segmentów TCP (czasu RTT) aplikacje muszą stosować: • algorytm Jacobson’a, służący do wyliczania średniego czasu RTT (SRTT - Smoothed Round Trip Time), • algorytm Karn’a, służący do wyboru takich czasów RTT, aby nie spowodowały blokady algorytmu wyznaczającego czas średni (czas SRTT). V. Jacobson, Congestion Avoidance and Control , ACM SIGCOMM-88, 1988. P. Karn, C. Partridge, Round Trip Time Estimation, ACM SIGCOMM-87, 1987. 24 Czas RTT, czas SRTT Dla ciągu czasów RTTi , i=1,2,… jaki upłynął między wysłaniem a odebraniem sekwencji pakietów i=1,2,… wylicza się czas SRTT (Smoothed Round Trip Time, średni czas RTT), na podstawie wzoru SRTTi +1 ← α ∗ SRTTi + (1 − α ) ∗ RTTi α współczynnik określający szybkość zmian SRTT, ma wartości między (0,1), np. 0.9. Czas RTO (retransmission timeout) i-tego segementu TCP obliczany jest ze wzoru RTOi = β ∗ RTTi β współczynnik opóźnienia (delay variance factor), stosowane wartości z zakresu 1.3 – 2.0. 25