Protocolli di Trasporto

Socket

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 file
    • AF_INET - struct con 4 parametri
      • IP sorgente
      • IP destinazione
      • Porta sorgente
      • Porta destinazione
  • type - tipo di servizio richiesto - per AF_INET:
    • SOCK_STREAM - trasporto TCP
    • SOCK_DGRAM - trasporto UDP
    • SOCK_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

Seqconn

Schema di connessione

Prima parte il server, poi il client.

Conn01

Più clients: wait

Un secondo client trova il server occupato e viene posto in coda.

Connwait

Più clients: nowait

Non è il server si ascolto, ma quello di servizio a gestire la connessione.

Connowait

Port multiplexing

Un server di ascolto può gestire più porte.

Connmulti