Protocolli di Trasporto
Socket
Un socket normale è un terminatore di rete elettrica.
- Quando si inserisce un plug ne esce corrente
- Si ignorano i dettagli della rete elettrica
- Vi sono più tipi di prese e spine
Un socket di rete è un terminatore di rete dati.
- Quando ci si collega fluiscono i dati
- Si ignorano i dettagli della rete dati
- Vi sono più tipi di socket di rete
Vi sono due prncipali tipi di socket.
Socket UNIX (in Windows: Socket Local):
- Per IPC (Inter Process Communication) tra processi locali
- Simile ad una pipe, ma può essere asincrono
- Implementato da un file speciale a file system e da un buffer nel kernel
- Molto usato in Linux
Socket Inet:
- Per comunicazioni con i protocolli TCP/IP
- Implementato tramite un record (
struct sockaddr
) che contiene i parametri di comunicazione
Vi sono moltissimi altri tipi di socket, per altre cataste di protocolli
Visualizzare tutti i socket in uso:
netstat -an
System Call socket
Chiamata di sistema per avere un socket:
int s;
s=socket(int domain, int type, int protocol);
- domain - Addressing Format - formato indirizzi
AF_UNIX
- un parametro: nome fileAF_INET
- struct con 4 parametri- IP sorgente
- IP destinazione
- Porta sorgente
- Porta destinazione
- type - tipo di servizio richiesto - per AF_INET:
SOCK_STREAM
- trasporto TCPSOCK_DGRAM
- trasporto UDPSOCK_RAW
- nessun trasporto (p.es. ICMP)
- protocol - protocollo internetworking da
/etc/protocols
0
- IP
Funzioni per socket
Dopo l’apertura del socket s sono disponibili le funzioni (alcune):
int bind(int s, const struct sockaddr *addr, socklen_t addrlen);
- associa un indirizzo ad un socket (server)
- serve a settare la porta (p.es.80 per HTTP)
int listen(int s, int backlog);
- ascolta passivamente su un socket (server)
- backlog è la lunghezza di una coda (tipicamente 5)
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
- gestisce la richiesta di connessione (TCP, server)
int connect(int s, const struct sockaddr *addr, socklen_t addrlen);
- richiede una connessione (TCP, client)
ssize_t read(int s, void *buf, size_t count);
- legge dal socket in un buffer (TCP)
ssize_t write(int s, const void *buf, size_t count);
- scrive dal buffer ad un socket (TCP)
ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
- invia un buffer ad un indirizzo di destinazione (UDP)
ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
- riceve in un buffer da un indirizzo sorgente (UDP)
int close(int s);
- chiude il socket
Schema di connessione
Prima parte il server, poi il client.
Più clients: wait
Un secondo client trova il server occupato e viene posto in coda.
Più clients: nowait
Non è il server si ascolto, ma quello di servizio a gestire la connessione.
Port multiplexing
Un server di ascolto può gestire più porte.