Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk1:transport [2018/05/10 13:12] jkonczak [Monitorowanie bieżących połączeń] |
sk1:transport [2018/05/13 23:42] (aktualna) jkonczak [TCP] |
||
---|---|---|---|
Linia 3: | Linia 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 | ||
Linia 11: | Linia 11: | ||
===== Port, połączenie ===== | ===== 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.\\ | + | 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 33: | Linia 39: | ||
===== 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'')<html><span style="font-size:80%; line-height: 100%;"><pre> | + | * ''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: | Przełączniki dla netstat / ss: | ||
┌ (domyślnie) tylko już nawiązane połączenia | ┌ (domyślnie) tylko już nawiązane połączenia | ||
Linia 42: | Linia 48: | ||
└ -u połączenia protokołu UDP | └ -u połączenia protokołu UDP | ||
-p nazwa i pid programu do którego należy połączenie | -p nazwa i pid programu do którego należy połączenie | ||
- | -n pokazywanie wszystkich wartości numerycznie, np. '21' zamiast 'ssh' | + | -n pokazywanie wszystkich wartości numerycznie, np. '22' zamiast 'ssh' |
Więcej: netstat -h / ss -h | Więcej: netstat -h / ss -h | ||
</pre></span></html> | </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 52: | 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 \\ Przez pierwsze połączenie 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 105: | 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, | ||
Linia 123: | Linia 146: | ||
* na jego podstawie zdefiniowana jest warstwa transportowa w modelu TCP/IP. | * na jego podstawie zdefiniowana jest warstwa transportowa w modelu TCP/IP. | ||
| | ||
- | <html><small></html> [[https://pl.wikipedia.org/wiki/Algorytm_Nagle'a|Algorytm Nagle'a]][[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> | <html></small></html> | ||