Model TCP/IP, którego początki siegają lat 70, nazywany jest też modelem protokołów. Ma on za zadanie określać sposób zarządzania komunikacją w sieci na podstawie protokołów w kolejnych warstwach. Oznacza to, że urządzenia tworzące sieć niezależnie od np. używanego systemu operacyjnego mogą się ze sobą porozumiewać. Ich przebieg komunikacji wygląda w taki sam bądź zbliżony sposób.
Czytając o modelu TCP/IP natkniemy się na informacje o modelu ISO/OSI. Należy pamietać, że jest to model teoretyczny, który pokrywa każdą z warstw modelu TCP/IP. Oznacza to, że wskazuje on drogę w projektowaniu komunikacji w sieci. Ważne jest znanie nazewnictwa z modelu ISO/OSI celem sprawego poruszania się po dokumentacjach, które odnoszą się już do jego konkretnych warstw.
Wysyłanie wiadomości w TCP/IP
Przesył danych w modelu TCP/IP można opisać w następujacy sposób:
- Wiadomość jest wysyłana od najwyżej do najniższej warstwy, a w każdej z nich do wiadomości dodawane są kolejne nagłówki zapewniające prawidłowe dostarczanie danych – proces ten nazywany jest enkapsulacją. Warstwy w modelu TCP/IP prezentują się w sposób następujący:
- warstwa aplikacji,
- warstwa transportowa,
- warstwa internetowa,
- warstwa dostępu do sieci.
- Dane z dołączonymi nagłówkami są transmitowane przez sieć do drugiego komputera,
- Dane zwrotne powracają od najniższej do najwyżej warstwy do punktu docelowego.
Każda z warstw składa się z protokołów, które ustalają ścisłe reguły komunikacji miedzy kolejnymi warstwami. Nie oznacza to jednak, że jeden protokół przypada na jedną warstwę. Przykładowo, w warstwie aplikacji może zostać wykorzystany jednocześnie protokół DNS oraz HTTP.
Protokoły mimo że współpracują ze sobą, nie dbają o to, co robi ich warstwa nadrzędna/podrzędna, a jedynie wiedzą, w jaki sposób przekazać dane, za które odpowiadają.
Warstwa aplikacji
Jest to pierwsza z warstw, umożliwiająca programom i aplikacjom kodowanie danych do odpowiedniego formatu, które następnie są przekazywane do kolejnej warstwy. Wykorzystywane są do tego gniazda sieciowe (internet sockets).
Mówiąc o gnieździe sieciowym mamy na myśli unikalny obiekt utworzony przez adres internetowy, protokół komunikacyjny (z niższej warstwy) oraz numer portu. Samego gniazda nie należy traktować jako połączenie, ale punkt końcowy (endpoint) określonego połączenia, który daje możliwość przesyłu i odbioru danych między dwoma różnymi komputerami. W poniższym przykładzie skopiowanym bestialsko z wikipedii, możemy zauważyć utworzenie obiektu gniazda sieciowego, a następnie przesłanie za jego pomocą ciągu znaków oraz zamknięcie punktu końcowego.
Socket mysocket = getSocket(type = "TCP")
connect(mysocket, address = "1.2.3.4", port = "80")
send(mysocket, "Hello, world!")
close(mysocket)
Mylić może nas słówko kluczowe „connect”, które sugeruje, że samo gniazdo stanowi raczej połączenie niż punkt dostępu. Stało się to przedmiotem dyskusji, która w ogromnym skrócie wynika z błędnie użytej terminologii w bibliotekach programistycznych. Nie mniej jednak zachęcamy odwiedzenia i zapoznania się ze źródłem.
Numer portu, który składa się na obiekt gniazda, zależny jest od protokołu z warstwy aplikacji, który chcemy użyć. Do najbardziej znanych należą:
- Protokół HTTP – umożliwia przesyłanie dokumentów hipertekstowych. Szczegółowo zajmiemy się nim w kolejnych artykułach,
- Protokół DNS – (ogólnie mówiąc) zmienia nazwę serwera na zrozumiałą dla komputera. Więcej o nim pisaliśmy tutaj,
- Protokół FTP – umożliwa dwukierunkowy transfer plików miedzy klientem a serwerem,
- Protokół SMTP – umożliwa przekazywanie poczty elektronicznej,
- Protokół SSH – umożliwia zdalne połączenie z serwerem.
Warstwa transportowa
Każda aplikacja w zależności od używanych protokołów inaczej nazywa sturuktury danych używane w kolejnych warstwach aplikacji. Protokół TCP (nie mylić z modelem TCP/IP, o którym mowa) z warstwy transportowej opisuje dane w swoim obrębie jako segment, natomiast protokół UDP nazywa je datagramem. Takie dane niezależnie od nazwy w warstwie transportowej ulegają podziałowi na mniejsze części, które przesyłane są do warstwy internetowej z dołączonym dodatkowym nagłówkiem.
Do najważniejszych protokołów warstwy transportowej należą: TCP, UDP, SCTP, DCCP i RSVP. Na potrzeby artykułu zajmiemy się tylko dwoma z nich. Zaczniemy od protokołu TCP, który zapewnia połączenie między stronami dzięki procedurze three-way handshake. Jak ona wygląda?
TCP A TCP B
1. CLOSED LISTEN
2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED
3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
5. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED
- Początkowo połączenie nie istnieje (CLOSED), a serwer TCP B nasłuchuje na segmenty.
- TCP A, który mógłby być w tym przypadku klientem, przesyła na TCP B (np. serwer) segment SYN oznaczający synchronizację kolejnego numeru sekwencyjnego oraz dolną wartość numeru sekwencyjnego, która wynosi 100. TCP A po przesłaniu przechodzi w stan SYN-SENT, a TCP B po odebraniu w stan SYN-RECEIVED.
- W przypadku zgody na utworzenie punktu połączenia, TCP B przesyła także dolną wartość numeru sekwencyjnego (300) wraz z segmentem ACK większym od poprzedniego o jeden.
- TCP A po odebraniu przechodzi w stan ESTABLISHED i wysyła na TCP B swój segment i segment ACK należący do TCP B powiększony o jeden. TCP B po otrzymaniu także przechodzi w stan ESTABLISHED.
- Następnie TCP A może zacząć przesył danych.
Mnogość skrótów może utrudniać zrozumienie, ale po kilku podejściach jest łatwiej 🙂 Z opisu powyżej możemy wyciągnąć dwie najważniejsze cechy, jakie posiada protokół TCP. Jest to:
- niezawodność – odbiorca sprawdza czy suma kontrolna jest poprawna – jeśli tak, przesyła potwierdzenie otrzymania wiadomości (ACK). W przypadku braku odpowiedzi, segment jest przesyłany ponownie,
- uszeregowanie segmentów – numer sekwencyjny jest zwiększany w kolejnymi wiadomościami, przez co są one układane we właściwej kolejności.
Nagłówek TCP dołączany do wiadomości przekazywanej kolejnej warstwie posiada od 20 do 60 bajtów, a jego wielkość jest zależna od wprowadzonych informacji opcjonalnych. Do protokołów z warstwy aplikacji korzystających z protokołu TCP należą m.in.: HTTP, HTTPS, FTP czy SMTP.
Protokół UDP – odpowiada za przesył danych bez ustalania stałego połączenia. Ponadto, nie zapewnia on niezawodności i uszeregowania datagramów (odpowiednik segmentu). W związku z tym tracimy na pewności, czy datagram dotrze na miejsce, a przesyłane dane są od siebie niezależne. Zapewnienie niezawodności jednak można osiągnąć po stronie aplikacji. Ponadto, datagram UDP posiada jedynie 8 bajtów i jest znacznie szybszy niż protokół TCP. Wykorzystamy go więc wszędzie tam, gdzie utrata segmentów nie wpływa znacząco na odbierane informacje np. w odsłuchiwaniu audio bądź przy oglądaniu wideo. UDP jest stosowane także przy zapytaniach DNS przez niewielką wielkość przesyłanych żądań i brak obciążenia na odpytywanych serwerach DNS.
Warstwa internetowa
Głównym zadaniem warstwy internetowej jest trasowanie pakietów między kolejnymi hostami w sieci. Trasowanie (routing) oznacza dobieranie najbardziej optymalnej trasy. Do warstwy internetowej należą także routery (nazywane też węzłami), czyli urządzenia sieciowe łączące sieci fizyczne. Routery kierują pakietami przy użyciu adresów IP nadawcy i odbiorcy znajdującym się w nagłówku oraz tablic routingu budowanych dynamicznie. Na samym rutingu skupimy się już w oddzielnym artykule. W celu podejrzenia trasy z miejscem docelowym, posłużymy się komendą:
traceroute website.com
Najbardziej znanym protokołem warstwy internetowej jest protokół IP (tak faktycznie powinniśmy napisać protokoły IPv4 i IPv6, różniące się od siebie wersją). Ma on za zadanie przesyłanie danych z jednego komputera do kolejnego. Warto pamiętać, że protokół IP nie jest niezawodny. Z kolei wykorzystując protokół TCP z poprzedniej warstwy, całość staje się niezawodna.
W przypadku użycia jednego z protokołów IP, następuje utworzenie mniejszych datagramów (pakietów) z tych otrzymanych w warstwie internetowej.
Warstwa dostępu do sieci
Warstwa dostępu do sieci ma za zadanie dostarczanie pakietów danych do innych urządzeń w bezpośrednio podłączonej sieci.
Protokoły technologii WAN takie jak Frame relay i ATM zostały utworzone aby wykorzystać istniejące w ich czasach obwody telekomunikacyjne. Ethernet w tamtych czasach był ograniczony i niedość dojrzały aby zastąpić technologię WAN. Obecnie protokół Ethernet jest on stosowany niemalże wszędzie.
A więc, w przypadku użycia protokołu Ethernet – na poziomie warstwy dostępu do sieci następuje enkapsulacja datagramów IP w ramki, które są następnie przesyłane przez sieć. Ponadto, do ramki dodawany jest adres źródłowy warstwy dostępu do sieci i adres docelowej warstwy dostępu do sieci (na przykład adres MAC).
Źródła
https://www.pcworld.pl/news/TCP-IP-w-pigulce,290576.html
https://www.ibm.com/docs/en/zvse/6.2?topic=programming-what-is-tcpip-socket-connection
http://www.crypto-it.net/pl/teoria/protokoly-tcp-ip.html
https://www.oreilly.com/library/view/tcpip-network-administration/0596002971/ch01.html
https://www.ietf.org/rfc/rfc793.txt
https://stackoverflow.com/questions/42456116/understanding-tcp-ip-layering-through-internet-flow
https://stackoverflow.com/questions/152457/what-is-the-difference-between-a-port-and-a-socket?rq=1