Narzędzia użytkownika

Narzędzia witryny


Pasek boczny

sk1:transport

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

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:

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 netcat ma kota w ASCII art lub informację "Netcat was written by a guy we know as the Hobbit")
  • GNU netcat (rozpoznawanie: man nc / man netcat przedstawia się jako GNU netcat)
  • BSD netcat (rozpoznawanie: man nc / man netcat zawiera tekst BSD)
  • busybox nc (rozpoznawanie: używasz busyboxa)

Serwer (GNU / "oryginalny" / bb) Serwer (BSD) Klient
TCPnc -l -p 12345 nc -l 12345 nc 10.0.0.1 12345
UDPnc -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
TCPsocat TCP-LISTEN:12345 STDIO socat STDIO TCP-CONNECT:10.0.0.1:12345
UDPsocat UDP-RECV:12345 STDIO socat STDIO UDP-SENDTO:10.0.0.1:12345
UDPsocat UDP-LISTEN:12345 STDIO socat STDIO UDP:10.0.0.1:12345
SCTPsocat 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:

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 - [1] [2]

  • 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
  • Połączeniowy (punkt-punkt) i stanowy – diagram stanów [1] [2]
    • 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
1) czy ktoś zna jakieś lepsze tłumaczenie na polski nazwy "user ports" lub "registered ports"?
sk1/transport.txt · ostatnio zmienione: 2018/05/13 23:42 przez jkonczak