===== 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 * http://www.iana.org/assignments/protocol-numbers * ''/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: * http://www.iana.org/assignments/service-names-port-numbers * ''/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 [[https://tools.ietf.org/html/rfc6335#section-8.1.2|[RFC6335]]]: * uprzywilejowane (system / well-known / privileged) – 1÷1023 \\ jako lokalne porty mogą być używane tylko przez uprzywilejowanego użytkownika (root / administrator), * //zarejestrowane// ((czy ktoś zna jakieś lepsze tłumaczenie na polski nazwy "user ports" lub "registered ports"?)) (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 [[https://en.wikipedia.org/wiki/Netcat#Ports_and_reimplementations|[1]]], między innymi: * [[http://nc110.sourceforge.net/|"oryginalny" netcat]] (rozpoznawanie: ''man nc'' / ''man netcat'' ma kota w ASCII art lub informację "Netcat was written by a guy we know as the Hobbit") * [[http://netcat.sourceforge.net/|GNU netcat]] (rozpoznawanie: ''man nc'' / ''man netcat'' przedstawia się jako GNU netcat) * [[http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/nc/|BSD netcat]] (rozpoznawanie: ''man nc'' / ''man netcat'' zawiera tekst BSD) * [[http://www.busybox.net/downloads/BusyBox.html#nc|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) [[http://www.dest-unreach.org/socat/|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] ++++ Przykłady: | * HTTP: Wyślij na port 80 adresu www.put.poznan.pl tekst: \\ (możesz też wykorzystać TCP+SSL: ''socat ssl:www.put.poznan.pl:443 readline''):
GET / HTTP/1.0


(pusta linia ma znaczenie) * Uruchom ''socat tcp-l:12345,fork -'', przyłącz kilka osób * Dowiedz się po co socat ma dwa argumenty: ''socat tcp-l:8080,fork tcp:fc.put.poznan.pl:80'' + http://localhost:8080 * FTP: Przez połączenie ''nc sunsite.icm.edu.pl 21'' wyślij: USER anonymous PASS anonymous EPSVDalej: otwórz połączenie na ten sam adres i otrzymany w odpowiedzi port \\ Przez pierwsze połączenie wyślij: LIST QUIT ++++ ====== 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 ====== Nagłówek TCP - [[http://tools.ietf.org/html/rfc793#section-3.1|[1]]] [[http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure|[2]]] * flagi - syn, ack, fin, rst [[http://tools.ietf.org/html/rfc793#page-36|[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 * **Połączeniowy** (punkt-punkt) i **stanowy** – diagram stanów [[http://tools.ietf.org/html/rfc793#page-23|[1]]] [[http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation|[2]]] * nawiązanie połączenia, * podtrzymywanie połączenia, * zakończenie połączenia, półzakończenie, * zerwanie połączenia. * **[[http://www.cs.put.poznan.pl/jkonczak/tcp_flow.svg|normalny przebieg połączenia]]** * na jego podstawie zdefiniowana jest warstwa transportowa w modelu TCP/IP. [[https://pl.wikipedia.org/wiki/Algorytm_Nagle'a|Algorytm Nagle'a]][[http://tools.ietf.org/html/rfc7323|window scale option, RTTM]], [[https://en.wikipedia.org/wiki/Sliding_window_protocol|sliding window]], [[http://en.wikipedia.org/wiki/TCP_congestion-avoidance_algorithm|congestion control (przeciążenie)]], ECN [[https://tools.ietf.org/html/rfc3168|[1]]] [[http://en.wikipedia.org/wiki/Explicit_Congestion_Notification|[2]]], [[http://en.wikipedia.org/wiki/Port_scanner|skaner portów]], [[http://tools.ietf.org/html/rfc4987|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