GLM - 29/6/2022 - 19:54


Classifica dei relatori GLM 2014 (per numero di lezioni svolte)

  1. [9] Samuele Cacchiarelli
  2. [6] Andrea Bianchini
  3. [6] Gianluca Gabrielli
  4. [1] Matteo Ciccioli
  5. [1] Fabio Pagnotta
  6. [1] Alessandro Zampa
  7. [1] Emanuele
  8. [1] Roberto Marozzi
  9. [1] Giampiero Rubini

Vuoi diventare relatore GLM? presenta anche tu una lezione su un argomento che più ti piace relativo a Linux o al mondo dell'OpenSource


Archivio news

server glm
Il nostro Server

bella gnocca freebsd
FreeBSD It's Here!

Breve introduzione ai socket di Berkeley

Il livello di trasporto

Nei sistemi Unix il livello di trasporto è implementato per mezzo di un processo che gira in kernel-space, con il quale è possibile interfacciasi per mezzo delle primitive socket (vedere sezione "Networking options" del kernel). Per completezza occorre aggiungere che il protocollo TCP, protocollo connesso, non è l'unico a livello di trasporto, esiste anche un protocollo non connesso, il protocollo UDP.

Il protocollo UDP è utilizzato ad esempio nelle applicazioni multimediali, nelle quali è preferibile seguire la politica milk invece della politica wine, ovverro "il nuovo è meglio del vecchio": un pacchetto vecchio ricevuto in mezzo a tanti pacchetti nuovi potrebbe compromettere la comunicazione, quindi vengono scartati eventuali pacchetti vecchi a favore di quelli nuovi. Non importa poi se qualche pacchetto sia perso ma è di fondamentale importanza che tutti i pacchetti arrivino con la stessa sequenza in cui sono stati inviati. Inoltre con UDP non si perde tempo ad aprire e chiudere connessioni, il che velocizza di molto la comunicazione, comportando tuttavia l'introduzione di una certa percentuale di errore.

Nella posta elettronica al contrario è importante che sia mantenuta l'integrità dei dati, dunque si utilizza il protocollo TCP: i vari pacchetti sono inviati indipendentemente, a seguito della connessione tra client e server. Siamo sicuri che il destinatario riceva il messaggio nella sua integrità in quanto il protocollo è connesso, infatti anche una errata sequenza di ricezione non danneggia la comunicazione perchè il server potrà riordinare i pacchetti in un suo buffer locale prima di inviare il messaggio di posta elettronica a destinazione. Nessun pacchetto in questo caso viene scartato.

Nel livello di trasporto i pacchetti utilizzati nella comunicazione sono chiamati segmenti, invece nel livello di rete abbiamo visto che sono chiamati datagrammi.

Il protocollo TCP segue il modello client/server per cui una connessione tra due apllicazioni avviene secondo la modalita' del 3-hand shaking (stretta di mano tripla). Il client invia una richiesta di connessione al server (SYN) e questo gli risponde con un segnale di richiesta ricevuta (ACK). A questo punto il client a sua volta invia al server un segnale di messaggio ricevuto (ACK) e la connessione viene instaurata. Da questo momento in poi client e server possono scambiare messaggi. Per terminare la comunicazione il client invia al server un messaggio di fine connessione (FIN).

Naturalmente il protocollo è molto più complesso di quanto abbiamo fin qui trattato, infatti a livello di trasporto è necessario anche controllare la presenza di eventuali errori e di controllare il flusso dei dati, ma per i nostri scopi questa introduzione è più che sufficiente.

Le primitive socket consentono di creare un canale di comunicazione in cui i processi client e server scrivono i messaggi, proprio come avviene in locale con la pipe o con la fifo ( named pipe ). Il programmatore può avvalersi del protocollo TCP utilizzando, come abbiamo già visto, le primitive socket per mezzo delle quali crea i descrittori di socket ed assegna ai socket stessi degli identificatori a 16 bit univoci detti porte; per mezzo poi di un'altra primitiva socket il programmatore dovrà creare una connessione esplicita, come vedremo nei sorgenti che seguono, tra il descrittore di socket della macchina client ed il descrittore di socket della macchina server. Il numero massimo di porte che si possono avere è 65.536 ( essendo 2^16=65536 ), le porte inferiori alla 1024 (da 0 a 1023) sono dette "well known ports" e sono riservate a servizi standard quali SMTP (25) oppure FTP (21), per ogni porta poi possono essere usati sia il protocollo TCP che il protocollo UDP ( vedi /etc/services ed /etc/protocols ).

Il livello di trasporto è il primo livello punto-punto, dunque non è possibile effettuare collegamenti multicasting o broadcasting (con più destinatari contemporaneamente), tutti i livelli sottostanti del modello ISO/OSI sono livelli collegati, per i quali quindi è ammesso il broadcasting (lo stesso pacchetto può essere inviato a più destinatari). Si pensi ad esempio al sottolivello MAC del livello data-link ed al protocollo IEEE 802.3 (ethernet) che ne è una implementazione, e che tutti noi (o quasi ) utilizziamo, il quale è fortemente basato sui concetti di multicasting e broadcasting.

Il programma "chat"

Vengono ora esposti due semplici sorgenti in C che utilizzano le primitive socket e che permettono di implementare un sistema di chat minimale testuale. Dei due sorgenti sock_client.c rappresenta il client e sock_server.c rappresenta il server. Ho inserito molti commenti nei sorgenti al fine di rendere chiaro il funzionamento dei due programmi. Scaricalo qui.

Istruzioni sulla compilazione ed utilizzo del programma "chat"

Compilazione:

Spostarsi nella directory contenente i sorgenti e digitare:

$ make

otterrete due file eseguibili: "Client" e "Server"

Uso:

Eseguire "Server" , da questo momento il server rimane in ascolto sulla porta 15.000, eseguire poi "Client" sulla macchina client indicando l'indirizzo IP del server.

Ora potete comunicare, buon divertimento! Per eventuali errori o commenti inviate il vostro feedback


Torna  alla  pagina 1/2


Marco Pagnanini
Last Update 09/08/2003
mail