R07-5.doc

(221 KB) Pobierz
Rozdział 8

Rozdział 7.
Protokół sterowania transmisją

Dogłębnie

Protokół sterowania transmisją (TCP) jest wymaganym standardem protokołu TCP/IP, określonym w dokumencie RFC 793. Zapewnia on oparte na połączeniach, niezawodne, zorientowane na strumieniowy przesył bajtów połączenia i jest wykorzystywany do logowania, współużytkowania plików oraz wydruku, replikacji informacji, przesyłania list przeglądania, oraz innych zwykłych funkcji w środowisku pracy sieciowej systemu Windows. TCP może być wykorzystywany do komunikacji typu jeden do jednego (lub point-to-point). Niniejszy rozdział najpierw omawia standardowe funkcje i działanie TCP, a następnie przechodzi do opisu udoskonaleń, oraz nowych funkcji zapewnianych przez system Windows 2000. Ponieważ większość programów usługowych i usług TCP/IP wykorzystuje TCP, stosowne jest podsumowanie ich w tym rozdziale. Protokoły transportu w sieciach złożonych, takie jak protokół transmisji hipertekstu (HTTP) oraz protokół transmisji plików (FTP) opisane są w rozdziale 9.

Standardowe funkcje i działanie TCP

TCP jest usytuowany ponad usługą protokołu internetowego (IP) i prawdopodobnie, jest on najbardziej znaczącym protokołem transportu w zestawie TCP/IP. Zapewnia on niezawodną metodę transportu przy użyciu przesyłu strumieniowego programom, które korzystają z sesyjnej transmisji danych, i gwarantuje dostarczanie datagramów IP. TCP implementuje niezawodny, wydajny transport za pomocą kilku mechanizmów.

Segmentacja i numery sekwencji

TCP segmentuje i ponownie składa duże bloki danych wysyłane przez programy, oraz zapewnia właściwe szeregowanie i uporządkowane dostarczanie segmentowanych danych. Numery sekwencji wykorzystywane są do koordynacji przesyłu i odbioru danych, a TCP zapewnia ponowną transmisję, jeśli ustali, że dane uległy zagubieniu. Protokół ten korzysta z 32-bitowego numeru sekwencji, który liczy oktety w strumieniu danych. Każdy z pakietów TCP zawiera początkowy numer sekwencji danych w tym pakiecie oraz numer sekwencji (lub numer potwierdzający) ostatniego bajta otrzymanego od zdalnego komputera równorzędnego. Przy użyciu tej informacji implementowany jest protokół okna przesuwnego, co zostało opisane w dalszej części tego rozdziału.

Numery sekwencji do przodu i wstecz są całkowicie niezależne. TCP zazwyczaj działa w trybie pełnodupleksowym, co oznacza, że działa w obydwu kierunkach w sposób prawie całkowicie niezależny. Nie ma mechanizmu kojarzącego dane strumienia bajtów do przodu i wstecz. TCP wykazuje zachowanie asymetryczne (to jest przesył danych w jednym kierunku) tylko podczas sekwencji rozpoczęcia i zamknięcia połączenia.

TCP wykorzystuje znaczniki kontrolne do zarządzania połączeniem. Niektóre z tych znaczników (takie jak znacznik URG) odnoszą się do pojedynczego pakietu. Jednakże dwa znaczniki (SYN oraz FIN) oznaczają początek i koniec strumienia danych i wymagają niezawodnego dostarczenia. Znacznikom tym przypisane są miejsca w przestrzeni numeru sekwencji. TCP wysyła potwierdzenia (ACK), kiedy dane zostaną pomyślnie odebrane. Jeżeli włączone jest potwierdzenie selektywne (SACK), to TCP przesyła również potwierdzenia negatywne, kiedy oczekiwane dane nie zostaną odebrane. SACK jest domyślnie włączony w systemie Windows 2000.

Sumy kontrolne

Numery sekwencji, znaczniki kontrolne oraz potwierdzenia gwarantują, że przetransmitowane dane zostały otrzymane i ponownie złożone we właściwą sekwencję i że nie brakuje segmentów. TCP kontroluje również integralność danych przy użyciu obliczeń sumy kontrolnej. Jeśli suma kontrolna jest niewłaściwa, to datagram zostaje odrzucony i musi być transmitowany. Obliczanie sumy kontrolnej jest skomplikowane. Jeżeli musisz znać szczegóły, to poniższy fragment jest bezpośrednim wypisem z dokumentu RFC 793:

Pole sumy kontrolnej to 16-bitowe uzupełnienie jedynkowe sumy uzupełnienia jedynkowego wszystkich słów 16-bitowych w nagłówku i tekście. Jeżeli dany segment zawiera nieparzystą liczbę oktetów nagłówka i tekstu, które mają być poddane sumie kontrolnej, to ostatni oktet zostaje wypełniony z prawej strony zerami, aby utworzyć słowo 16-bitowe dla potrzeb sumy kontrolnej. Wypełnienie nie jest transmitowane jako część segmentu. Podczas obliczania sumy kontrolnej samo pole sumy kontrolnej zostaje zastąpione zerami.

Suma kontrolna obejmuje również 96-bitowy pseudo-nagłówek koncepcyjnie przytwierdzony do nagłówka TCP. Ten pseudo-nagłówek zawiera adres źródłowy, adres docelowy, protokół, oraz długość TCP. Zapewnia to TCP zabezpieczenie przed błędnie routowanymi segmentami. Informacja ta jest niesiona w protokole internetowym i przesyłana poprzez interfejs TCP — sieć w argumentach lub wynikach wywołań IP przez TCP.

Kontrola przepływu danych

TCP zapewnia wydajną transmisję danych poprzez sieć dzięki kontroli przepływu danych. Odkrywa ona dynamicznie charakterystykę opóźnień sieci i reguluje jej działanie, aby maksymalizować przepustowość bez przeciążania sieci.

Każdy węzeł końcowy połączenia TCP ma bufor, służący do zapamiętywania danych transmitowanych poprzez sieć, dopóki dana aplikacja nie będzie gotowa do odczytu tych danych. Pozwala to, aby mogły mieć miejsce przesyły sieciowe w czasie, kiedy aplikacje są zajęte innymi procesami i poprawia ogólną wydajność. TCP zarządza ruchem tak, aby jego bufory się nie przepełniały — szybcy nadawcy są okresowo zatrzymywani, żeby wolniejsi nadawcy mogli nadążyć.

Aby uniknąć przepełnienia bufora, TCP ustawia pole rozmiar okna w każdym z pakietów, które transmituje. Pole to wskazuje ilość danych, które mogą być transmitowane do bufora. Gdy wartość ta spadnie do zera, to host transmitujący nie będzie przesyłał żadnych danych, dopóki nie otrzyma pakietu anonsującego wartość niezerową w polu rozmiaru okna.

Czasami przestrzeń bufora jest zbyt mała do wydajnej transmisji. Zdarza się to w sieciach, które mają ograniczoną przepustowość albo powolne łącza. Rozwiązaniem jest zwiększenie rozmiaru bufora, lecz istnieje w tej kwestii ograniczenie narzucone przez maksymalny rozmiar okna, jaki dopuszcza protokół. W takiej sytuacji określa się sieć jako sieć LFN (Long Fat Network). TCP systemu Windows 2000 dopuszcza większy rozmiar okna, niż jego poprzednie implementacje.

Wskazówka: LFN może być akronimem od Long Fat Network, albo Long File Name (długa nazwa pliku). Akronim ten w przypadku Long File Name wymawia się „el-ef-en”. W przypadku Long Fat Network wymawia się go „elephant”. Elephant’y omówione są w specyfikacji RFC 1072.

Jednym z ważnych czynników rządzących przepływem informacji poprzez sieć jest okres czasu, przez jaki host wysyłający czeka na potwierdzenie, zanim założy, że dane uległy zagubieniu i dokona ponownej ich transmisji. Jeżeli okres ten jest zbyt krótki, to pakiety są niepotrzebnie retransmitowane; jeżeli jest on zbyt długi, to dane połączenie będzie stało bezczynnie, podczas gdy host będzie czekał, dopóki okres nie minie. TCP podejmuje próbę ustalenia optymalnego okresu wygaśnięcia poprzez monitorowanie normalnej wymiany pakietów danych. Proces ten zwany jest szacowaniem czasu przewidzianego na transmisję i potwierdzenie przyjęcia (RTT). TCP systemu Windows 2000 zapewnia udoskonalony algorytm RTT, wykorzystujący znaczniki czasu. Zostało to opisane w dalszej części tego rozdziału.

Okna przesuwne TCP

TCP implementuje kontrolę przepływu danych przez zastosowanie algorytmów okna przesuwnego, umożliwiających jednoczesny transport wielu pakietów danych. Algorytmy te umieszczają bufory pomiędzy programami użytkowymi a sieciowym przepływem danych. Dane otrzymywane z sieci zapamiętywane są w buforze, a aplikacja odczytuje te dane, zwalniając przestrzeń bufora w celu przyjęcia większej ilości danych z sieci. Okno, to ilość danych, która może być odczytywana z wyprzedzeniem i jest ono równe rozmiarowi bufora minus ilość ważnych danych, które są w nim zapamiętane.

Jeżeli rozmiar okna jest większy niż rozmiar pakietów, to może być transmitowanych wiele pakietów, ponieważ nadawca wie, że u odbiorcy dostępna jest przestrzeń bufora potrzebna, aby je pomieścić. Najlepiej, kiedy zostanie osiągnięty warunek stanu stabilnego, gdzie aplikacja odczytuje dane z bufora w takim samym tempie, w jakim nadawca dodaje do niego dane. W takim wypadku można sobie wyobrazić bufor jako okno, które przesuwa się spokojnie wzdłuż strumienia danych, utrzymując w ruchu szereg pakietów i zapewniając wydajne wykorzystanie zasobów sieci. Każdy z hostów TCP ma dwa bufory, jeden do odbierania danych i jeden do ich wysyłania.

Rozmiar okien odbioru i wysyłania jest ustawiany podczas uzgadniania trzystopniowego. Zostało to omówione w dalszej części tego rozdziału.

Gniazda i porty TCP

TCP implementuje połączenia pomiędzy hostami przy użyciu gniazd i portów. Gniazdo to węzeł końcowy komunikacji sieciowej i może ono być aktywne, albo pasywne. Gniazdo aktywne łączy się ze zdalnym gniazdem aktywnym poprzez otwarte łącze do transmisji danych. Kiedy połączenie zostanie zerwane, niszczy to gniazdo aktywne w obu węzłach końcowych. Gniazdo pasywne nie zostaje podłączone, lecz zamiast tego czeka na połączenie przychodzące, które da początek nowemu gniazdu aktywnemu.

Gniazdo związane jest z portem relacją typu wielu do jednego. Każdy z portów może mieć pojedyncze gniazdo pasywne, oczekujące na połączenia przychodzące oraz kilka gniazd aktywnych, z których każde pokrywa się z połączeniem otwartym w porcie. Gniazdo jest węzłem końcowym w komunikacji sieciowej (podobnym do uchwytu pliku) i tworzy się je poprzez określenie adresu IP jego hosta, typu usługi (TCP lub UDP), oraz wykorzystywanego numeru portu.

Wszystkie połączenia TCP są jednoznacznie identyfikowane za pomocą dwóch gniazd — to jest dwóch par adresów IP i portów TCP (jedna dla hosta wysyłającego i jedna dla hosta odbierającego). Programy TCP wykorzystują zarezerwowane, albo dobrze znane, numery portów. Każdy program po stronie serwera, który wykorzystuje porty TCP, nasłuchuje komunikatów przychodzących pod dobrze znany numer portu. Wszystkie numery portów serwerów TCP o wartościach mniejszych niż 1024 (oraz niektóre wyższe numery) są zarezerwowane i zarejestrowane przez organizację przydzielania numerów internetowych (IANA).

Tabela 7.1 podaje dobrze znane porty serwera TCP, wykorzystywane przez standardowe programy oparte na TCP. Nie jest to lista wyłączna, ale zawiera najczęściej używane porty.

Wskazówka: Pełna lista aktualnie zarejestrowanych dobrze znanych portów TCP dostępna jest pod adresem www.isi.edu/in-notes/iana/assignments/port-numbers.

Tabela 7.1. Porty serwerów TCP

Numer portu TCP

Opis

20

Serwer protokołu transmisji plików (FTP) (kanał danych)

21

Serwer FTP (kanał kontrolny)

23

Serwer Telnet

25

Serwer protokołu prostego transferu poczty elektronicznej (SMTP)

53

Transfery strefy systemu nazw domen (DNS)

80

Serwer WWW protokołu transmisji hipertekstu (HTTP)

110

Serwer protokołu odbierania poczty wersji 3 (POP3)

139

Usługa sesji NetBIOS

Trzystopniowe uzgadnianie TCP

TCP ustanawia połączenia za pomocą mechanizmu uzgadniania opartego na numerach sekwencji. Każde z połączeń wymaga numeru sekwencji wysyłania i numeru sekwencji odbioru. Początkowy numer sekwencji wysyłania (ISS) jest bieżącym numerem sekwencji inicjującego hosta TCP, a początkowy numer sekwencji odbioru (IRS) jest bieżącym numerem sekwencji docelowego hosta TCP.

Aby mogło zostać ustanowione połączenie, TCP musi zsynchronizować numery sekwencji wysyłania i odbioru. Odbywa się to przy użyciu bitu kontrolnego synchronizacji (SYN) oraz początkowych numerów sekwencji (ISN-ów). Komunikat SYN (komunikat, który ma ustawiony bit SYN) jest potwierdzany przez komunikat ACK (komunikat, który ma ustawiony znacznik ACK lub znacznik potwierdzenia). Cała procedura znana jest jako trzystopniowe uzgadnianie TCP i działa w następujący sposób:

1.       Host A wysyła komunikat SYN do Hosta B. Komunikat ten zawiera numer sekwencji Hosta A (ISS).

2.       Host B wysyła komunikat ACK z ISS powiększonym o jeden. Komunikat ten ma również ustawiony znacznik SYN i zawiera numer sekwencji Hosta B (IRS).

3.       Host A potwierdza komunikat SYN Hosta B przy użyciu komunikatu ACK z IRS zwiększonym o jeden i pustym polem danych. Zauważ, że kiedy Host A zaczyna wysyłać dane, to nie zwiększa się numer sekwencji Hosta B na skutek tego komunikatu. Komunikaty ACK, które nie zawierają danych, nie powodują zwiększenia przez odbiorcę numeru sekwencji nadawcy.

Rysunek 7.1 przedstawia trzystopniowe uzgadnianie TCP.

 

ISN 1000 (ISS)                                                        ISN 2000 (IRS)

 

                            SEQ=1000 CTL=SYN

Host A                                                                      Host B

 

                            SEQ=2000 ACK=1001 CTL=SYN, ACK

 

                            SEQ=1001 ACK=2001 CTL=ACK

 

 

Rysunek 7.1. Trzystopniowe uzgadnianie TCP

Zaletą trzystopniowego uzgadniania TCP jest to, że Host A może sprawdzić, czy potwierdzenie wysłane przez Hosta B zawiera spodziewany numer sekwencji. Jest możliwe, przy powolnej i zawodnej sieci złożonej (takiej jak Internet), że Host B mógł otrzymać część starego komunikatu, który został wysłany przez Hosta A i jest rozsynchronizowany. W takim przypadku ACK Hosta B zawierałoby błędny numer sekwencji, a połączenie nie zostałoby ustanowione. Host A wysłałby komunikat z ustawionym znacznikiem resetowania (RST), który przywróciłby Hosta B do stanu nasłuchiwania.

Trzystopniowe uzgadnianie TCP jest potrzebne, ponieważ protokół nie nakłada żadnego ograniczenia, aby określone połączenie nie miało być wykorzystane więcej niż jeden raz. Nowe egzemplarze połączenia określane są jako wcielenia i czasami mogą być wysyłane powtórzone komunikaty z poprzednich wcieleń, szczególnie jeżeli połączenie zostanie szybko otworzone, zamknięte i ponownie otworzone w krótkich odstępach czasu, albo jeżeli połączenie zostanie zerwane z utratą pamięci, a następnie zostanie ponownie ustanowione. Trzystopniowe uzgadnianie gwarantuje, że ustanawiane są ważne połączenia, nawet jeśli dany host TCP ulegnie awarii i straci całą wiedzę dotyczącą numerów sekwencji, których używał.

Pojęcie czasu ciszy TCP

W momencie włączenia zasilania, albo podczas powrotu do normalnego stanu po awarii, w wyniku której zostały utracone informacje dotyczące numerowania sekwencji, TCP siedzi cicho (tzn. nie przydziela żadnych numerów sekwencji) przez interwał równy maksymalnemu okresowi istnienia segmentu (MSL). Gwarantuje to, że nie zostanie utworzony segment niosący numer sekwencji podwojony przez stary segment pozostający w sieci. RFC 793 określa MSL wynoszący dwie minuty.

 

Czasami połączenie może być zainicjowane z dwóch hostów naraz. W takim wypadku Host A wysyła pakiet SYN do Hosta B, ale zamiast otrzymać pakiet z ustawionym ACK oraz SYN, otrzymuje inicjujący pakiet SYN Hosta B. Jeżeli tak się dzieje, to Host A ponownie wysyła swój pierwotny pakiet SYN i trzystopniowe uzgadnianie przebiega tak, jak wcześniej.

TCP wykorzystuje podobny proces uzgadniania przed zamknięciem połączenia. Sprawdza on, czy oba hosty zakończyły wysyłanie i odbieranie danych.

Niezawodny przesył danych

Kiedy zostanie ustanowione połączenie, TCP może przesyłać nieprzerwany strumień danych w obu kierunkach. Dane pakowane są w segmenty, a TCP w hostach wysyłających i odbierających decyduje, kiedy blokować, a kiedy przekazywać dane.

TCP musi być w stanie powrócić do normalnego stanu po wystąpieniu sytuacji, w toku których dane uległy uszkodzeniu, utracie, podwojeniu lub zostały dostarczone nie po kolei. Uzyskuje się to poprzez przydzielanie numeru sekwencji w momencie ustanowienia połączenia, zwiększanie go o jeden dla każdego oktetu przetransmitowanych danych, oraz przez wymaganie pozytywnego potwierdzenia (ACK), zawierającego informacje dotyczące numeru sekwencji od odbierającego hosta TCP. Jeżeli ACK nie zostanie otrzymane w granicach określonego czasu, dane są ponownie transmitowane.

W hoście odbierającym, numery sekwencji wykorzystywane są do ponownego składania segmentów w kolejności, w jakiej zostały wysłane oraz do eliminowania powtórzeń. Uszkadzaniu danych zapobiega się poprzez obliczanie sumy kontrolnej dla każdego z transmitowanych segmentów, sprawdzanie tej sumy kontrolnej u odbiorcy, odrzucanie uszkodzonych segmentów oraz przez wymaganie ponownej transmisji uszkodzonych danych. W ten sposób TCP gwarantuje, że błędy transmisji nie uniemożliwią właściwego dostarczania danych i że komunikacja sieciowa będzie mogła wrócić do normalnego stanu po błędach systemu łączności.

Zamykanie połączenia TCP

Host TCP zamyka połączenie poprzez wysłanie pakietu TCP z ustawionym znacznikiem FIN. Łączność TCP jest dwukierunkowa (dupleksowa) i host, który zamyka połączenie, informuje swojego hosta równorzędnego, że nie ma już żadnych danych do wysłania. Może on nadal otrzymywać dane poprzez połączenie, dopóki jego host równorzędny również nie wyśle pakietu zamykającego FIN. Zważywszy, że Host A i Host B biorą udział w dwukierunkowym ruchu TCP, mamy trzy możliwe scenariusze.

Host A inicjuje zamknięcie

W tym przypadku Host A umieszcza segment FIN w kolejce segmentów wychodzących. Nie będą przyjmowane przez TCP żadne dalsze transmisje (SEND-y

... SEND ...

) od Hosta A, a Host A wchodzi w stan FIN-WAIT-1, w którym dozwolone są przychodzące segmenty danych (RECEIVE). Jeżeli to konieczne, wszystkie segmenty poprzedzające i zawierające segment FIN będą retransmitowane dopóki nie zostaną potwierdzone. Kiedy Host B potwierdzi segment FIN Hosta A i wyśle własny FIN, Host A dokona transmisji segmentu ACK, aby potwierdzić ów FIN. Host B otrzyma ten segment ACK i połączenie zostanie zamknięte.

Host A otrzymuje segment FIN

W tym przypadku Host A odbiera niezapowiedziany segment FIN od Hosta B. Host A ACK-uje FIN (cudowna terminologia), który mówi Hostowi B, że połączenie jest zamykane. Wtedy Host A wysyła wszystkie pozostałe dane do Hosta B, a następnie wyśle instrukcję FIN. Z kolei Host B ACK-uje FIN Hosta A i połączenie zostaje zamknięte.

Obydwa hosty zamykają równocześnie

W tym przypadku hosty A i B wymieniają segmenty FIN. Kiedy wszystkie segmenty poprzedzające FIN-y zostaną przetworzone i potwierdzone, każdy z hostów może, za pomocą ACK, potwierdzić FIN, który otrzymał. W momencie otrzymania tych ACK-ów oba hosty usuwają połączenie.

Struktura pakietów TCP

Pakiet (lub segment) TCP jest kapsułowany

... pakowany ...

za pomocą nagłówka IP, który określa informacje dotyczące routingu IP, takie jak adres docelowy i źródłowy datagramu, co przedstawia rysunek 7.2. Ten rysunek ukazuje pakiet TCP SYN, wykorzystywany do inicjacji trzystopniowego uzgadniania TCP. Ponieważ ta struktura pakietowa nie zawiera żadnych danych, ukazuje ona również strukturę nagłówka TCP.

 

 

...

Zgłoś jeśli naruszono regulamin