Podstawy protokołu TCP
Transmission Control Protocol (TCP) - protokół używany na codzień przez każdego z nas. W tym artykule przyjrzę się jak działa, jaka jest struktura nagłówka, mechanizmy działania i sposób, w jaki zapewnia niezawodność komunikacji.
Czym jest?
TCP to protokół warstwy transportowej modelu OSI, używany do przesyłania danych między aplikacjami. Najważniejszą cechą TCP jest połączeniowość i niezawodność - dane trafiają do odbiorcy w odpowiedniej kolejności, bez duplikatów i z kontrolą błędów.
TCP pracuje ponad protokołem IP i razem tworzą znane połączenie TCP/IP.
Proces ustanawiania połączenia - 3-way handshake
Każda komunikacja TCP zaczyna się od ustanowienia połączenia w trzech krokach:
- SYN - klient wysyła pakiet inicjalizujący z ustawioną flagą SYN
- SYN-ACK - serwer odpowiada pakietem potwierdzającym z flagami SYN i ACK
- ACK - klient potwierdza otrzymanie i połączenie zostaje ustanowione
sequenceDiagram
participant Klient
participant Serwer
Klient->>Serwer: SYN
Serwer->>Klient: SYN + ACK
Klient->>Serwer: ACK
Note over Klient,Serwer: Połączenie ustanowione
Ten mechanizm zapobiega przypadkowym połączeniom i pomaga zsynchronizować numery sekwencyjne.
Struktura nagłówka TCP
| Pole | Rozmiar (bitów) | Opis |
|---|---|---|
| Port źródłowy | 16 | Numer portu wysyłającego |
| Port docelowy | 16 | Numer portu odbiorcy |
| Numer sekwencyjny | 32 | Pozycja pierwszego bajtu w strumieniu |
| Numer potwierdzający | 32 | Oczekiwany numer sekwencyjny od drugiej strony |
| Offset danych | 4 | Długość nagłówka TCP |
| Flagi | 9 | SYN, ACK, FIN, RST, PSH, URG itd. |
| Okno odbiorcze | 16 | Ile bajtów można wysłać zanim trzeba potwierdzić |
| Suma kontrolna | 16 | Sprawdzenie błędów w nagłówku i danych |
| Wskaźnik pilności | 16 | Używany z flagą URG |
| Opcje (opcjonalne) | zmienna | Np. MSS, ustawienie wielkości okna (window scaling) |
Flagi używane w komunikacji TCP
SYN- rozpoczęcie połączeniaACK- potwierdzenie danychFIN- zakończenie połączeniaRST- natychmiastowe przerwanie połączeniaPSH- dane powinny być przekazane aplikacji natychmiastURG- oznaczenie danych jako pilnych
Gwarancje i mechanizmy TCP
Kolejkowanie i kontrola sekwencji
TCP numeruje każdy pakiet danych wysyłany w strumieniu. Dzięki temu odbiorca może ułożyć je w odpowiedniej kolejności, nawet jeśli pakiety dotarły w różnej kolejności.
Potwierdzenia i retransmisje
Brak potwierdzenia (ACK) w określonym czasie skutkuje retransmisją. To mechanizm niezawodności, który minimalizuje utratę danych.
sequenceDiagram
participant Klient
participant Serwer
Klient->>Serwer: FIN
Serwer->>Klient: ACK
Note over Klient,Serwer: Połączenie częściowo zamknięte (half-close)
Serwer->>Klient: FIN
Klient->>Serwer: ACK
Note over Klient,Serwer: Połączenie zamknięte po obu stronach
Kontrola przeciążenia
TCP dynamicznie reguluje szybkość przesyłania danych na podstawie sygnałów z sieci:
- Slow start - na początku połączenia TCP powoli zwiększa liczbę bajtów w locie.
- Congestion avoidance - dostosowuje okno transmisji przy przeciążeniu.
- Fast retransmit - przy wykryciu utraty pakietu retransmituje go bez czekania na timeout.
Zamykanie połączenia
Zamknięcie TCP również odbywa się w krokach:
- Jedna strona wysyła
FIN - Druga strona odpowiada
ACK - Druga strona wysyła
FIN - Pierwsza strona odpowiada
ACK
W niektórych przypadkach zamknięcie może być jednostronne (tzw. half-close).
TCP vs UDP
| Cecha | TCP | UDP |
|---|---|---|
| Połączeniowy | Tak | Nie |
| Kolejność danych | Gwarantowana | Brak gwarancji |
| Retransmisja | Tak | Nie |
| Zastosowania | HTTP, SSH, FTP | DNS, VoIP, streaming |
Jak to działa w Linuxie?
Już wiemy jak to działa, ale jak to wygląda w praktyce na systemie Linux?
-
kernel implementuje całą logikę protokołu TCP - od ustanawiania połączeń (
SYN,ACK,FIN), przez retransmisje, kontrolę przeciążenia, aż po zamykanie połączeń. -
procesy użytkownika (np.
curl,ssh,nginx) korzystają z interfejsu socketów, który pozwala im wysyłać i odbierać dane przez TCP, ale nie zajmują się one samym protokołem - to robi jądro naszego systemu operacyjnego
Przykład działania:
- aplikacja wywołuje funkcję
connect()na sockecie TCP - kernel inicjuje 3-way handshake
- kernel buforuje dane, zarządza oknami TCP i pilnuje retransmisji
- aplikacja odbiera dane przez
read()lubrecv()- nie widzi mechaniki TCP, tylko czysty strumień bajtów - po zakończeniu komunikacji aplikacja wywołuje
close()na sockecie, co inicjuje proces zamykania połączenia
Gdzie to jest?
Implementacja TCP znajduje się w kodzie jądra Linuksa - konkretnie w podsystemie sieciowym (net/ipv4/tcp.c, tcp_input.c, tcp_output.c itd.)
Możesz to podejrzeć w źródłach Linuksa, kod jest dostepny również online, ale co Ci szkodzi pobrać i przejrzeć samemu?
Podsumowanie
TCP to solidny, dobrze zaprojektowany protokół, zrozumienie jego działania pomaga nie tylko przy debugowaniu połączeń, ale też przy projektowaniu usług, które mają być skalowalne i odporne na błędy sieciowe.