May 18, 2025, Sunday, 137

SK Zadanie 4

From Łukasz Graczykowski

(Difference between revisions)
Jump to: navigation, search
(Created page with " == Gniazda sieciowe w BASH == === Gniazda sieciowe === Gniazdo (ang. socket) jest to abstrakcyjne pojęcie reprezentujące dwukierunkowy punkt końcowy sieciowego połączenia ...")
Line 1: Line 1:
 +
== Protokół TCP ==
 +
Protokół TCP jest jedną z możliwych implementacji warstwy transportu w modelu OSI, ma on następujące cechy:
 +
 +
* jeden-do-jeden
 +
Pozwala na uwtorzenie dwukierunkowego kanału danych między dwoma hostami w sieci.
 +
 +
* niezawodność (reliability)
 +
Dane wysłane za pomocą protokołu TCP muszą dotrzeć do systemu docelowego. Jeśli nie jest możliwe dostarczenie danych (np. z powodu braku łączności z internetem systemu docelowego) implementacja protokołu TCP musi zwrócić błąd.
 +
 +
* kontrolę błędów
 +
Dane wysłane przez protokół TCP posiadają sumy kontrolne, które pozwalają wykryć błędy w transmisji.
 +
 +
* kolejność
 +
Jeśli jakaś wiadomość TCP jest wysłana jako wiele oddzielnych pakietów IP, wiadomość dotrze w tej samej kolejności w jakiej była wysłana.
 +
 +
===Implementacja TCP===
 +
Na poziomie protokołu IP operuje się pojedyńczymi pakietami, pakiety te mogą po drodze między dwoma systemami się zawieruszyć.
 +
 +
Na poziomie protokolu TCP operuje się strumiueniami danych, strumień tych danych jest niezawodny.
 +
 +
W praktyce programowanie oparte na strumieniach (znane z basha) i programowanie TCP nie różni się zbytnio.
 +
 +
===Pojęcie portu===
 +
Adresy IP jednoznacznie idenyfikują komputery, my chcielibyśmy jeszcze móc zaadresować kilka usług na jednym komputerze (jest to nie możliwe na poziomie protokołu IP!). Dlatego TCP (oraz UDP) używają dodatkowego numeru zwanego numerem portu.
 +
 +
Na komputerze docelowym numer portu jest najczęściej powiązany z usługą z jaką komputer chce się połączyć (port 80 to HTTP) – pełna lista portów dostępna jest w Internecie.
 +
 +
Na komputerze inicjującym port jest wybierany losowo.
 +
 +
===Handshake TCP===
 +
Połączenie TCP jest jednoznacznie identyfikowane przez cztery liczby:
 +
 +
* destination-port
 +
Numer portu na komputerze do którego jest nawiązywane połączenie.
 +
 +
* destination-host
 +
Numer IP hosta do którego jest nawiązywane połączenie.
 +
 +
* source-port
 +
Numer portu na komputerze z którego jest nawiązywane połączenie.
 +
 +
* source-host
 +
Numer IP hosta z którego jest nawiązywane połączenie.
 +
 +
By nawiązać połączenie należy wymienić tzw. handshake TCP, polega on na wysłaniu trzech pakietów:
 +
 +
* SYN
 +
 +
Wysyła go klient, zawiera on losową liczbę x.
 +
 +
* SYN+ACK
 +
 +
Wysyła go serwer, zawiera on losową liczbę y, oraz liczbę x+1.
 +
 +
* ACK
 +
 +
Wysyła go klient zawiera on liczbę y+1.
 +
 +
===Narzut TCP===
 +
Użycie protokółu TCP powoduje powstanie pewnego narzutu, którego oszacowanie jest trudny, a sam rozmiar narzutu zależny od rozmiaru poszczególnych pakietów.
 +
 +
Dla długich połączeń narzut TCP jest w granicach 5%, dla wysłania pojedyńczej wiadomości może wynosić kilkaset procent (koszt wykonania handshake).
== Gniazda sieciowe w BASH ==
== Gniazda sieciowe w BASH ==

Revision as of 12:33, 10 November 2016

Contents

Protokół TCP

Protokół TCP jest jedną z możliwych implementacji warstwy transportu w modelu OSI, ma on następujące cechy:

  • jeden-do-jeden

Pozwala na uwtorzenie dwukierunkowego kanału danych między dwoma hostami w sieci.

  • niezawodność (reliability)

Dane wysłane za pomocą protokołu TCP muszą dotrzeć do systemu docelowego. Jeśli nie jest możliwe dostarczenie danych (np. z powodu braku łączności z internetem systemu docelowego) implementacja protokołu TCP musi zwrócić błąd.

  • kontrolę błędów

Dane wysłane przez protokół TCP posiadają sumy kontrolne, które pozwalają wykryć błędy w transmisji.

  • kolejność

Jeśli jakaś wiadomość TCP jest wysłana jako wiele oddzielnych pakietów IP, wiadomość dotrze w tej samej kolejności w jakiej była wysłana.

Implementacja TCP

Na poziomie protokołu IP operuje się pojedyńczymi pakietami, pakiety te mogą po drodze między dwoma systemami się zawieruszyć.

Na poziomie protokolu TCP operuje się strumiueniami danych, strumień tych danych jest niezawodny.

W praktyce programowanie oparte na strumieniach (znane z basha) i programowanie TCP nie różni się zbytnio.

Pojęcie portu

Adresy IP jednoznacznie idenyfikują komputery, my chcielibyśmy jeszcze móc zaadresować kilka usług na jednym komputerze (jest to nie możliwe na poziomie protokołu IP!). Dlatego TCP (oraz UDP) używają dodatkowego numeru zwanego numerem portu.

Na komputerze docelowym numer portu jest najczęściej powiązany z usługą z jaką komputer chce się połączyć (port 80 to HTTP) – pełna lista portów dostępna jest w Internecie.

Na komputerze inicjującym port jest wybierany losowo.

Handshake TCP

Połączenie TCP jest jednoznacznie identyfikowane przez cztery liczby:

  • destination-port

Numer portu na komputerze do którego jest nawiązywane połączenie.

  • destination-host

Numer IP hosta do którego jest nawiązywane połączenie.

  • source-port

Numer portu na komputerze z którego jest nawiązywane połączenie.

  • source-host

Numer IP hosta z którego jest nawiązywane połączenie.

By nawiązać połączenie należy wymienić tzw. handshake TCP, polega on na wysłaniu trzech pakietów:

  • SYN

Wysyła go klient, zawiera on losową liczbę x.

  • SYN+ACK

Wysyła go serwer, zawiera on losową liczbę y, oraz liczbę x+1.

  • ACK

Wysyła go klient zawiera on liczbę y+1.

Narzut TCP

Użycie protokółu TCP powoduje powstanie pewnego narzutu, którego oszacowanie jest trudny, a sam rozmiar narzutu zależny od rozmiaru poszczególnych pakietów.

Dla długich połączeń narzut TCP jest w granicach 5%, dla wysłania pojedyńczej wiadomości może wynosić kilkaset procent (koszt wykonania handshake).

Gniazda sieciowe w BASH

Gniazda sieciowe

Gniazdo (ang. socket) jest to abstrakcyjne pojęcie reprezentujące dwukierunkowy punkt końcowy sieciowego połączenia pomiędzy odległymi procesami. Dwukierunkowe, gdyż umożliwia zarówno (1) wysyłanie i (2) odbieranie danych.

Podstawowe właściwości każdego gniazda:

  • typ gniazda, związany z protokołem wymiany danych (np. Stream socket wykorzystujący TCP lub Datagram socket wykorzystujący UDP)
  • adres (np. adres IP)
  • opcjonalny numer portu

Procesy które zapewniają różne usługi przy użyciu gniazd nazywamy serwerami. W przypadku takich procesów stosowane są gniazda w trybie nasłuchiwania: czekają i nasłuchują, kiedy podłączy się do nich proces klienta.

Narzędzie telnet (klient)

Telnet jest narzędziem pozwalającym wykonywać połączenia TCP z serwerem. Jest więc programem typu “klient”.

Składnia najprostrzego połączenia:

telnet ADRES_IP PORT

Czyli by połączyć się do serwera google.pl serwującego strony internetowe (standardowym portem HTTP jest port 80), możemy napisać w terminalu:

telnet google.pl 80

Przykład: by uzyskać stronę internetową serwowaną przez serwer musimy wysłać zapytanie HTTP:

GET / HTTP/1.0

(oraz nacisnąć ENTER 2 razy!)

Alternatywnie, by połączyć się z gniazdem na własnym komputerze zamiast adresu IP można użyć słowa localhost.

Narzędzie ncat (serwer)

By tworzyć serwer (gniazdo nasłuchujące) na własnym komputerze można użyć programu ncat.

Przykładowo:

ncat -l 8000 -k -e skrypt.sh

tworzy serwer na porcie 8000, serwer ten dla każdego przychodzącego połączenia wykonuje skrypt skrypt.sh.

Możemy sprawdzić ich działanie za pomocą połączenia telnet.

Zadanie 1

Stworzyć serwer działający na porcie 8000, który wyśle słowo HELLO! do każdego procesu, który się do niego podłączy (należy napisać skrypt hello.sh oraz użyć polecenia ncat). Należy przetestować jego działanie przy użyciu programu telnet.