TCP (ang. Transmission Control Protocol) – połączeniowy, niezawodny, strumieniowy protokół komunikacyjny wykorzystywany do przesyłania danych pomiędzy procesami uruchomionymi na wielorakich maszynach, będący częścią szeroko wykorzystywanego aktualnie stosu TCP/IP -korzysta z usług protokołu IP do wysyłania oraz odbierania danych oraz ich fragmentacji wtedy, kiedy jest to konieczne[1]. Protokół TCP operuje w warstwie transportowej modelu OSI. Został opracowany bazując na badaniach Vintona Cerfa oraz Roberta Kahna[1][2] oraz jest opisany w dokumencie RFC793.
Charakterystyka protokołu
TCP jest protokołem działającym w trybie klient-serwer. Serwer oczekuje na nawiązanie połączenia na określonym porcie. Klient inicjuje połączenie do serwera.
W przeciwieństwie do UDP, TCP gwarantuje wyższym warstwom komunikacyjnym dostarczenie wszystkich pakietów w całości, z zachowaniem kolejności oraz bez duplikatów. Zapewnia to wiarygodne połączenie kosztem większego narzutu w postaci nagłówka oraz większej liczby przesyłanych pakietów. Chociaż protokół definiuje pakiet TCP, to z punktu widzenia wyższej warstwy oprogramowania, dane płynące połączeniem TCP trzeba traktować jako ciąg oktetów. W szczególności – jednemu wywołaniu funkcji API (np. send()) nie musi odpowiadać wysłanie jednego pakietu. Dane z jednego wywołania potrafią zostać podzielone na parę pakietów albo przeciwnie – dane z kilku wywołań potrafią zostać połączone oraz wysłane jako jeden pakiet (dzięki użyciu algorytmu Nagle'a). Również funkcje odbierające dane (recv()) w praktyce odbierają nie konkretne pakiety, ale zawartość bufora stosu TCP/IP, wypełnianego sukcesywnie danymi z przychodzących pakietów.
Nawiązywanie połączenia
W protokole TCP do nawiązania połączenia pomiędzy dwoma hostami wykorzystywana jest procedura nazwana three-way handshake. W sytuacji normalnej jest ona rozpoczynana, kiedy host A chce nawiązać połączenie z hostem B, procedura wygląda następująco[1]:
- host A wysyła do hosta B segment SYN wraz z informacją o dolnej wartości numerów sekwencyjnych używanych do numerowania segmentów wysyłanych przez host A (np. 100) a następnie przechodzi w stan SYN-SENT,
- host B, po otrzymaniu segmentu SYN, przechodzi w stan SYN-RECEIVED i, jeżeli także chce nawiązać połączenie, wysyła hostowi A segment SYN z informacją o dolnej wartości numerów sekwencyjnych używanych do numerowania segmentów wysyłanych przez host B (np. 300) oraz segment ACK z polem numeru sekwencji ustawionym na wartość o jeden większą niż wartość pola sekwencji pierwszego segmentu SYN hosta A, czyli 101.
- host A, po odebraniu segmentów SYN oraz ACK od hosta B przechodzi w stan ESTABLISHED oraz wysyła do niego segment ACK potwierdzający odebranie segmentu SYN (numer sekwencji ustawiony na 301)
- host B odbiera segment ACK oraz przechodzi w stan ESTABLISHED
- host A może teraz rozpocząć przesyłanie danych
Jeśli host odbierający połączenie nie chce albo nie może odebrać połączenia, powinien odpowiedzieć pakietem z ustawioną flagą RST (reset).
Transmisja danych
W kwestii weryfikacji wysyłki oraz odbioru TCP wykorzystuje sumy kontrolne oraz numery sekwencyjne pakietów. Odbiorca potwierdza otrzymanie pakietów o określonych numerach sekwencyjnych ustawiając flagę ACK. Brakujące pakiety są retransmitowane. Host odbierający pakiety TCP defragmentuje je oraz porządkuje je wedle numerów sekwencyjnych tak, by przekazać wyższym warstwom modelu OSI pełen złożony segment.
Zakończenie połączenia
Prawidłowe zakończenie połączenia bywa zainicjowane przez dowolną stronę. Polega ono na wysłaniu pakietu z ustawioną flagą FIN (finished). Pakiet taki wymaga potwierdzenia flagą ACK. Najczęściej po otrzymaniu pakietu z flagą FIN, druga strona także kończy komunikację wysyłając pakiet z flagami FIN oraz ACK. Pakiet taki także wymaga potwierdzenia przez przesłanie ACK.
Dopuszcza się także awaryjne przerwanie połączenia poprzez przesłanie pakietu z flagą RST (reset). Pakiet taki nie wymaga potwierdzenia.
Stany połączenia
Połączenie TCP może znajdować się w jednym z następujących stanów:
- LISTEN
- Gotowość do przyjęcia połączenia na określonym porcie przez serwer.
- SYN-SENT
- Pierwsza faza nawiązywania połączenia przez klienta. Wysłano pakiet z flagą SYN. Oczekiwanie na pakiet SYN+ACK.
- SYN-RECEIVED
- Otrzymano pakiet SYN, wysłano SYN+ACK. Trwa oczekiwanie na ACK. Połączenie jest w połowie otwarte (ang. half-open).
- ESTABLISHED
- Połączenie było prawidłowo nawiązane. Prawdopodobnie trwa transmisja.
- FIN-WAIT-1
- Wysłano pakiet FIN. Dane wciąż bywają odbierane ale wysyłanie jest już niemożliwe.
- FIN-WAIT-2
- Otrzymano potwierdzenie własnego pakietu FIN. Oczekuje na przesłanie FIN od serwera.
- CLOSE-WAIT
- Otrzymano pakiet FIN, wysłano ACK. Oczekiwanie na przesłanie własnego pakietu FIN (gdy aplikacja skończy nadawanie).
- CLOSING
- Połączenie jest zamykane.
- LAST-ACK
- Otrzymano oraz wysłano FIN. Trwa oczekiwanie na ostatni pakiet ACK.
- TIME-WAIT
- Oczekiwanie w celu upewnienia się, że druga strona otrzymała potwierdzenie rozłączenia. Zgodnie z RFC 793 połączenie bywa w stanie TIME-WAIT najdłużej przez 4 minuty.
- CLOSED
- Połączenie jest zamknięte.
Nagłówek TCP
TCP Header
| Offsets |
Octet |
0 |
1 |
2 |
3 |
| Octet |
Bit |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
| 0 |
0 |
Port nadawcy |
Port odbiorcy |
| 4 |
32 |
Numer sekwencyjny |
| 8 |
64 |
Numer potwierdzenia (jeżeli flaga ACK jest ustawiona) |
| 12 |
96 |
Długość nagłówka |
Zarezerwowane |
N
S |
C
W
R |
E
C
E |
U
R
G |
A
C
K |
P
S
H |
R
S
T |
S
Y
N |
F
I
N |
Window Size |
| 16 |
128 |
Checksum |
Wskaźnik priorytetu (jeżeli flaga URG jest ustawiona) |
20
... |
160
... |
Opcje (jeżeli długość nagłówka > 5, to pole jest uzupełniane "0")
... |
Port nadawcy – 16-bitowy numer identyfikujący port nadawcy.
Port odbiorcy – 16-bitowy numer identyfikujący port odbiorcy.
Numer sekwencyjny – 32-bitowy identyfikator określający miejsce pakietu danych w pliku przed fragmentacją (dzięki niemu, da się "poskładać" plik z poszczególnych pakietów).
Numer potwierdzenia – 32-bitowy numer będący potwierdzeniem otrzymania pakietu przez odbiorcę, co dopuszcza na synchronizację nadawanie-potwierdzenie.
Długość nagłówka – 4-bitowa liczba, która oznacza liczbę 32-bitowych wierszy nagłówka, co jest niezbędne przy określaniu miejsca rozpoczęcia danych. Dlatego też nagłówek może posiadać tylko taką długość, która jest wielokrotnością 32 bitów.
Zarezerwowane – 4-bitowy ciąg zer, zarezerwowany dla ewentualnego przyszłego użytku.
Flagi 8-bitowa informacja/polecenie dotyczące bieżącego pakietu. Poszczególne flagi oznaczają:
- CWR – (ang. Congestion Window Reduced) flaga potwierdzająca odebranie powiadomienia przez nadawcę, dopuszcza odbiorcy zaprzestanie wysyłania echa.
- ECE – (ang. ECN-Echo) flaga ustawiana przez odbiorcę w momencie otrzymania pakietu z ustawioną flagą CE
- URG – informuje o istotności pola "Priorytet"
- ACK – informuje o istotności pola "Numer potwierdzenia"
- PSH – wymusza przesłanie pakietu
- RST – resetuje połączenie (wymagane ponowne uzgodnienie sekwencji)
- SYN – synchronizuje kolejne numery sekwencyjne
- FIN – oznacza zakończenie przekazu danych
Szerokość okna – 16-bitowa informacja o tym, ile danych może aktualnie przyjąć odbiorca. Wartość 0 wskazuje na oczekiwanie na segment z innym numerem tego pola. Jest to mechanizm zabezpieczający komputer nadawcy przed zbyt dużym napływem danych.
Suma kontrolna – 16-bitowa liczba, będąca wynikiem działań na bitach całego pakietu, pozwalająca na sprawdzenie tego pakietu pod względem poprawności danych.
Wskaźnik priorytetu – jeżeli flaga URG jest włączona, informuje o ważności pakietu.
Opcje – czyli ewentualne dodatkowe informacje oraz polecenia:
- 0 – koniec listy opcji
- 1 – niedobór działania
- 2 – ustawia maksymalna długość segmentu
W przypadku opcji 2 to tzw. Uzupełnienie, które dopełnia zerami długość segmentu do wielokrotności 32 bitów (patrz: informacja o polu "Długość nagłówka")
Zastosowania
Aplikacje, w których zalety TCP przeważają nad wadami (większy koszt związany z utrzymaniem sesji TCP przez stos sieciowy), to m.in. programy używające protokołów warstwy aplikacji: HTTP, SSH, FTP czy SMTP/POP3 oraz IMAP4.
Przypisy
Sprawdź też
Linki zewnętrzne