Internet
TCP (protokół) – Wikipedia, wolna encyklopedia
TCP (protokół) – Wikipedia, wolna encyklopedia
TCP (ang. Transmission Control Protocol – protokół kontroli transmisji) – strumieniowy protokół komunikacji między dwoma komputerami. Został stworzony przez Vintona Cerfa i Roberta Kahna.
Jest on częścią większej całości określanej jako stos TCP/IP. W modelu OSI TCP odpowiada warstwie transportowej.
Spis treści |
[edytuj] 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 i bez duplikatów. Zapewnia to wiarygodne połączenie kosztem większego narzutu w postaci nagłówka i 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 należy 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 mogą zostać podzielone na kilka pakietów lub odwrotnie – dane z kilku wywołań mogą zostać połączone i 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.
[edytuj] Nawiązywanie połączenia
Charakterystyczny dla TCP jest moment nawiązania połączenia, nazywany three-way handshake. Host inicjujący połączenie wysyła pakiet zawierający segment TCP z ustawioną flagą SYN (synchronize). Host odbierający połączenie, jeśli zechce je obsłużyć, odsyła pakiet z ustawionymi flagami SYN i ACK (acknowledge – potwierdzenie). Inicjujący host powinien teraz wysłać pierwszą porcję danych, ustawiając już tylko flagę ACK (i gasząc SYN). Jeśli host odbierający połączenie nie chce lub nie może odebrać połączenia, powinien odpowiedzieć pakietem z ustawioną flagą RST (reset).
[edytuj] Transmisja danych
W celu weryfikacji wysyłki i odbioru TCP wykorzystuje sumy kontrolne i 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 i porządkuje je według numerów sekwencyjnych tak, by przekazać wyższym warstwom modelu OSI pełen złożony segment.
[edytuj] Zakończenie połączenia
Prawidłowe zakończenie połączenia może być 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 również kończy komunikację wysyłając pakiet z flagami FIN i ACK. Pakiet taki również wymaga potwierdzenia przez przesłanie ACK.
Dopuszcza się również awaryjne przerwanie połączenia poprzez przesłanie pakietu z flagą RST (reset). Pakiet taki nie wymaga potwierdzenia.
[edytuj] 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 zostało prawidłowo nawiązane. Prawdopodobnie trwa transmisja.
- FIN-WAIT-1
- Wysłano pakiet FIN. Dane wciąż mogą być 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 i 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 może być w stanie TIME-WAIT najdłużej przez 4 minuty.
- CLOSED
- Połączenie jest zamknięte.
[edytuj] Nagłówek TCP
| Bity 0–3 | 4–7 | 8–15 | 16–31 | |||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Port nadawcy | Port odbiorcy | ||||||||||||||||||||||||||||||
| 32 | Numer sekwencyjny | |||||||||||||||||||||||||||||||
| 64 | Numer potwierdzenia | |||||||||||||||||||||||||||||||
| 96 | Długość nagłówka | Zarezerwowane | Flagi | Szerokość okna | ||||||||||||||||||||||||||||
| 128 | Suma kontrolna | Wskaźnik priorytetu | ||||||||||||||||||||||||||||||
| 160 | Opcje (opcjonalnie) | |||||||||||||||||||||||||||||||
| 160/192+ | Dane |
|||||||||||||||||||||||||||||||
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, można "poskładać" plik z poszczególnych pakietów).
Numer potwierdzenia – 32-bitowy numer będący potwierdzeniem otrzymania pakietu przez odbiorcę, co pozwala 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 mieć 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ę, umożliwia 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 i polecenia:
- 0 – koniec listy opcji
- 1 – brak 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")
[edytuj] 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 i IMAP4.
[edytuj] Zobacz też
[edytuj] Linki zewnętrzne
- RFC 793: Transmission Control Protocol
- RFC 1323: Rozszerzenia TCP
- Opis protokołu TCP w języku angielskim
|
||||||||||||||