Protokół UDP UDP (User Datagram Protocol) . [

Podobne dokumenty
Programowanie z wykorzystaniem gniazd

Usługa TIME. 77 8A. Usługa jest dostępna zarówno za pośrednictwem TCP i UDP

Model OSI/ISO. Komputer B. Warstwy w modelu OSI aplikacji. aplikacji. prezentacji Komputer A. prezentacji. sesji. sesji. komunikacja wirtualna

Plan wykładu. 1. Poczta elektroniczna protokół SMTP, protokół POP, protokół IMAP. 2. Zdalna praca - Telnet. 3. Transfer plików usługa FTP.

Podstawowe typy serwerów

Podstawowe typy serwerów

Serwer współbieżny połączeniowy

Programowanie sieciowe

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

JAVA I SIECI. MATERIAŁY:

Literatura uzupełniająca: W. Richard Stevens, Programowanie zastosowań sieciowych w systemie Unix WNT 1998

Programowanie współbieżne i rozproszone

Przykłady interfejsu TCP i UDP w Javie

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

1. Model klient-serwer

Gniazda BSD. komunikacja bezpołączeniowa

Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła

MODEL WARSTWOWY PROTOKOŁY TCP/IP

Architektura typu klient serwer: uproszczony klient POP3

Dr Michał Tanaś(

Programowanie Sieciowe 1

Sieci komputerowe. Zajęcia 3 c.d. Warstwa transportu, protokoły UDP, ICMP

Gniazda BSD implementacja w C#

Przykład usługi internetowej

Architektura aplikacji sieciowych. Architektura klient-serwer

URL. Budowa URL (ang. Uniform Resource Locator): working#downloading

Java wybrane technologie

PROTOKOŁY WARSTWY TRANSPORTOWEJ

Wykład 3 / Wykład 4. Na podstawie CCNA Exploration Moduł 3 streszczenie Dr inż. Robert Banasiak

1.1 Przykład znajdowanie liczb pierwszych leżących w zadanym zakresie, tryb bezpołączeniowy

Sieci komputerowe. Wykład 5: Warstwa transportowa: TCP i UDP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Java a dost p do Internetu.

Java Enterprise Edition spotkanie nr 1 (c.d.) JavaMail

Gniazda UDP. Bartłomiej Świercz. Łódź, 3 kwietnia Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda UDP

Protokoły sieciowe - TCP/IP

Adresy URL. Zaawansowane technologie Javy 2019

ZESZYTY ETI ZESPOŁU SZKÓŁ W TARNOBRZEGU Nr 1 Seria: Teleinformatyka 2013

Iteracyjny serwer TCP i aplikacja UDP

Gniazda BSD. Procesy w środowisku sieciowym. Gniazda podstawowe funkcje dla serwera. Gniazda podstawowe funkcje dla klienta

Programowanie przy użyciu gniazdek

1. FTP 2. SMTP 3. POP3

Komunikacja sieciowa - interfejs gniazd

Java programowanie w sieci. java.net RMI

Laboratorium 3.4.3: Usługi i protokoły

Programowanie sieciowe

Programowanie w języku Java

Komunikacja z użyciem gniazd aplikacje klient-serwer

Krótkie wprowadzenie do korzystania z OpenSSL

Obiekty sieciowe - gniazda Komputery w sieci Internet komunikują się ze sobą poprzez:

PROTOKOŁY OBSŁUGI POCZTY ELEKTRONICZNEJ

2. Interfejs gniazd Gniazdo

Sieci Komputerowe. Protokół POP3. Protokół IMAP4 Internet Mail Access Protocol version 4. dr Zbigniew Lipiński

DR INŻ. ROBERT WÓJCIK DR INŻ. JERZY DOMŻAŁ

Gniazda surowe. Bartłomiej Świercz. Łódź,9maja2006. Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda surowe

Sieci komputerowe Warstwa aplikacji

B.B. Połączenie kończy polecenie exit.

Bezpieczeństwo poczty elektronicznej

Lab5 - Badanie protokołów pocztowych

Programowanie rozproszone w języku Java

Sieci komputerowe. Wykład 7: Transport: protokół TCP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Platformy Programistyczne Zagadnienia sieciowe i wątki

Sieci komputerowe. Wykład dr inż. Łukasz Graczykowski

Sieci komputerowe i bazy danych

Programowanie w Internecie

pasja-informatyki.pl

Stos protokołów TCP/IP (ang. Transmission Control Protocol/Internet Protocol)

TCP/IP. Warstwa aplikacji. mgr inż. Krzysztof Szałajko

Model warstwowy Warstwa fizyczna Warstwa łacza danych Warstwa sieciowa Warstwa transportowa Warstwa aplikacj. Protokoły sieciowe

Budowa wiadomości SMTP. autorzy: Aleksandra Wichert Marcin Żurowski

System operacyjny UNIX Internet. mgr Michał Popławski, WFAiIS

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ mlew@ippt.gov.pl ]

SOAP i alternatywy. 1. WSDL. 2. Protokoły tekstowe XML-RPC. JSON-RPC. SOAPjr. 3. Protokoły binarne Google Protocol Bufers. Apache Thrift.

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Sieci komputerowe - Protokoły warstwy transportowej

Bazy Danych i Usługi Sieciowe

Programowanie aplikacji w architekturze Klient-Serwer - UDP

Stos TCP/IP. Warstwa aplikacji cz.2

Sieci komputerowe. Protokoły warstwy transportowej. Wydział Inżynierii Metali i Informatyki Przemysłowej. dr inż. Andrzej Opaliński.

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

SOAP. Autor: Piotr Sobczak

Wybrane działy Informatyki Stosowanej

Instytut Teleinformatyki

Aplikacje RMI

SMTP co to takiego? SMTP Simple Mail Transfer Protocol (Protokół Prostego Przesyłania Poczty) RFC 2821

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Programowanie sieciowe

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Programowanie Sieciowe 1

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej

Aplikacja Sieciowa. Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project

1. Model klient-serwer

Laboratorium - Przechwytywanie i badanie datagramów DNS w programie Wireshark

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Technologie cyfrowe semestr letni 2018/2019

Klient-Serwer Komunikacja przy pomocy gniazd

Programowanie aplikacji równoległych i rozproszonych. Wykład 4

Serwery współbieżne c.d.

TCP - receive buffer (queue), send buffer (queue)

Stos TCP/IP Warstwa transportowa Warstwa aplikacji cz.1

Transkrypt:

1 Plan wykładu 1. Model TCP/IP protokoły warstwy transportowej: UDP, TCP, połączenie i rozłączenie w TCP. 2. Programowanie z wykorzystaniem gniazd. usługai DATETIME, TIME, ECHO. 3. Popularne aplikacje TCP/IP poczta elektroniczna poczta elektroniczna: protokoły SMTP, POP, IMAP.

2 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.

3 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 Potwierdzenie K+1 serwer SYN J SYN K J+1 potwierdzenie 4

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 drugi punkt FIN M M+1 Potwierdzenie FIN N Potwierdzenie N+1 5

6 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.

7 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>.

8 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>.

9 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; 10

11 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;

12 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; 13

14 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. 15

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 16

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 17

18 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);?>

19 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

20 Usługa TIME Usługa TIME [RFC 868] służy do synchronizacji czasu pomiędzy komputerami w sieci. Czas jest przesyłany w postaci 32 bitowej liczby całkowitej określającej liczbę sekund od 1 stycznia 1900 roku np. C5 1B 77 8A. Usługa jest dostępna zarówno za pośrednictwem TCP i UDP poprzez port 37. Inne usługi wykorzystywane do synchronizacji czasu to NTP (Network Time Protocol) [RFC 1305] i jego odmiana SNTP (Simple Network Time Protocol) [RFC 1769].

Klient usługi TIME (UDP) #include "connectsock.c" #define UNIXEPOCH 2208988800ul int main(int argc, char **argv){ int s; char msg[] = "ktora godzina?"; time_t now; if ((s = connectsock(argv[1], "time", "udp"))<0) return 0; write(s, msg, strlen(msg)); if (read(s, (char *)&now, sizeof(now))<0) return 0; else{ now = ntohl((u_long)now); now -= UNIXEPOCH; printf("%s\n", ctime(&now)); if (shutdown(s, SHUT_RDWR)<0) return 0; return 1; 21

22 Klient usługi TIME (TCP) import java.io.inputstream; import java.io.outputstream; import java.net.socket; import java.util.date; public class TimeTCPClient { private static final int PORT_TIME = 37; private static final String QUERY = "Ktora godzina?"; private static final int LINELEN = 5; private static final long UNIXEPOCH = 2208988800L; public static void main(string[] args) { try { byte[] buffer = new byte[linelen]; Socket sock = new Socket(args[0], PORT_TIME); OutputStream os = sock.getoutputstream(); InputStream is = sock.getinputstream(); os.write(query.getbytes());

Klient usługi TIME (TCP) long time = 0; int l, i, j; for (l=0; l<4; l+=i){ i = is.read(buffer); for(j=0; j<i; j++){ time *= 256; time += (buffer[j] & 255); time -= UNIXEPOCH; time *= 1000; Date d = new Date(time); System.out.println(d); sock.close(); catch (Exception e) { e.printstacktrace(); 23

Klient usługi TIME (UDP) import java.net.datagrampacket; import java.net.datagramsocket; import java.net.inetaddress; import java.util.date; public class TimeUDPClient { private static final int PORT_TIME = 37; private static final String QUERY = "Ktora godzina?"; private static final int LINELEN = 5; private static final long UNIXEPOCH = 2208988800L; public static void main(string[] args) { try { byte[] buffer = new byte[linelen]; DatagramSocket sock = new DatagramSocket(); DatagramPacket dp = new DatagramPacket( QUERY.getBytes(), 0, QUERY.length(), InetAddress.getByName(args[0]), PORT_TIME); 24

Klient usługi TIME (UDP) sock.send(dp); dp = new DatagramPacket(buffer, LINELEN); sock.receive(dp); long time = 0; int i; for (i=0; i<4; i++){ time *= 256; time += (buffer[i] & 255); time -= UNIXEPOCH; time *= 1000; Date d = new Date(time); System.out.println(d); sock.close(); catch (Exception e) { e.printstacktrace(); 25

26 Usługa ECHO Usługa ECHO [RFC 347] odsyła klientowi wszystkie otrzymywane od niego dane. Interakcja trwa dopóki klient nie zakończy transmisji. Usługa ECHO jest wykorzystywana głównie do celów diagnostycznych, podobnie jak komenda ping. W przeciwieństwie do niej korzysta z protokołu TCP lub UDP. Do komunikacji wykorzystuje port 7.

Klient usługi ECHO (TCP) int main(int argc, char **argv){ int s, i, n1, n2; char buf[linelen+1]; if ((s = connectsock(argv[1], echo, tcp ))<0) return 0; for(i=2; i<argc; i++){ n1 = write(s, argv[i], strlen(argv[i])); while (n1>0 && (n2=read(s, buf, LINELEN))>0){ buf[n2] = '\0'; n1 -= n2; fputs(buf, stdout); fputs( \n, stdout); if (shutdown(s, SHUT_RDWR)<0) return 0; return 1; 27

Klient usługi ECHO (UDP) int main(int argc, char **argv){ int s, i, n; char buf[linelen+1]; if ((s = connectsock(argv[1], echo, udp ))<0) return 0; for(i=2; i<argc; i++){ write(s, argv[i], strlen(argv[i])); if ((n=read(s, buf, LINELEN))>0){ buf[n] = '\0'; fputs(buf, stdout); fputs( \n, stdout); if (shutdown(s, SHUT_RDWR)<0) return 0; return 1; 28

Klient usługi ECHO (TCP) import java.io.inputstream; import java.io.outputstream; import java.net.socket; public class EchoTCPClient { private static final int PORT_ECHO = 7; private static final int LINELEN = 100; public static void main(string[] args) { byte[] buffer = new byte[linelen]; if (args.length<2){ System.out.println("wywolanie java EchoTCPClient serwer argument1 argument2..."); return; try { Socket sock = new Socket(args[0], PORT_ECHO); OutputStream os = sock.getoutputstream(); InputStream in = sock.getinputstream(); 29

30 Klient usługi ECHO (TCP) int i, k, j; for (i=1; i<args.length; i++){ os.write(args[i].getbytes()); for(j=0; j<args[i].length(); j+=k){ k = in.read(buffer); System.out.print(new String(buffer, 0, k)); System.out.println(); sock.close(); catch (Exception e) { e.printstacktrace();

Klient usługi ECHO (UDP) public class EchoUDPClient { private static final int PORT_ECHO = 7; private static final int LINELEN = 100; public static void main(string[] args) { try { byte[] buffer = new byte[linelen]; DatagramSocket sock = new DatagramSocket(); DatagramPacket dp; for (int i=1; i<args.length; i++){ dp = new DatagramPacket(args[i].getBytes(), 0, args[i].length(), InetAddress.getByName(args[0]), PORT_ECHO); sock.send(dp); dp = new DatagramPacket(buffer, LINELEN); sock.receive(dp); System.out.println(new String(dp.getData(), 0, dp.getlength())); sock.close(); catch (Exception e) { e.printstacktrace(); 31

32 Poczta elektroniczna 1. Wysyłanie wiadomości e-mail protokół SMTP (Simple Mail Transfer Protocol). 2. Odbiór wiadomości e-mail propokół POP (Post Office Protocol) lub IMAP (Internet Mail Access Protocol). nadawca serwer SMTP Serwer SMTP oraz POP lub IMAP adresat

Protokół SMTP Protokół SMTP [RFC 2821, 821, 2554] jest wykorzystywany do wysyłania wiadomości e-mail. Port 25. Przykładowe połączenie: [serwer] 220 theta.uoks.uj.edu.pl ESMTP Sendmail 8.13.1/8.13.1; Mon, 11 Oct 2004 10:19:30 +0200 (CEST) [klient] EHLO [127.0.0.1]<CRLF> [serwer] 250-theta.uoks.uj.edu.pl Hello rhamnus.if.uj.edu.pl [149.156.74.158], pleased to meet you 250-ENHANCEDSTATUSCODES... 250-AUTH LOGIN PLAIN... 250 HELP [klient] AUTH PLAIN <BASE64(login<0x00>hasło)><CRLF> 33

Kodowanie Base64 Alfabet Base64 [RFC 1521] 0 A 8 I 16 Q 24 Y 32 g 40 o 48 w 56 4 1 B 9 J 17 R 25 Z 33 h 41 p 49 x 57 5 2 C 10 K 18 S 26 a 34 i 42 q 50 y 58 6 3 D 11 L 19 T 27 b 35 j 43 r 51 z 59 7 4 E 12 M 20 U 28 c 36 k 44 s 52 0 60 8 5 F 13 N 21 V 29 d 37 l 45 t 53 1 61 9 6 G 14 O 22 W 30 e 38 m 46 u 54 2 62 + 7 H 15 P 23 X 31 f 39 n 47 v 55 3 63 / (pad) = kodowanie: ala ma kota a (0x61) l (0x6C) a (0x61) (0x20) m (0x6D) a (0x61) 01100001 01101100 01100001 00100000 01101101 011000001 (0x20) k (0x6B) o (0x6F) t (0x74) a (0x61) 00100000 01101011 01101111 01110100 01100001 00 wynik: YWxhIG1hIGtvdGE= 34

35 Protokół SMTP [serwer] 235 2.0.0 OK Authenticated [klient] MAIL FROM:<nadawca@adres.email><CRLF> [serwer] 250 2.1.0 <nadawca@adres.email>... Sender ok [klient] RCPT TO:<adresat@adres.email><CRLF> [serwer] 250 2.1.5 <adresat@adres.email>... Recipient ok [klient] DATA<CRLF> [serwer] 354 Enter mail, end with "." on a line by itself

Protokół SMTP [klient] Date: Mon, 11 Oct 2004 10:19:24 +0200<CRLF> User-Agent: cokolwiek<crlf> X-Accept-Language: en-us, en<crlf> MIME-Version: 1.0<CRLF> From: ktokolwiek <dowolny@adres.email><crlf> To: inny@adres.email<crlf> Subject: jakis temat<crlf> Content-Type: text/plain; charset=us-ascii<crlf> Content-Transfer-Encoding: 7bit<CRLF><CRLF> tekst testowego maila<crlf>.<crlf> [serwer] 250 2.0.0 Message accepted for delivery [klient] QUIT<CRLF> [serwer] 221 2.0.0 theta.uoks.uj.edu.pl closing connection [serwer] Zakończenie połączenia. 36

Protokół POP Protokół POP [RFC 1939] jest używany do odbierania wiadomości e-mail znajdujących sie na serwerze. Port 110. Przykładowe połączenie: [serwer] +OK <processid.clock@hostname><crlf> [klient] USER użytkownik<crlf> [serwer] +OK<CRLF> [klient] PASS hasło<crlf> [serwer] +OK<CRLF> [klient] STAT<CRLF> [serwer] 2 540<CRLF> //ilość wiadomości i ich rozmiar w oktetach 37

Protokół POP [klient] LIST<CRLF> [serwer] +OK<CRLF>1 120<CRLF>2 420<CRLF> [klient] LIST 3<CRLF> [serwer] +ERR ewentualnie powód błędu<crlf> [klient] RETR 1<CRLF> [serwer] +OK<CRLF> <wiadomość e-mail><crlf> [klient] DELE 1<CRLF> [serwer] +OK<CRLF> [klient] QUIT<CRLF> [serwer] +OK<CRLF> [serwer] Zakończenie połączenia 38

Protokół POP Inne komendy: RSET odznacza wszystkie wiadomości przeznaczone do skasowania, NOOP podtrzymuje połączenie, Komendy opcjonalne: TOP msg n zwraca nagłówek oraz n początkowych lini wiadomości msg, UIDL msg zwraca unikalny identyfikator wiadomości, APOP login kod inny sposób autoryzacji. Pierwszy argument stanowi nazwę użytkownika, drugi to kod MD5 z połączenia <processid.clock@hostname> oraz ustalonego wcześniej wyrażenia znanego klientowi i serwerowi. 39

40 Kod MD5 MD5 (Message Digest Algorithm) [RFC 1321] oblicza 128 bitowy kod dla zbioru danych. Kod ten może być traktowany jak cyfrowy podpis (fingerprint) danych. Na podstawie kodu praktycznie nie można odtworzyć oryginalnych danych ponieważ wygenerowanie informacji posiadającej określony kod MD5 wymaga w praktyce 2 128 operacji.

Protokół IMAP Protokół IMAP [RFC 2060] jest używany do przeglądania wiadomości e-mail przechowywanych na serwerze. Port 143. Przykładowe połączenie: [serwer] * OK IMAP4rev1<CRLF> [klient] 1 capability [serwer] * CAPABILITY IMAP4REV1 AUTH=LOGIN<CRLF> 1 OK CAPABILITY completed<crlf> [klient] 2 authenticate login<crlf> [serwer] + VXNlciBOYW1lAA==<CRLF> [klient] <Base64(użytkownik)><CRLF> [serwer] UGFzc3dvcmQA<CRLF> // Base64(User Name) // Base64(Password) [klient] <Base64(hasło)><CRLF> 41

[serwer] * 1 FETCH (UID 1082 FLAGS (\Seen))<CRLF> * 2 FETCH (UID 1210 FLAGS (\Answered \Seen))<CRLF> 4 OK FETCH completed.<crlf> 42 Protokół IMAP [serwer] * OK [ALERT] Account expires in 14 day(s)<crlf> inna autoryzacja: 2 login użytkownik hasło <CRLF> [klient] 3 select INBOX <CRLF> [serwer] * FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent) * 2 EXISTS * 0 RECENT * OK [UIDVALIDITY 1053533958] Ok 3 OK [READ-WRITE] Ok<CRLF> [klient] 4 UID FETCH 1:* (FLAGS)<CRLF>

43 Protokół IMAP [klient] 5 UID FETCH 1210 (UID RFC822.SIZE BODY[])<CRLF> [serwer] * 283 FETCH (UID 1583 RFC822.SIZE 1180 BODY[] {1180<CRLF> [serwer] <wiadomość email><crlf> * 283 FETCH (FLAGS (\Seen \Recent))<CRLF> 5 OK FETCH completed.<crlf> [klient] 6 LOGOUT<CRLF> [serwer] * BYE<CRLF> 6 OK logout completed.<crlf> [serwer] Zakończenie połączenia.

44 Protokół IMAP Wiadomości na serwerze IMAP są grupowane w katalogach, podobnie jak pliki na dysku. Większość komend protokołu IMAP umożliwia poruszanie sie i wykonywanie odpowiednich operacji na tej strukturze: CREATE, DELETE, RENAME operacje na katalogach (folderach), STORE, COPY, EXPUNGE operacje na wiadomościach. X... - komendy rozszerzające funkcje protokołu IMAP. Odpowiedzi serwera: OK operacja wykonana pomyślnie, NO wystąpił problem, BAD niewłaściwa komenda.

Popularne serwery pocztowe SMTP (Mail Transfer Agent): Sendmail (http://www.sendmail.org/), Qmail (http://www.qmail.org/), Postfix (http://www.postfix.org/), POP, IMAP courier-imap (http://www.courier-mta.org/imap/) Zarządzanie domenami wirtualnymi vpopmail (http://www.inter7.com/index.php?page=vpopmail), mysql (http://www.mysql.com). 45

46 Polecenie Telnet Protokół Telnet [RFC 854] jest/był wykorzystywany głównie pracy terminalowej poprzez port 23. Za pomocą programu klienta usługi Telnet można się także połączyć z dowolnym innym portem na serwerze, np. telnet theta.uoks.uj.edu.pl 25 Komendy wpisywane ze standardowego wejścia (klawiatury) są wysyłane bezpośrednio do wskazanej usługi (SMTP) na serwerze zdalnym. Odpowiedzi są kierowane na standardowe wyjście (ekran).

47 Podsumowanie Warstwa transportowa TCP/IP zawiera dwa protokoły: TCP i UDP. Programowanie w oparciu o interfejs gniazd korzysta ze standardowych mechanizmów wejścia-wyjścia zaimplementowanych w językach programowania i nie wymaga od programisty niskopoziomowej znajomości wykorzystywanych protokołów. Popularne usługi sieciowe takie jak poczta elektroniczna wykorzystują do komunikacji protokoły wysokiego poziomu, które umożliwiają komunikację pomiędzy komputerem klienckim i serwerem. Poczta elektroniczna najczęściej wykorzystuje do komunikacji następujące porty: 25 (SMTP), 110 (POP3) i 143 (IMAP).