Table of Contents
Przypomnienie modelu warstwowego
Protokoły warstwy transportowej
Przypomnienie skąd wiadomo jaki protokół warstwy transportowej jest używany:
https://pl.wikipedia.org/wiki/IPv4#Nag.C5.82.C3.B3wek_IP
Lista przydzielonych numerów protokołów
/etc/protocols(less /etc/protocols)
Port, połączenie
System operacyjny wybiera do jakiego programu ma trafić wiadomość na podstawie numeru protokołu warstwy transportowej oraz numeru portu – adresu na warstwie transportowej.
Program który chce używać sieci może:
- nasłuchiwać – czekać na nowe wiadomości / nowe połączenia – nazywa się go wtedy serwerem
- wysłać wiadomość / połączyć się pod wskazany adres – nazywa się go wtedy klientem
(program może jednocześnie pełnić rolę serwerów i klienów)
Żeby system operacyjny wiedział który proces czeka na wiadomości kierowane na konkretny port (nasłuchuje), proces musi wpierw zażądać nasłuchiwania na wybranym porcie.
Lista domyślnych portów:
/etc/services
Połączenie między dwoma programami jest identyfikowane na podstawie:
- adresu zdalnego,
- adresu lokalnego,
- protokołu,
- portu zdalnego,
- portu lokalnego.
Protokoły warstwy transportowej używają zwykle numerów portu z zakresu 216 (0÷65535).
Ten zakres jest podzielony na porty [RFC6335]:
- uprzywilejowane (system / well-known / privileged) – 1÷1023
jako lokalne porty mogą być używane tylko przez uprzywilejowanego użytkownika (root / administrator), - zarejestrowane 1) (user / registered) – 1024÷49151
mogą zostać zarejestrowane (tzn. przypisane do konkretnego zastosowania w rejestrze utrzymywanym przez IANA), - efemeryczne (dynamic / private / ephemeral) – 49152÷65535
używane kiedy program nie potrzebuje stałego numeru portu (czyli zwykle kiedy program nawiązuje połączenie).
W implementacjach systemów operacyjnych zwykle granica między user ports a ephemeral jest niższa, np. w Linuksie zakres portów efemerycznych można odczytać wykonując jedną z poniższych komend:
sysctl net.ipv4.ip_local_port_range
cat /proc/sys/net/ipv4/ip_local_port_range.
Monitorowanie bieżących połączeń
netstat [|-a|-l] [-t] [-u] [-p] [-n](np.netstat -atupn)ss [|-a|-l] [-t] [-u] [-p] [-n](np.ss -atupn)Przełączniki dla netstat / ss: ┌ (domyślnie) tylko już nawiązane połączenia │ -l nasłuchujące porty (programy czekające aż ktoś do nich się połączy) └ -a nasłuchujące porty + nawiązane połączenia ┌ (domyślnie) wszystkie wspierane protokoły sieciowe │ -t połączenia protokołu TCP └ -u połączenia protokołu UDP -p nazwa i pid programu do którego należy połączenie -n pokazywanie wszystkich wartości numerycznie, np. '22' zamiast 'ssh' Więcej: netstat -h / ss -h
/proc/net/(tcp|udp|…)(np.cat /proc/net/tcp)
# netstat -atunp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 13830/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 28693/exim4 tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 26745/cupsd tcp 0 780 10.0.1.1:22 150.254.33.66:38126 ESTABLISHED 19424/sshd: usernam tcp 0 0 10.0.1.1:38596 150.254.30.199:443 ESTABLISHED 19481/weechat tcp6 0 0 :::22 :::* LISTEN 13830/sshd udp 0 0 0.0.0.0:68 0.0.0.0:* 14541/dhclient udp 0 0 10.0.1.1:53 0.0.0.0:* 22173/named udp 768 0 0.0.0.0:35722 0.0.0.0:* 21533/snmpwalk
Testowanie łączności na warstwie aplikacji
Testowanie łączności programami netcat / nc oraz socat
Najpopularniejszy program netcat / nc ma wiele wersji [1], między innymi:
- "oryginalny" netcat (rozpoznawanie:
man nc/man netcatma kota w ASCII art lub informację "Netcat was written by a guy we know as the Hobbit") - busybox nc (rozpoznawanie: używasz busyboxa)
| Serwer (GNU / "oryginalny" / bb) | Serwer (BSD) | Klient | |
|---|---|---|---|
| TCP | nc -l -p 12345 | nc -l 12345 | nc 10.0.0.1 12345 |
| UDP | nc -u -l -p 12345 | nc -u -l 12345 | nc -u 10.0.0.1 12345 |
Mniej popularny, bardziej rozbudowany (i wciąż rozwijany) socat
| Serwer | Klient | |
|---|---|---|
| TCP | socat TCP-LISTEN:12345 STDIO | socat STDIO TCP-CONNECT:10.0.0.1:12345 |
| UDP | socat UDP-RECV:12345 STDIO | socat STDIO UDP-SENDTO:10.0.0.1:12345 |
| UDP | socat UDP-LISTEN:12345 STDIO | socat STDIO UDP:10.0.0.1:12345 |
| SCTP | socat SCTP-LISTEN:12345 STDIO | socat STDIO SCTP-CONNECT:10.0.0.1:12345 |
Zamiast STDIO możesz pisać - (dodatkowo w większości dystrybucji można też skorzystać z readline)
Socat nie rozróżnia wielkości liter, pozwala na skróty - np. udp-l jako udp-listen czy tcp jako tcp-connect
Adresy IPv6 podaje się w nawiasach kwadratowych, np. [::1]
UDP
http://tools.ietf.org/html/rfc768
Działanie:
- bezpołączeniowy, bezstanowy,
- brak kontroli przepływu,
- brak gwarancji dostarczenia,
- przesyła wiadomości (datagramy).
Wielkość datagramów ograniczona do 64k (zwykle wysyła się mniejsze).
Pozwala na używanie rozgłoszeń / multicastów
Protokoły / programy używające UDP: DNS, DHCP, strumieniowanie dźwięku (multimediów), gry sieciowe
TCP
- flagi - syn, ack, fin, rst [1], psh,
- numery sekwencyjne i numery potwierdzenia,
- rozmiar okna,
- opcje.
- Pojedyncze wiadomości TCP nazywa się segmentami (dlatego że są częścią strumienia)
- Strumieniowy – przenosi strumień danych – zachowuje kolejność danych, ale gubi podział danych na porcje
- Kontrola przepływu, potwierdzenia, skalowanie wielkości okna
- Buforowanie
-
- nawiązanie połączenia,
- podtrzymywanie połączenia,
- zakończenie połączenia, półzakończenie,
- zerwanie połączenia.
- na jego podstawie zdefiniowana jest warstwa transportowa w modelu TCP/IP.
Algorytm Nagle'awindow scale option, RTTM, sliding window, congestion control (przeciążenie), ECN [1] [2], skaner portów, SYN flood
Protokoły / programy używające TCP - "wszysto", np. http, ftp, ssh, ssl, …
Inne protokoły warstwy transportu
Poza TCP (75%-95% ruchu) i UDP (reszta) można spotkać jeszcze na warstwie transportowej następujące protokoły ogólnego przeznaczenia:
- UDP-lite
- DCCP
- SCTP