User Tools

Site Tools


sk1:transport

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
sk1:transport [2016/05/09 22:09] – jkonczaksk1:transport [2018/05/13 21:42] (current) – [TCP] jkonczak
Line 3: Line 3:
 ====== Protokoły warstwy transportowej ====== ====== Protokoły warstwy transportowej ======
  
-Przypomnienie: skąd wiadomo jaki jest używany – https://pl.wikipedia.org/wiki/IPv4#Nag.C5.82.C3.B3wek_IP+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 Lista przydzielonych numerów protokołów
Line 11: Line 11:
 ===== Port, połączenie ===== ===== Port, połączenie =====
  
-System operacyjny wybiera do jakiego programu ma trafić wiadomość na podstawie **numeru portu** – adresu na warstwie transportowej.\\ +System operacyjny wybiera do jakiego programu ma trafić wiadomość na podstawie numeru **protokołu warstwy transportowej** oraz **numeru portu** – adresu na warstwie transportowej. 
-<html><small></html>Żeby system operacyjny wiedział który proces czeka na wiadomości kierowane na konkretny port, trzeba wpierw powiązać (''bind'') numer portu z procesem.<html></small></html>+ 
 +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** \\ <html><small>(program może jednocześnie pełnić rolę serwerów i klienów)</small></html> 
 + 
 +Ż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: Lista domyślnych portów:
Line 25: Line 31:
   * portu lokalnego.   * portu lokalnego.
  
-Protokoły warstwy transportowej używają zwykle numerów portu z zakresu 0÷65535.\\ +Protokoły warstwy transportowej używają zwykle numerów portu z zakresu 2<html><sup>16</sup></html> (0÷65535).\\ 
-Ten zakres jest podzielony na porty: +Ten zakres jest podzielony na porty [[https://tools.ietf.org/html/rfc6335#section-8.1.2|[RFC6335]]]: 
-  * uprzywilejowane (system / well-known / privileged) – 1÷1023 – mogą być używane tylko przez uprzywilejowanego użytkownika (root / administrator), +  * uprzywilejowane (system / well-known / privileged) – 1÷1023 \\ jako lokalne porty mogą być używane tylko przez uprzywilejowanego użytkownika (root / administrator), 
-  * //zarejestrowane// (polskie tłumaczenie?) (user / registered) – 1024 ÷ 49151, +  * //zarejestrowane// ((czy ktoś zna jakieś lepsze tłumaczenie na polski nazwy "user ports" lub "registered ports"?)) (user / registered) – 1024÷<html><small>49151</small></html> \\ mogą zostać zarejestrowane (tzn. przypisane do konkretnego zastosowania w rejestrze utrzymywanym przez IANA), 
-  * efemeryczne (dynamic / private / ephemeral) – 49152÷65535 – <html><small></html> używane kiedy program nie potrzebuje stałego numeru portu (czyli zwykle kiedy program nawiązuje połączenie; w implementacjach zwykle granica między user ports a ephemeral jest niższa)<html></small></html>.+  * efemeryczne (dynamic / private / ephemeral) – <html><small>49152</small></html>÷65535 \\ używane kiedy program nie potrzebuje stałego numeru portu (czyli zwykle kiedy program nawiązuje połączenie). \\ <html><small></html>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'' <html></small></html>.
      
 ===== Monitorowanie bieżących połączeń ===== ===== Monitorowanie bieżących połączeń =====
-  * ''netstat [-a|-l] [-t] [-u] [-p] [-n]'' (np. ''netstat -atupn'') +  * ''netstat [|-a|-l] [-t] [-u] [-p] [-n]'' (np. ''netstat -atupn'') 
-  * ''ss      [-a|-l] [-t] [-u] [-p] [-n]'' (np. ''ss -atupn'')+  * ''ss      [|-a|-l] [-t] [-u] [-p] [-n]'' (np. ''ss -atupn'')<html><span style="font-size:80%; line-height: 100%;"><pre> 
 +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 
 +</pre></span></html> 
   * ''/proc/net/(tcp|udp|…)'' (np. ''cat /proc/net/tcp'')   * ''/proc/net/(tcp|udp|…)'' (np. ''cat /proc/net/tcp'')
 +
 +<html><pre>
 +# netstat -atunp
 +Active Internet connections (servers and established)
 +Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
 +<span title="Program nasłuchujący na porcie 22 (porcie serwera SSH) na nowe połączenia TCP" style="background-color:rgba(0,255,0,0.2)">tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      13830/sshd</span>
 +tcp        0      0 <span title="Program nasłuchujący na IP 0.0.0.0 odbierze połączenia kierowane na dowolny adres IP tego komputera" style="background-color:rgba(255,0,255,0.2)">0.0.0.0</span>:25              0.0.0.0:*               LISTEN      <span title="PID i nazwa programu do którego należy połączenie" style="background-color:rgba(0,0,0,0.2)">28693/exim4</span>
 +tcp        0      0 <span title="Program nasłuchujący na IP 127.0.0.1 odbierze połączenia kierowane **tylko** na adres 127.0.0.1" style="background-color:rgba(255,0,255,0.2)">127.0.0.1</span>:631           0.0.0.0:*               LISTEN      26745/cupsd
 +<span title="Nawiązane połączenie TCP" style="background-color:rgba(0,0,255,0.15)">tcp        0    780 10.0.1.1:22             150.254.33.66:38126     ESTABLISHED 19424/sshd: usernam</span>
 +tcp        0      0 <span title="Adres lokalny: jedno z IP tego komutera i port 38596 (efemeryczny – najpewniej wylosowany przez system operacyjny przed nawiązywaniem połączenia)" style="background-color:rgba(255,0,255,0.2)">10.0.1.1:38596</span>          <span title="Adres zdalny: IP 150.254.30.199 i port https" style="background-color:rgba(255,0,255,0.2)">150.254.30.199:443</span>      ESTABLISHED 19481/weechat
 +<span title="tcp6 oznacza IPv6 i TCP – program nasłuchuje na dowolnym adresie (czyli ::)" style="background-color:rgba(0,255,0,0.2)">tcp6       0      0 :::22                   :::*                    LISTEN      13830/sshd</span>
 +<span title="połączenie UDP – może być zarówno klientem jak i serwerem" style="background-color:rgba(255,255,0,0.3)">udp        0      0 0.0.0.0:68              0.0.0.0:*                           14541/dhclient</span>
 +udp        0      0 10.0.1.1:53             0.0.0.0:*                           22173/named
 +<span title="przykład programu który jest klientem UDP" style="background-color:rgba(0,255,255,0.3)">udp      768      0 0.0.0.0:35722           0.0.0.0:*                           21533/snmpwalk</span>
 +</pre></html>
  
 ===== Testowanie łączności na warstwie aplikacji  ===== ===== Testowanie łączności na warstwie aplikacji  =====
Line 41: Line 73:
  
 <html><small></html> <html><small></html>
-Najpopularniejszy program netcat / nc ma wiele wersji, między innymi: + 
 +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://netcat.sourceforge.net/|GNU netcat]] (rozpoznawanie: ''man nc'' / ''man netcat'' przedstawia się jako GNU netcat)
-  * [[http://nc110.sourceforge.net/|"oryginalny" netcat]] (rozpoznawanie: ''man nc'' / ''man netcat''  ma kota w ASCII art) +  * [[http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/nc/|BSD netcat]] (rozpoznawanie: ''man nc'' / ''man netcat'' zawiera tekst BSD)
-  * [[http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/nc/|BSD netcat]] (rozpoznawanie: ''man nc'' / ''man netcat'' przedstawia się jako .*BSD netcat)+
   * [[http://www.busybox.net/downloads/BusyBox.html#nc|busybox nc]] (rozpoznawanie: używasz busyboxa)   * [[http://www.busybox.net/downloads/BusyBox.html#nc|busybox nc]] (rozpoznawanie: używasz busyboxa)
 <html></small></html> <html></small></html>
  
 ^     ^ <html><small></html>Serwer (GNU / "oryginalny" / bb) <html></small></html>   ^ Serwer (BSD)      ^  Klient                 ^ ^     ^ <html><small></html>Serwer (GNU / "oryginalny" / bb) <html></small></html>   ^ Serwer (BSD)      ^  Klient                 ^
-|  TCP|<html><small></html>''nc    -l -p 12345''             <html></small></html>   |''nc    -l 12345'' |''nc    10.0.0.1 12345'' |+|  TCP|<html><small></html>''nc    -l -p 12345''             <html></small></html>   |''nc    -l 12345'' |''nc    10.0.0.1 12345'' |
 |  UDP|<html><small></html>''nc -u -l -p 12345''             <html></small></html>   |''nc -u -l 12345'' |''nc -u 10.0.0.1 12345'' | |  UDP|<html><small></html>''nc -u -l -p 12345''             <html></small></html>   |''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]] Mniej popularny, bardziej rozbudowany (i wciąż rozwijany) [[http://www.dest-unreach.org/socat/|socat]]
 ^      ^ Serwer                        ^ Klient                                ^ ^      ^ Serwer                        ^ Klient                                ^
-|   TCP|''socat TCP-LISTEN:12345 -''   |''socat - TCP-CONNECT:10.0.0.1:12345'' | +|   TCP|''socat TCP-LISTEN:12345 STDIO''   |''socat STDIO TCP-CONNECT:10.0.0.1:12345'' | 
-|   UDP|''socat UDP-RECV:12345 -''     |''socat - UDP-SENDTO: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 -''   |''socat - UDP:10.0.0.1:12345''         | +|   UDP|''socat UDP-LISTEN:12345 STDIO''   |''socat STDIO UDP:10.0.0.1:12345''         | 
-|  SCTP|''socat SCTP-LISTEN:12345 -''  |''socat - SCTP-CONNECT: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'')
  
 <html><small></html>Socat nie rozróżnia wielkości liter, pozwala na skróty - np. ''udp-l'' jako ''udp-listen'' czy ''tcp'' jako ''tcp-connect'' \\ <html><small></html>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 (sic!), np. [::1]<html></small></html>+Adresy IPv6 podaje się w nawiasach kwadratowych, np. [::1]<html></small></html>
  
-Inne przykłady: +++++ Przykłady: | 
-  * Przykład HTTP: Wyślij na port 80 adresu www.put.poznan.pl (np.''nc www.put.poznan.pl 80'') tekst: <code>GET /+  * HTTP: Wyślij na port 80 adresu www.put.poznan.pl tekst: \\ (możesz też wykorzystać TCP+SSL: ''socat <nowiki>ssl:www.put.poznan.pl:443</nowiki> readline''): <html><pre style="margin-bottom: 0px">GET / HTTP/1.0
  
  
-</code> (pusta linia ma znaczenie) +</pre></html>(pusta linia ma znaczenie) 
-  * <html><small></html>Uruchom ''socat tcp-l:12345,fork -'', przyłącz kilka osób<html></small></html> +  * Uruchom ''socat tcp-l:12345,fork -'', przyłącz kilka osób 
-  * <html><small></html>''socat tcp-l:12345,reuseaddr -''<html></small></html> +  * Dowiedz się po co socat ma dwa argumenty: ''socat tcp-l:8080,fork tcp:fc.put.poznan.pl:80'' + http://localhost:8080 
-  * <html><small></html>Dowiedz się po co socat ma dwa argumenty: ''socat tcp-l:8080,fork tcp:fc.put.poznan.pl:80''<html></small></html> +  * FTP: Przez połączenie ''nc sunsite.icm.edu.pl 21'' wyślij: <code>USER anonymous
-  * <html><small></html> Przykład FTP: Przez połączenie ''nc sunsite.icm.edu.pl 21'' wyślij: <code>USER anonymous+
 PASS anonymous PASS anonymous
-EPSV</code>Dalej: otwórz połączenie na ten sam adres i otrzymany w odpowiedzi port \\ W pierwszym połączeniu wyślij: <code>LIST+EPSV</code>Dalej: otwórz połączenie na ten sam adres i otrzymany w odpowiedzi port \\ Przez pierwsze połączenie wyślij: <code>LIST
 QUIT</code> QUIT</code>
-  <html></small></html>+ 
 +++++
  
 ====== UDP ====== ====== UDP ======
Line 87: Line 121:
      
 Wielkość **datagramów** ograniczona do 64k (zwykle wysyła się mniejsze). Wielkość **datagramów** ograniczona do 64k (zwykle wysyła się mniejsze).
- 
-Realizuje dokładnie zadania warstwy transportu w modelu ISO/OSI 
  
 <html><small>Pozwala na używanie rozgłoszeń / multicastów</small></html> <html><small>Pozwala na używanie rozgłoszeń / multicastów</small></html>
Line 96: Line 128:
 ====== TCP ====== ====== 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]]] 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#page35|[1]]], psh,+  * flagi - syn, ack, fin, rst [[http://tools.ietf.org/html/rfc793#page-36|[1]]], psh,
   * numery sekwencyjne i numery potwierdzenia,   * numery sekwencyjne i numery potwierdzenia,
   * rozmiar okna,   * rozmiar okna,
   * opcje.   * opcje.
  
-  * **Segment** TCP +  * Pojedyncze wiadomości TCP nazywa się **segmentami** <html><small></html>(dlatego że są częścią strumienia)<html></small></html> 
-  * **Strumieniowy** – strumień (kolejnść!) danych +  * **Strumieniowy** – przenosi strumień danych – zachowuje kolejność danych, ale gubi podział danych na porcje 
-  * **Kontrola przepływu**, potwierdzenia, wielkość okna+  * **Kontrola przepływu**, potwierdzenia, skalowanie wielkości okna
   * Buforowanie   * Buforowanie
-  * **Połączeniowy** (punkt-punkt) i **stanowy** [[http://tools.ietf.org/html/rfc793#page-23|[1]]] [[http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation|[2]]]+  * **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,     * nawiązanie połączenia,
     * podtrzymywanie połączenia,     * podtrzymywanie połączenia,
     * zakończenie połączenia, półzakończenie,     * zakończenie połączenia, półzakończenie,
-    * zerwanie połączenia, +    * zerwanie połączenia. 
-    * [[http://www.cs.put.poznan.pl/jkonczak/tcp_flow.svg|normalny przebieg połączenia]].+  * **[[http://www.cs.put.poznan.pl/jkonczak/tcp_flow.svg|normalny przebieg połączenia]]**
  
-  * Relizuje zadania warstwy transportu i sesji (!) w modelu ISO/OSI, 
   * na jego podstawie zdefiniowana jest warstwa transportowa w modelu TCP/IP.   * na jego podstawie zdefiniowana jest warstwa transportowa w modelu TCP/IP.
      
-  * [extra] [[http://tools.ietf.org/html/rfc7323|window scale option, RTTM]], [[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]] +<html><small></html> [[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]] 
-  +<html></small></html> 
 Protokoły / programy używające TCP - "wszysto", np. http, ftp, ssh, ssl, … Protokoły / programy używające TCP - "wszysto", np. http, ftp, ssh, ssl, …
  
 ===== Inne protokoły warstwy transportu ===== ===== Inne protokoły warstwy transportu =====
-UDPlite\\ + 
-DCCP\\ +Poza TCP (75%-95%  ruchu) i UDP (reszta) można spotkać jeszcze na warstwie transportowej następujące protokoły ogólnego przeznaczenia: 
-SCTP+  * UDP-lite 
 +  * DCCP 
 +  * SCTP
sk1/transport.1462831787.txt.gz · Last modified: (external edit)