{"id":15152,"date":"2020-06-12T07:30:07","date_gmt":"2020-06-12T05:30:07","guid":{"rendered":"https:\/\/www.unilab.eu\/?p=15152"},"modified":"2020-06-09T08:42:31","modified_gmt":"2020-06-09T06:42:31","slug":"socket","status":"publish","type":"post","link":"https:\/\/www.unilab.eu\/it\/articoli\/coffee-break-it\/socket\/","title":{"rendered":"Socket: cos&#8217;\u00e8 e come funziona"},"content":{"rendered":"<p>Con <strong>socket<\/strong> si intende un oggetto software, il cui compito \u00e8 quello di indirizzare correttamente i pacchetti di dati fra host. \u00c8 presente sia nelle comunicazioni che avvengono tramite rete (fra host remoti) sia in quelle locali (Inter-Process Communication).<\/p>\n<p>I socket in comunicazione, in entrambi i casi, formano una <strong>coppia<\/strong> (detta pair), che si compone di due valori estremamente importanti: <strong>indirizzo<\/strong> e <strong>porta<\/strong>. Questi permettono al pacchetto di dati di raggiungere la destinazione corretta, grazie a una connessione logica. Attraverso apposite API, i sistemi operativi abilitano le applicazione all\u2019uso dei socket di rete.<\/p>\n<p><strong>Com\u2019\u00e8 strutturato un socket address<\/strong><\/p>\n<p>Disporre di valori come indirizzo e porta in un <strong>socket address<\/strong>, \u00e8 importante per permettere a due interlocutori di dialogare correttamente. I processi in esecuzione su ogni interlocutore (sia esso un server o un client), infatti, sono moltissimi, per questo sapere a quale puntare \u00e8 cruciale. Per fare ci\u00f2 si usano le <strong>porte<\/strong>, ovvero numeri specifici assegnati a ogni processo.<\/p>\n<p>Un indirizzo socket, dunque, si compone di: un <strong>indirizzo IP<\/strong> a 32 bit e un <strong>numero di porta<\/strong> a 16 bit. I numeri di porta sono raggruppati in diverse sottocategorie (definite dalla IANA), per facilitarne l\u2019identificazione e la funzione:<\/p>\n<ul>\n<li>well-known (riservate a protocolli specifici): 20, 23, 25, 80, 110,\u2026;<\/li>\n<li>non usate: 0;<\/li>\n<li>riservate per processi well-known: 1-255;<\/li>\n<li>riservate per altri processi: 256-1023;<\/li>\n<li>altre applicazioni: 1024-65535.<\/li>\n<\/ul>\n<p>Il sistema operativo provvede ad assegnare in autonomia i numeri di porta ai processi classificati come <em>non well-known<\/em>. In questo caso si parla di <strong>porte effimere<\/strong>. Un altro aspetto importante dei socket \u00e8 la <strong>famiglia<\/strong> (anche detta dominio). Essa varia a seconda del tipo di protocollo di comunicazione utilizzato, ma quelle che vale la pena citare sono due:<\/p>\n<ul>\n<li><strong>AF_INET<\/strong>: per la comunicazione tra host remoti, via Internet;<\/li>\n<li><strong>AF_UNIX<\/strong>: che identifica la comunicazione tra processi locali (pi\u00f9 precisamente su macchine Unix). Un altro nome di questa famiglia \u00e8, infatti, <em>Unix Domain Socket<\/em>.<\/li>\n<\/ul>\n<p><strong>Tipologie di socket e metodo di comunicazione<\/strong><\/p>\n<p>In ogni famiglia si possono distinguere diverse tipologie di socket, che variano a seconda della modalit\u00e0 di connessione utilizzata. I <strong>datagram socket<\/strong>, ad esempio, sono basati sul protocollo UDP e non sono orientati alla connessione (connectionless). Gli <strong>stream socket<\/strong>, invece, sono orientati alla connessione e si basano sui pi\u00f9 affidabili TCP o SCTP. Esistono poi i <strong>raw socket<\/strong> in cui l\u2019header \u00e8 accessibile a livello applicativo e il livello di trasporto viene bypassato.<\/p>\n<p>Grazie a protocolli sicuri come TCP e SCTP,\u00a0 gli stream socket sono i pi\u00f9 affidabili, soprattutto per la comunicazione in rete. Essi garantiscono caratteristiche <strong>full-duplex<\/strong> e <strong>connection oriented<\/strong> con un flusso di byte di lunghezza variabile. In questo esempio specifico la comunicazione si struttura in diverse fasi:<\/p>\n<ol>\n<li>il <strong>socket viene creato<\/strong> sia nel client che nel server. Il server pone in ascolto il proprio socket mediante una porta specifica;<\/li>\n<li>la <strong>richiesta di connessione<\/strong> viene effettuata dal client verso il server. Se quest\u2019ultimo la accetta si crea la connessione;<\/li>\n<li>a questo punto il server crea un nuovo socket specifico per il client detto data socket, che viene utilizzato per lo <strong>scambio di dati<\/strong> fra i due;<\/li>\n<li>il client comunica la <strong>fine del messaggio<\/strong> al server, che provvede a eliminare l\u2019istanza del data socket e a chiudere la connessione.<\/li>\n<\/ol>\n<p>I datagram socket basati su <strong>UDP<\/strong> sono pi\u00f9 veloci rispetto agli stream socket (perch\u00e9 saltano la fase di richiesta di connessione al server), ma anche meno sicuri. In questa tipologia di socket, la comunicazione si struttura in sole tre fasi:<\/p>\n<ol>\n<li><strong>creazione del socket<\/strong> (senza la necessit\u00e0 di una connessione);<\/li>\n<li><strong>invio dei dati<\/strong> (il client manda i dati direttamente al server tramite i rispettivi numeri di porta);<\/li>\n<li><strong>risposta del server<\/strong> (la comunicazione continua in loop finch\u00e9 ci sono dati da inviare).<\/li>\n<\/ol>\n<!--themify_builder_content-->\n<div id=\"themify_builder_content-15152\" data-postid=\"15152\" class=\"themify_builder_content themify_builder_content-15152 themify_builder tf_clear\">\n    <\/div>\n<!--\/themify_builder_content-->\n","protected":false},"excerpt":{"rendered":"<p>Con socket si intende un oggetto software, il cui compito \u00e8 quello di indirizzare correttamente i pacchetti di dati fra host. \u00c8 presente sia nelle comunicazioni che avvengono tramite rete (fra host remoti) sia in quelle locali (Inter-Process Communication). <\/p>\n","protected":false},"author":10,"featured_media":15150,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"46","_seopress_titles_title":"","_seopress_titles_desc":"Con socket si intende un oggetto software, il cui compito \u00e8 quello di indirizzare correttamente i pacchetti di dati fra host. \u00c8 presente sia nelle comunicazioni che avvengono tramite rete (fra host remoti) sia in quelle locali (Inter-Process Communication).","_seopress_robots_index":"","_seopress_analysis_target_kw":"socket","footnotes":""},"categories":[46],"tags":[],"class_list":["post-15152","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-coffee-break-it","has-post-title","has-post-date","has-post-category","has-post-tag","has-post-comment","has-post-author",""],"builder_content":"","_links":{"self":[{"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/posts\/15152","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/comments?post=15152"}],"version-history":[{"count":0,"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/posts\/15152\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/media\/15150"}],"wp:attachment":[{"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/media?parent=15152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/categories?post=15152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unilab.eu\/it\/wp-json\/wp\/v2\/tags?post=15152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}