INTERNET DOMAIN SOCKETS (Cap.59)



Похожие документы
Una semplice applicazione client/server 1

Socket TCP. prima parte

Elementi di programmazione con interfaccia Socket

Interazione con il DNS Conversioni di Nomi ed Indirizzi

Socket. Nei sistemi operativi moderni i servizi disponibili in rete si basano principalmente sul modello client/server.

Interazione (TCP) Client-Server con le socket

I Socket. Laboratorio Software M. Grotto R. Farina

Socket TCP. seconda parte

Socket per TCP: Fondamenti

Esercitazione [6] Client/Server con Socket

Cenni di programmazione distribuita in C++ Mauro Piccolo

Reti (già Reti di Calcolatori )

Esempio 1: stampa locale di file remoto

Creare una applicazione Winsock di base

L interfaccia socket

Interazione (TCP) Client-Server con le socket

IPC Inter Process Communication

COMUNICAZIONE TRA PROCESSI REMOTI IN UNIX

Socket. Nei sistemi operativi moderni i servizi disponibili in rete si basano principalmente sul modello client/server.

Guida all' uso dei sockets nella programmazione in C

Esercitazione di Lab. di Sistemi Operativi 1 a.a. 2011/ Comunicazione Tra Processi (IPC) Parte -

Paradigma client-server

Inter-process communication: socket

Programmazione dei socket di rete in GNU/Linux

Protocolli di Comunicazione

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

request reply richiesta client processo di servizio processo server principale From - Valeria Cardellini, Corso Sist. Distr. A.A.

Socket API per il Multicast

L uso di Socket UDP. Usiamo le API Winsock incluse in <Winsock.h> A.A. 2005/06. Dott.ssa Valeria Carofiglio

Esercitazione [7] Client/Server con Socket

GLI INDIRIZZI DELL INTERNET PROTOCOL (IP ADDRESS) 2. Fondamenti sugli indirizzi dell Internet Protocol 2. Struttura di un indirizzo IP 2

SERVER CLIENT. Struttura di un Applicazione UDP. Socket UDP. Parametri di sendto. Funzioni di Input/Output. Prof. Vincenzo Auletta

L uso di Socket UDP. TCP vs. UDP UDP

Indirizzi IP. Indirizzi IP

TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI

Configurazione Rete in LINUX

Transmission Control Protocol

DATAGRAM SOCKET. Angelastro Sergio Diomede Antonio Viterbo Tommaso

Introduzione alla programmazione C di socket

unsigned long inet_addr(cp) char *cp;

Cos è. Protocollo TCP/IP e indirizzi IP. Cos è. Cos è

Reti di Telecomunicazioni Mobile IP Mobile IP Internet Internet Protocol header IPv4 router host indirizzi IP, DNS URL indirizzo di rete

TCP/IP. Principali caratteristiche

Introduzione al TCP/IP Indirizzi IP Subnet Mask Frame IP Meccanismi di comunicazione tra reti diverse Classi di indirizzi IP Indirizzi IP privati e

20. DNS: Il Domain Name System

ICMP OSI. Internet Protocol Suite. Telnet FTP SMTP SNMP TCP e UDP NFS. Application XDR. Presentation. Session RPC. Transport.

Laboratorio di Reti di Calcolatori

Introduzione alla programmazione in C

Транскрипт:

INTERNET DOMAIN SOCKETS (Cap.59) Internet Domain Stream Socket TCP Internet Domain Datagram Socket UDP A differenza degli UDDS I datagrams possono essere persi duplicati o arrivare in un ordine diverso da quello inviato Se la coda di ricezione è piena il datagram inviato viene dropped 1

Byte Ordering L'ordine in cui i byte di numeri interi multibytes, vengono memorizzati in memoria dipende dall'architettura della macchina: l'host byte ordering può essere big-endian: byte più significativi per primi little-endian: byte meno significativi per primi (x86) 2

host byte ordering per interi di 2 e 4 byte 3

Host.vs Network byte ordering Gli address usati dagli IDS sono rappresentati da indirizzi IP e numeri di Porta che altro non sono che interi multi byte network byte order big endian Necessità di convertire i formati da host a network byte order quando si devono riempire le strutture dati da consegnare alla rete (kernel) da network a host quando l'applicativo deve manipolare gli indirizzi ottenuti dal kernel. 4

Funzioni di conversione #include <arpa/inet.h> uint16_t htons(uint16_t host_uint16); Returns host_uint16 converted to network byte order uint32_t htonl(uint32_t host_uint32); Returns host_uint32 converted to network byte order uint16_t ntohs(uint16_t net_uint16); Returns net_uint16 converted to host byte order uint32_t ntohl(uint32_t net_uint32); Returns net_uint32 converted to host byte order 5

TODO Marshalling readline() 6

Internet Socket Address Gli address usati dagli IDS sono rappresentati da indirizzi IP e numeri di Porta e possono essere di 2 tipi fondamentali, in accordo alle 2 versioni del protocollo IP attualmente in uso nella pila TCP/IP (Internet). Identifica l'applicazione all'interno dell'host Indirizzo IP Numero di Porta IPv4 32 bit Identifica l'host della rete 192.168.1.20 50000 dotted-decimal notation: 142.168.0.20 IPv6 128-bit rappresentati in 8 numeri (16-bit-hex) separati da : F000:0:0:0:0:0:A:1 <=> F000::A:1 7

TCP/UDP Numeri di porta 1/2 Il livello di trasporto ha la necessità di poter distinguere applicazioni all'inerno dello stesso host. Numeri di Porta. interi a 16-bit 0.. 1023 1024.. 49151 49151.. 65535 reserved/privileged registered dynamic Registrate presso lo IANA 8

TCP/UDP Numeri di porta 2/2 reserved/privileged/well known ports. Porte registrate presso lo IANA e riservate ad applicazioni specifiche: ftp(21), ssh(22), telnet(23),http(80),https(443), git (403),. registered. Registrate ma non riservate. Porte effimere/dinamiche. In termini di sockets il TCP assegna una porta effimera in 2 casi assenza di bind() bind alla porta 0 getsockname() per recuperare l'address corrente 9

struct sockaddr include <netinet/in.h> /* L'unico scopo di questa struttura è quello di usarla come cast dei puntatori alle specific address struct per poter essere usati come argomento nelle socket SC /* struct sockaddr { // unsigned integer sa_family_t sa_family; // add family, AF_INET, AF_INET6 } char sa_data[14]; // protocol-spec address 10

IPv4 socket addresses struct sockaddr_in /* IPv4 socket address */ struct sockaddr_in { sa_family_t sin_family; /* Port number 16-bit unsigned integer unsigned short */ in_port_t sin_port; // IPv4 4-byte address struct in_addr { // Unsigned 32-bit integer in_addr_t s_addr; }; struct in_addr sin_addr; //Pad to size of sockaddr unsigned char pad[8]; }; 11

// IPv6 socket address struct sockaddr_in6 { IPv6 socket addresses struct sockaddr_in6 // Address family (AF_INET6) sa_family_t sin6_family; in_port_t sin6_port; /* IPv6 flow information */ uint32_t sin6_flowinfo; // IPv6 address struct in6_addr { //16 bytes (128 bits) uint8_t s6_addr[16]; }; /* IPv6 address */ struct in6_addr sin6_addr; uint32_t }; sin6_scope_id; 12

Esempio IPv4 struct sockaddr_in ip4addr; int s; ip4addr.sin_family = AF_INET; ip4addr.sin_port = htons(3490); inet_pton(af_inet, "10.0.0.1", &ip4addr.sin_addr); s = socket(af_inet, SOCK_STREAM, 0); bind(s, (struct sockaddr*)&ip4addr, sizeof ip4addr); 13

Esempio IPv6 struct sockaddr_in6 ip6addr; int s; ip6addr.sin6_family = AF_INET6; ip6addr.sin6_port = htons(4950); inet_pton(af_inet6, "2001:db8:8714:3a90::12", &ip6addr.sin6_addr); s = socket(pf_inet6, SOCK_STREAM, 0); bind(s, (struct sockaddr*)&ip6addr, sizeof ip6addr); 14

struct sockaddr_storage Introdotta nelle socket API IPv6 ha lo scopo di poter contenere tutti i tipi di socket address, rimuovendo in pratica la dipendenza dalla versione di IP. struct sockaddr_storage cli_addr;... len = sizeof(cli_addr); recvfrom(sockfd, buf,buf_len,0, (struct sockaddr *)&cli_addr, &len) 15

Coesistenza IPv4 e IPv6 Possono coesistere sullo stesso host condividendo lo stesso set di numero di porte: se un num di porta è già impegnato non può essere usato nemmeno da un altro IP type. L'interworking è trasparente: due host possono comunicare indipendentemente dallo tipologia di IP che essi usano (IPv4-IPv6, IPv4-IPv4, IPv4-IPv6) 16

IP address e Host names host names www.google.it DNS DNS formato presentazione IPv4: dotted decimanl IPv6: hex-string rappr. numerica in_addr/in6_addr 192.168.1.20 2001:db8:8714:3a90::12 17

Service name e Service Port /etc/services valore numerico / numero di porta Nome simbolico del servizio /etc/services 18

Conversione Indirizzi IP da binaria a formato presentazione Prototipi obsoleti (IPv4) inet_aton() : da forma dotted decimal a bin inet_ntoa() : da binaria a dotted decimal Nuovi prototipi (IPv4/IPv6) inet_pton(): da presentation a binaria inet_ntop(): da binaria a presentation 19

inet_pton() AF_INET / AF_INET6 Stringa in formato presentazione int inet_pton(int domain, const char *src_str, void *addrptr); Returns 1 on successful conversion, 0 if src_stris not in presentation format, or 1 on error puntatore ad una struttura in_addr/in6_addr che conterrà l'ind convertito 20

AF_INET / AF_INET6 inet_ntop() puntatore ad una struttura in_addr/in6_addr contenente l'indirizzo da convertire const char* inet_ntop(int domain, const void *addrptr, char *dst_str, size_t len); Returns 1 on successful conversion, 0 if src_stris not in presentation format, or 1 on error buffer null-term contenente l'address convertito lunghezza del buffer di ritorno: INET_ADDRSTRLEN (16) INET6_ADDRSTRLEN (46) 21

Conversione host-name e service-name Prototipi obsoleti gethostbyname() : ritorna l'ip binario gethostbyaddr() ip addr host names: DNS getservbyname() : ritorna il numero di porta associato a quel service-name. getservbyport() serv-name bin : /etc/services Nuovi prototipi per ambedue le conversioni getaddrinfo() : da human-readable a bin getnameinfo(): da bin a human-readable Hanno il vantaggio di non dover specificare il tipo di IP: è IPv4/IPv6 trasparente. 22

gethostbyaddr() getnameinfo() Nome Host Indirizzo IP gethostbyname() getaddrinfo() getservbyport() getnameinfo() Nome simbolico sevizio Numero di Porta getservbyname() getaddrinfo() 23

maggiori dettagli Client-Server Datagram Soscket DNS /etc/services 24

getnameinfo()/getaddrinfo() int getnameinfo( const struct sockaddr *addr,socklen_t addrlen, char *host, size_t hostlen, char *service, size_t servlen, int flags); Returns 0 on success, or nonzero on error Nome Host Nome del sevizio Indirizzo IP numero di Porta int getaddrinfo(const char *host, const char *service, const struct addrinfo *hints, struct addrinfo **result); Returns 0 on success, or nonzero on error 25

struct addrinfo { struct addrinfo int ai_flags; /* Input flags (AI_* constants) */ int ai_family; /* Address family */ int ai_socktype; /* Type: SOCK_STREAM, SOCK_DGRAM */ int ai_protocol; /* Socket protocol */ size_t ai_addrlen; /* Size of structure pointed to by ai_addr */ char *ai_canonname; /* Canonical name of host */ /* Pointer to socket address structure */ struct sockaddr *ai_addr; struct addrinfo *ai_next; /* Next structure in linked list */ }; 26

27

addrinfo *hints struct addrinfo { int ai_family; int ai_socktype; int ai_protocol; int ai_flags;... }; AF_UNSPEC, AF_INET, AF_INET6 0, SOCK_STREAM, SOCK_DGRAM 0 AI_CANONNAME AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE 28