===== 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
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
EPSV
Dalej: 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