1 Plan wykładu 1. Model ISO/OSI warstwy modelu OSI transmisja w modelu OSI 2. Model TCP/IP protokół UDP protokół TCP 3. Połączenie i rozłączenie w TCP 4. Programowanie z wykorzystaniem gniazd.
2 Model OSI/ISO Model OSI (Open System Interconnection) opracowany przez ISO (International Organization for Standarization) opisuje przekształcenia informacji z postaci jaką widzi użytkownik do formatu nadającego się do użycia w sieci.
Model OSI/ISO Warstwy w modelu OSI aplikacji aplikacji prezentacji prezentacji Komputer A sesji transportowa komunikacja wirtualna sesji transportowa Komputer B sieciowa sieciowa łącza danych łącza danych fizyczna fizyczna 3
4 Warstwa aplikacji Interakcja z aplikacją użytkownika. Warstwa aplikacji świadczy usługę aplikacji sieciowej odpowiedzialnej za żądanie użytkownika przykłady: użytkownik wysyła email dostęp do usługi SMTP (Simple Mail Transfer Protocol), transfer pliku udostępniony protokół FTP (File Transfer Protocol), dostęp do strony http://www.if.uj.edu.pl rozwiązanie nazwy przez DNS a następnie żądanie dla protokołu HTTP (HyperText Transfer Protocol). Warstwa aplikacji jako jedyna komunikuje się bezpośrednio z oprogramowaniem użytkownika.
Warstwa prezentacji Usługi sieciowe niewidoczne dla użytkownika. Warstwa prezentacji przyjmuje pakiet z warstwy aplikacji i dokonuje wyboru poprawnej usługi sieciowej (urządzenia sieciowego) usługa serwera, usługa stacji roboczej (hosta). Ponadto warstwa prezentacji odpowiada za konwersje języka: konwersje pomiędzy różnymi wersjami i typami protokołów, konwersja zestawu znaków, szyfrowanie i kompresja danych, przekierowywanie żądań wejścia i wyjścia. Usługi aplikacji sieciowych są wywoływane przez użytkownika funkcjonują w warstwie aplikacji. Usługi sieciowe są niewidoczne dla użytkownika i funkcjonują w warstwie prezentacji. 5
6 Warstwa sesji Zarządzanie wirtualnym połączeniem sieciowym. Warstwa sesji ustanawia punkty kontrolne (checkpoint) w przesyłanych danych. W przypadku zerwania połączenia transfer jest ponawiany od ostatniego odebranego punktu kontrolnego. Ponieważ połączenie w warstwie sieci jest wirtualne, nie ma gwarancji dostarczenia pakietu.
7 Warstwa transportowa Sprawdzenie poprawności i kontrola przepływu danych. Warstwa transportowa dzieli dane na pakiety i przesyła je używając protokołu TCP (Transmission Control Protocol) lub UDP (User Datagram Protocol). TCP korzysta z pakietów potwierdzających. Dzięki temu dostarcza pakiety w sposób niezawodny. UDP oferuje jedynie kontrolę integralności pakietu. Dzięki temu jest zazwyczaj szybszy niż TCP.
8 Warstwa sieciowa Adresowanie i trasowanie w sieci. Warstwa sieciowa dodaje do pakietu adres nadawcy i odbiorcy. Dodatkowo dokonuje fragmentacji i składania pakietów. W warstwie sieciowej dokonywany jest także wybór trasy.
9 Warstwa łącza danych Przygotowanie danych do przesłania przez sieć. Warstwa łącza danych jest podzielona na dwie podwarstwy: kontroli łącza logicznego dodaje na końcu pakietu sumę kontrolną CRC, dzięki której można sprawdzić poprawność transmisji danych, kontroli dostępu do nośnika dopisuje do pakietu fizyczne adresy kart interfejsu sieciowego (MAC Media Access Control). Warstwa łącza danych zapewnia poprawną obsługę topologii sieci.
10 Warstwa fizyczna Umieszczenie danych w sieci. Warstwa fizyczna (sprzętowa) określa rodzaj przewodu (kabel koncentryczny, skrętka, światłowód, sieć bezprzewodowa), interfejsu sieciowego oraz sposób sformatowania i umieszczenia danych w sieci (czasy trwania impulsów elektrycznych, świetlnych itp.)
Transmisja w modelu OSI Nadawca: składanie + nagłówek + nagłówek aplikacji prezentacji Odbiorca: rozkładanie - nagłówek - nagłówek + nagłówek sesji - nagłówek + nagłówek + nagłówek + nagłówek i stopka transportowa sieciowa łącza danych - nagłówek - nagłówek - nagłówek i stopka + nagłówek fizyczna - nagłówek 11
12 Model OSI a model TCP/IP Model OSI Model TCP/IP warstwa aplikacji warstwa prezentacji warstwa sesji warstwa aplikacji (zastosowań) warstwa transportowa TCP UDP warstwa sieciowa warstwa łącza danych warstwa fizyczna IPv4, IPv6 sterownik programowy i sprzęt
13 Protokół UDP UDP (User Datagram Protocol). [RFC 768] Protokół obsługi bezpołączeniowej procesów użytkownika. Nie daje gwarancji, że pakiety (datagramy) dotrą do wyznaczonego celu. Może korzystać zarówno z IPv4 oraz IPv6.
14 Protokół TCP TCP (Transmission Control Protocol). [RFC 793] wykorzystuje połączenie między klientem i serwerem, zapewnia niezawodność przesyłu danych potwierdzenia, szacowanie czasu powrotu (round-trip time), ustala kolejność danych numeracja segmentów, steruje przepływem nadawca nie może spowodować przepełnienie bufora odbiorcy, zapewnia połączenie, które jest w pełni dwukierunkowe (full-duplex). Jest stosowany w większości internetowych programów użytkowych. Może korzystać zarówno z IPv4 oraz IPv6.
Ustanawianie połączenia TCP Uzgadnianie trójfazowe (three-way handshake). 1. Serwer przygotowuje się na przyjęcie połączenia otwarcie bierne. 2. Klient rezerwuje gniazdo za pomocą a następnie rozpoczyna otwarcie aktywne - TCP wysyła segment danych SYN (synchronize). 3. Serwer wysyła własny segment SYN zawierający potwierdzenie ACK (acknowledgment). 4. Klient potwierdza przyjęcie segmentu SYN od serwera. klient serwer SYN J SYN K J+1 potwierdzenie Potwierdzenie K+1 15
Zakończenie połączenia TCP 1. Jeden punkt końcowy inicjuje zakończenie połączenia zamknięcie aktywne. TCP wysyła segment FIN. 2. Drugi punkt wykonuje zamknięcie bierne TCP potwierdza odbiór FIN. 3. Po pewnym czasie drugi punkt zamyka swoje połączenie TCP wysyła segment FIN. 4. Pierwszy punkt potwierdza odbiór segmenty FIN. pierwszy punkt Potwierdzenie N+1 drugi punkt FIN M M+1 Potwierdzenie FIN N 16
17 Numery portów Numerami portów zarządza IANA (Internet Assigned Numbers Authority). Wyróżniamy trzy grupy portów. porty ogólne (well-known), numery z zakresu 0 1023, np.: HTTP 80, FTP 21, SMTP 25. porty zarejestrowane (registered), numery 1024 49151. np.: X-Windows 6000-6063, MySQL 3036. porty dynamiczne 49152 65535, nie posiadają przyporządkowania do usług.
18 Programowanie z wykorzystaniem gniazd Utworzenie gniazda: int socket (int domain, int type, int protocol) domain rodzina protokołów używana do komunikacji w sieci, zdefiniowana w pliku <sys/socket.h> np.: PF_UNIX, PF_LOCAL, PF_INET, PF_INET6, PF_IPX. type rodzaj komunikacji np.: SOCK_STREAM, SOCK_DGRAM, SOCK_RDM. protocol protokół transmisji wykorzystywany przez gniazdo. Wartość zwracana: deskryptor gniazda lub -1 w przypadku błędu. Pliki nagłówkowe <sys/socket.h>, <sys/types.h>.
19 Programowanie z wykorzystaniem gniazd Połączenie poprzez gniazdo: int connect (int sock, const struct sockaddr *serv_addr, int len) sock deskryptor gniazda uzyskany funkcją socket. serv_addr wskaźnik do struktury opisującej punk docelowy połączenia. len długość struktury wskazywanej przez serv_addr. Wartość zwracana: 0 w przypadku powodzenia, -1 w przypadku błędu. Pliki nagłówkowe <sys/socket.h>, <sys/types.h>.
20 Programowanie z wykorzystaniem gniazd Zamknięcie połączenia (gniazda): int shutdown (int sock, int how) sock deskryptor gniazda uzyskany funkcją socket. how sposób zamknięcia połączenia np.: SHUT_RD, SHUT_WR, SHUT_RDWR. Wartość zwracana: 0 w przypadku powodzenia, -1 w przypadku błędu. Pliki nagłówkowe <sys/socket.h>.
Programowanie z wykorzystaniem gniazd #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <errno.h> #include <string.h> int connectsock(char *host, char *service, char *protocol){ struct hostent *phe; struct servent *pse; struct protoent *ppe; struct sockaddr_in sin; int type, s; bzero((char*) &sin, sizeof(sin)); sin.sin_family = AF_INET; 21
22 Programowanie z wykorzystaniem gniazd if (pse = getservbyname(service, protocol)){ sin.sin_port = pse->s_port; }else if ((sin.sin_port = htons((u_short)atoi(service)))==0){ fprintf(stderr, "nieznana usluga: %s\n", service); return -1; } if (phe = gethostbyname(host)){ bcopy(phe->h_addr, (char *) &sin.sin_addr, phe->h_length); }else if ((sin.sin_addr.s_addr = inet_addr(host))==inaddr_none){ fprintf(stderr, "nieznany host: %s\n", host); return -1; } if ((ppe = getprotobyname(protocol))==null){ fprintf(stderr, "nieznany protokol: %s\n", protocol); return -1; }
23 Programowanie z wykorzystaniem gniazd if (strcmp(protocol, "udp")==0){ type = SOCK_DGRAM; }else{ type = SOCK_STREAM; } if ((s = socket(pf_inet, type, ppe->p_proto))<0){ fprintf(stderr, "nieznany protokol: %s\n", protocol); return -1; } } if (connect(s, (struct sockaddr *)&sin, sizeof(sin))<0){ fprintf(stderr, "nie moge ustanowic polaczenia z %s:%s %s\n", host, service, strerror(errno)); return -1; } return s;
Programowanie z wykorzystaniem gniazd #define LINELEN 100 int main(int argc, char **argv){ int s, n; char buf[linelen+1]; } if (argc<4){ printf("sposob uzycia: client serwer serwis protokol\n"); return 0; } s = connectsock(argv[1], argv[2], argv[3]); if(s<0) return 0; while ((n=read(s, buf, LINELEN))>0){ buf[n] = '\0'; fputs(buf, stdout); } if (shutdown(s, SHUT_RDWR)<0){ fprintf(stderr, "problem z zamknieciem polaczenia: %s\n", strerror(errno)); return 0; } return 1; 24
25 Programowanie z wykorzystaniem gniazd Przykładowe uruchomienie programu: client theta.uoks.uj.edu.pl daytime tcp Wynik działania: Tue Oct 14 15:27:25 2008 lista serwisów (usług, portów): /etc/services lista protokołów: /etc/protocols
Programowanie z wykorzystaniem gniazd - Java Pakiet (biblioteka): java.net Wybrane klasy: Socket reprezentuje gnaizdo wykorzystywane do transmisji strumieniowej (TCP), istnieje wersja do transmisji szyfrowanej SSLSocket; DatagramSocket gniazdo do transmisji datagramowej (UDP); InetAddress adres IP, istnieją dwie klasy potomne: Inet4Address i Inet6Address; URL Uniform Resource Locator, identyfikator zasobu w sieci opisujący sposób dostępu do niego np. http://www.if.uj.edu.pl/images/misc/ujlogo.gif, w ogólnym wypadku stosuje się klasę URI Uniform Resource Identyficator. 26
Programowanie z wykorzystaniem gniazd - Java import java.io.inputstream; import java.net.socket; public class Client { private static final int LINELEN = 100; public static void main(string[] args) { byte[] buffer = new byte[client.linelen]; if (args.length<2) System.out.println("wywolanie java Client serwer port"); try { Socket sock = new Socket(args[0], Integer.parseInt(args[1])); InputStream in = sock.getinputstream(); while (in.read(buffer) > 0) System.out.println(new String(buffer)); sock.close(); } catch (Exception e) { e.printstacktrace(); } } } Wywołanie programu: javac Client.java java Client theta.uoks.uj.edu.pl 13 27
Programowanie z wykorzystaniem gniazd - C# using System; using System.IO; using System.Net.Sockets; public class socketexample { public static void Main() { try { TcpClient tcpclnt = new TcpClient(); tcpclnt.connect("theta.uoks.uj.edu.pl",13); Stream stm = tcpclnt.getstream(); byte[] bb = new byte[100]; int k = stm.read(bb,0,100); for (int i = 0; i<k; i++) Console.Write(Convert.ToChar(bb[i])); tcpclnt.close(); } catch (Exception e) { Console.WriteLine(e.StackTrace); } } } Wywołanie programu: mcs socketexample.cs mint socketexample.exe lub mono socketexample.exe 28
29 Programowanie z wykorzystaniem gniazd Perl: use IO::Socket; my $sock = new IO::Socket::INET (PeerAddr => 'theta.uoks.uj.edu.pl', PeerPort => '13', Proto => 'tcp', ); die "Nie można utworzyc gniazda: $!\n" unless $sock; while(<$sock>) print $_; close($sock); PHP: <?php $socket = socket_create(af_inet, SOCK_STREAM, SOL_TCP); $result = socket_connect($socket, 'theta.uoks.uj.edu.pl', '13'); $out = socket_read($socket, 1024); echo $out; socket_close($socket);?>
30 Programowanie z wykorzystaniem gniazd Python: import socket s = socket.socket ( socket.af_inet, socket.sock_stream ) s.connect(("theta.uoks.uj.edu.pl", 13)) data = s.recv(1024) print data s.close() Ruby: require 'socket' print TCPSocket.open("theta.uoks.uj.edu.pl", "daytime").read
31 Podsumowanie W modelu TCP/IP dostępne są dwa protokoły warstwy transportowej: TCP i UDP. Ruch kierowany jest za pomocą protokołu IP (warstwa sieciowa). Korzystanie z sieci z poziomu języków programowania przypomina operacje I/O (pliki, potoki). Jest to możliwe dzięki implementacji przez te języki interfejsu gniazd.