Narzędzia użytkownika

Narzędzia witryny


sk1:transport

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
sk1:transport [2016/05/10 00:09]
jkonczak
sk1:transport [2018/05/13 23:42] (aktualna)
jkonczak [TCP]
Linia 3: Linia 3:
 ====== Protokoły warstwy transportowej ====== ====== Protokoły warstwy transportowej ======
  
-Przypomnienieską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
Linia 11: Linia 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:
Linia 25: Linia 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 ​ =====
Linia 41: Linia 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 ======
Linia 87: Linia 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>​
Linia 96: Linia 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 · ostatnio zmienione: 2016/05/10 00:09 przez jkonczak