# Socket (reti)

Un socket, in informatica, indica un'astrazione software progettata per utilizzare delle API standard e condivise per la trasmissione e la ricezione di dati attraverso una rete oppure come meccanismo di IPC. È il punto in cui il codice applicativo di un processo accede al canale di comunicazione per mezzo di una porta, ottenendo una comunicazione tra processi che lavorano su due macchine fisicamente separate. Dal punto di vista di un programmatore un socket è un particolare oggetto sul quale leggere e scrivere i dati da trasmettere o ricevere.

## Descrizione

I socket sono stati introdotti nel 1983 in BSD e poi sono stati ripresi da praticamente tutti gli altri sistemi operativi. Per questo motivo solitamente le funzioni di programmazione dei socket vengono chiamate Berkeley socket API.
Essi permettono di instaurare le varie comunicazioni all'interno della rete, utilizzando la pila TCP/IP. Essi sono composti principalmente da due parti:
* Indirizzo IP: codice univoco della macchina interessata, con una grandezza di 32 bit.
* Numero di porta: numero, con una grandezza di 16 bit, usato dal singolo processo per richiedere il protocollo all'interno della macchina stessa.
Questa combinazione permette di distinguere in maniera univoca le singole richieste all'interno della rete.

## Domini

I socket che utilizzano i medesimi protocolli vengono racchiusi all'interno di una stessa famiglia, chiamata dominio. Esistono principalmente due tipologie di domini:
* Internet socket: permette il trasferimento di dati tra processi posti all'interno di macchine remote connesse, ad esempio appartenenti alla stessa LAN.
* Unix Domain socket: permette il trasferimento di dati tra processi appartenenti alla stessa macchina.

## Tipi di socket

I socket si classificano principalmente in tre categorie, ciascuna caratterizzata da una propria modalità di comunicazione.
* Datagram socket: questa tipologia di socket utilizza una connessione basata sul protocollo UDP. Ciò significa che l’invio dei dati avviene mediante il trasferimento di piccoli datagrammi, senza garantire il corretto ordine d’arrivo e la correttezza dell’informazione. Il client e il server non instaurano una vera e propria connessione, ma il client comunica direttamente con il server, quando vuole.
* Stream socket: utilizzano una connessione basata sul protocollo TCP, quindi connection-oriented e affidabile.
    La connessione viene instaurata tramite la seguente sequenza:
   * Vengono inizializzati i processi client e server.
   * Il processo client invia la richiesta di connessione al server indicando il socket.
   * Il server accetta la richiesta e dà vita ad un canale virtuale che utilizzerà per la trasmissione dei dati.
* Raw socket: questa tipologia di socket viene utilizzata per lo sviluppo di particolari protocolli.
A sua volta esistono due tipi di socket su IP:
* listen, che rappresentano la possibilità di ricevere nuove connessioni. Un socket di questo tipo è identificato dalla terna protocollo di trasporto, indirizzo IP del computer, numero di porta;
* established, che rappresentano una particolare connessione attiva. Un socket di questo tipo è identificato dalla 5-tupla protocollo di trasporto, indirizzo IP sorgente, indirizzo IP destinazione, numero di porta sorgente, numero di porta destinazione.

## Socket in Java

I socket possono essere implementati tramite vari linguaggi di programmazione. In Java, ad esempio si hanno a disposizione classi già predefinite che permettono la realizzazione del socket sia della macchina client, sia della macchina server.

### Datagram socket

Per realizzare un socket di tipo datagram, si devono sviluppare le seguenti istruzioni:
* Il client crea il socket.
* Il server crea il socket in attesa di ricevere informazioni da altre macchine.
* Il client invia le richieste.
* Il server riceve i dati, li elabora e risponde con le informazioni richieste.
* Il client riceve i dati e chiude il socket.
Nella programmazione in Java si utilizza la classe Java DatagramSocket, basata sul protocollo UDP, la quale possiede i seguenti metodi principali:

### Stream socket

In questa tipologia di connessione è il client che si occupa di invocare il costruttore del socket, specificando l'indirizzo e la porta dove risiede il processo server.
Gli stream socket, a differenza dei datagram socket, utilizzano due metodi differenti per inizializzare il socket client e il socket server.