Prima ti tutto vi voglio dare un introduzione ai principi di base della rete e ai suoi termini.
Chiunque abbia accesso ad Internet avrà già sentito parlare di reti, server, client, ma per essere sicuri di sapere abbastanza da poter creare programmi che interagiscano con la rete ho voluto creare questo capitolo introduttivo per poi dedicarci ad Winsock (tutti gli esempi di codice che userò saranno scritti in c++ ma comunque dal punto di vista teorico si può applicare tutto a qualsiasi linguaggio)
Reti e protocolli
Esistono in generale due tipi di reti. Le reti a commutazione di circuito (le vecchie reti telefoniche per intenderci) dove un circuito reale o virtuale (ATM) viene stabilito tra sorgente e destinazione e nel quale vengono immessi i dati (la voce nel caso delle vecchie reti telefoniche o le celle ATM). Poi esistono le reti a commutazione di pacchetto dove ogni pacchetto viaggia di nodo in nodo attraverso internet ed arriva alla destinazione senza l'utilizzo di nessun circuito virtuale. Possiamo dire che il pacchetto "trova" (passatemi il termine) la strada per la destinazione fra queste troviamo reti LAN (Local Area Network), WAN (Wide Area Network) e naturalmente Internet.Al fine di garantire che tutto il traffico proceda in modo corretto, le reti si basano su protocolli.
Protocolo
Un protocollo è un insieme di regole che descrivono il modo in cui due entità possono comunicare.
Come indicato qui sopra un protocollo descrive come comunicare in rete. Esso può essere confrontato con un linguaggio umano: al livello più basso quasi tutti possono fare e sentire i suoni (nel caso della rete: segnali elettronici), ma la gente non capisce l’altro, a meno che non parlino secondo un linguaggio specifico che entrambi capiscono (nel caso della rete: protocollo).
Ethernet
Le reti si basano su livelli di protocollo diversi, ognuno con il proprio compito nel processo di comunicazione. Una configurazione comunemente usata è la LAN Ethernet con protocollo TCP/IP. In Ethernet LAN, i computer possono essere collegati tramite cavo coassiale, cavo non schermato (UTP) o cavi di fibre ottiche. Oggigiorno, per la maggior parte delle reti, vengono utilizzati cavi UTP . WAN e Internet (in parte una combinazione di molte WAN) utilizzano molte delle tecniche usate in ethernet LAN ma certi internet service provider (ISP) utilizzano per la connessione verso la rete WAN lo standard PPPoA (Point to Point Protocol over ATM). Lo stesso vale per le fibre ottiche... gli standard sono tanti e diversi (GMPLS, WDM, SDH, ecc.)
MAC
Media Access Control (MAC) è lo strato che contiene, funzionalità di framing, controllo di errore e funzionalità di controllo dell'accesso al mezzo fisico per canali broadcast. Lo standard ethernet utilizza CSMA/CD (Carrier Sense Multiple Access with Collision Detection) mentre lo standard 802.11 utilizza CSMA/CA. Un ulteriore servizio che il livello di collegamento fornisce è il controllo degli errori tramite CRC. Ora dal tipo di rete fisica sottostante dipende il funzionamento della rete a livello 2 (data link). Fa parte del livello datalink di cui rappresenta il sottolivello inferiore sovrastato dal sottolivello LLC e limitato inferiormente dal livello fisico. Le varie caratteristiche di questo strato vengono descritte dalla terza parte dello standard in poi.
È il livello a cui trova sede l'indirizzo MAC o indirizzo fisico del calcolatore.
I pacchetti che vengono inviati su una rete, naturalmente, devono raggiungere la loro destinazione. Quindi ci deve essere un qualche tipo di indirizzamento. I livelli del interfaccia ethernet hanno differenti metodi di indirizzamento, come si vedrà in seguito. Al livello più basso (MAC) l’indirizzamento è fatto con i numeri MAC.
Indirizzo MAC
è un codice di 48 bit assegnato in modo univoco dal produttore ad ogni scheda di rete ethernet prodotta al mondo, tuttavia modificabile a livello software.L’indirizzo MAC si scrive normalmente in 6 ottetti separati da un trattino (es. 00-50-FC-A0-67-2C) ed i primi 3 ottetti sono detti OUI (Organizationally Unique Identifier)
Per inviare un pacchetto ad un’altra interfaccia di rete, il pacchetto deve includere l’indirizzo MAC. LAN utilizza un metodo molto semplice per inviare i pacchetti al interfaccia: radiodiffusione. Ciò significa che la scheda di rete invia il pacchetto solo ad ogni altra interfaccia che può raggiungere. Ogni interfaccia di ricezione guarda l’indirizzo MAC di destinazione del pacchetto e buffer solo se corrisponde a un proprio indirizzo MAC. Anche se questo metodo è facile da implementare e molto efficace su reti LAN, grandi reti (WAN, Internet) non utilizzare questo metodo per ovvi motiv,. WAN utilizzare meglio i meccanismi di routing, che non voglio discutere qui. Basta ricordare che al livello più basso, l’indirizzamento è fatto con i numeri MAC. Pacchetti Ethernet includono anche un CRC e rilevamento degli errori.
IP
IP sta semplicemente per Internet Protocol. Proprio come il livello MAC, IP ha il suo modo di rivolgendosi:
indirizzo IP

IPv4, la versione più diffusa è costituito da 32 bit suddiviso in 4 gruppi da 8 bit, separati ciascuno da un punto (notazione dotted) (es. 11001001.00100100.10101111.00001111). Ciascuno di questi 4 byte è poi convertito in formato decimale di più facile identificazione (quindi ogni numero varia tra 0 e 255 essendo 2^8=256). Un esempio di indirizzo IPv4 è 195.24.65.215. A differenza dei numeri MAC, indirizzi IP non sono codificato permanentemente nell’hardware, ma sono attribuiti a livello software.
I numeri IP non dovrebbe essere qualcosa di strano per te. Internet li utilizza per identificare in modo univoco un interfaccia di rete specifica. gli indirizzi IP possono essere assegnati ad una interfaccia di rete tramite software.In questo modo si associa l’indirizzo IP al’indirizzo MAC dell’interfaccia di rete. Per risolvere utilizzando numeri IP, il numero MAC associato deve essere risolto. Questo viene fatto con l’ARP (Address Resolution Protocol). Ogni host gestisce un elenco con coppie di indirizzi IP e MAC. Se un IP viene utilizzato senza un indirizzo MAC corrispondente l’host invia un pacchetto query al resto della LAN. Se uno qualsiasi degli altri computer della LAN riconoscere il proprio indirizzo IP, invia il numero MAC corrispondente. Se non si trova nessun indirizzo MAC corrispondente il pacchetto viene inviato al gateway, un computer che inoltra i pacchetti alle reti esterne. La conversione da IP a MAC viene fatta in realtà in livello di collegamento dati (livello MAC)
Il protocollo IP aggiunge l’indirizzo di origine e di destinazione (numeri IP) per il pacchetto, così come alcune altre proprietà del pacchetto come il TTL hops (time to live hops), la versione del protocollo utilizza, header checksum, sequence count ma non sono importanti per noi, quindi non li spiegherò in dettaglio.
TCP
Il livello successivo è il livello TCP (oppure, il livello UDP). Questo livello è molto vicino alla applicazione di rete e si occupa di molte cose. Come tocco finale al indirizzamento, TCP aggiunge un numero di porta per il pacchetto:
Numero di porta
Mentre gli indirizzi IP vengono utilizzati per indirizzare ad uno specifico computer o dispositivo di rete, i numeri di porta sono utilizzati per identificare quale processo in esecuzione su tale dispositivo deve ricevere il pacchetto.I numeri di porta sono a 16 bit, e dunque limitati a 65536 numeri. Un processo può registrarsi per ricevere i pacchetti inviati a un numero di porta specifico (‘sta in ascolto’).Un modo molto usato per scrivere la porta utilizzata è la formula ’IP: numeroporta’, ad esempio. 209.217.52.4:80
Molti numeri di porta sono WKP (Well Known Ports), cioè che sono comunemente associati con un servizio specifico.Ad esempio, il WWW utilizza la porta 80 per impostazione predefinita, FTP utilizza la porta 21, e-mail utilizza 25 (SMTP) e 110 (POP). Anche se queste sono le porte solitamente utilizzate per tali servizi, nessuno ti impedisce di utilizzare porte diverse. Tuttavia, è una buona pratica di utilizzare numeri di porta superiori a 1024 per altri servizi personalizzati.
Mentre l’IP non si preoccupa per successo del trasferimento dei dati TCP lo fa. Il livello TCP assicura che i dati arrivino a destinazione nel modo giusto cioè consente il monitoraggio del flusso dei dati in arrivo. il ricevitore può decidere quando ricevere i dati. Se un pacchetto viene perso durante il tragitto al destinatario, TCP invia di nuovo il pacchetto. TCP riordina i pacchetti se arrivano in un ordine diverso da quello dell’ordine originale. Questo rende la vita del programmatore UDP, un’alternativa per TCP, non ha queste caratteristiche e non può garantire l’arrivo dei pacchetti. TCP è orientato alla connessione, e la scelta migliore per i flussi di dati continui. UDP invece è senza connessione, e pacchetti orientata. Non ci si occuperà di UDP in questo tutorial.
SOFTWARE
Infine, sopra lo strato TCP è il software di rete. In Windows, l’applicazione non accedere direttamente al livello TCP, ma utilizza l’API WinSock. Il livello software fornisce un modo molto conveniente di trattare con la rete. Grazie a tutti i livelli sottostanti, non è necessario preoccuparsi di pacchetti, dimensione dei pacchetti di dati, la corruzione, reinvio di pacchetti persi, ecc
Ethernet interface stack

L’immagine sopra mostra l’incapsulamento del protocollo ogni stack del interfaccia ethernet.Tutto inizia con il livello software, che ha un pezzo di dati che vuole inviare in rete. Anche questi dati di solito ha un formato (es. protocolli HTTP, FTP), sebbene non mostrato nell’immagine. Il dato del utente prende prima un’intestazione TCP tra cui l’origine e il numero di porta di destinazione. Quindi viene aggiunto l’intestazione IP, contenente la fonte e l’indirizzo IP di destinazione. Infine, il livello di collegamento dati aggiunge l’intestazione ethernet, che specifica l’indirizzoo MAC di origine e di destinazione.Questo è il dato che viene effettivamente inviato sui fili. Come si può vedere ce un sacco di sovraccarico in un pacchetto TCP / IP. Il sovraccarico può essere minimizzato scegliendo una dimensione abbastanza grande grande per il pacchetto di dati. Per fortuna winsock organizzerà tutto per voi.
Ora che conoscete i livelli di base dell’interfaccia di rete, vorrei continuare con alcuni principi in materia di host, connessioni e protocolli a livello software.
1) DNS
DNS è l’acronimo di Domain Name System, che rappresenta la conversione dei nomi di host da e verso indirizzi IP. Visto che gli indirizzi IP non sono facili da ricordare (beh non molti almeno), è stato creato un altro sistema di denominazione più conveniente. Ora, invece di un indirizzo IP, è possibile utilizzare un hostname in alternativa. Esempi di nomi di host sono: hackerforum.globalfreeforum.com, http://www.google.com, ecc. Chiunque naviga in internet li ha usati. Quando ci si collega ad un sito web, il suo indirizzo IP è necessario. Quindi, se si immette un nome host come http://www.google.com, si deve in primo luogo cercare l’indirizzo IP corrispondente di google. Qui è dove entra in gioco il tuo DNS. Il tuo PC invia una richiesta di ricerca per il hostname al DNS del provider impostato nella rete. Se il DNS in grado di risolvere l’hostname, invia l’IP corrispondente a voi. I DNS sono organizzati in modo gerarchico, se un hostname è irrisolvibile viene trasmesso ad un DNS di livello superiore, fino a quando l’hostname viene risolto.
2) Connections
TCP / IP è un protocollo orientato alla connessione. La connessione è sempre tra due dispositivi, e ogni lato utilizza il suo IP e numero di porta. Di solito, un lato è chiamato client, l’altro lato server.

Il client è quello che chiede qualcosa,e di conseguenza il server quello che da le informazioni.Per esempio, quando si apre un sito web, il browser è il client, il server web è il server(capitan ovvio xD). Il browser inizia la connessione con il server e richiede una risorsa specifica. Il server invia poi di nuovo una risposta e i dati richiesti.
Il server è continuamente in attesa di connessioni in ingresso. Questo è chiamato ascolto, che avviene sempre su un certo IP e numero di porta. Il client è attivo solo quando necessario, il cliente è sempre quello che richiede una connessione e quella che richiede informazioni. Per creare una connessione, il client deve conoscere sia l’IP sia il numero di porta del server in ascolto.
Viene effettuata una connessione al server che , si spera, viene accettata dal server. Mentre la comunicazione su una connessione TCP / IP è bidirezionale, molti procolli (HTTP, FTP, etc) fanno comunicare client e server a turni.Sia il server che lato client utilizza un IP e numero di porta, ma l’IP e il numero di porta del server di solito sono fissi.. La porta standard per il WWW è 80 (utilizzando il protocollo HTTP). Google per esempio, è un server web che gira sulla porta 80 e IP 173.194.35.23 (in questo momento), ogni volta che cerchiamo qualcosa su google il client si connette a questo IP e porta, così il webserver può avere molte connessioni sulla stessa porta, questo non è un problema, poiché tutto il traffico su quella porta è per lo stesso processo. Sul lato client, il numero di porta non ha importanza. Ogni porta può essere utilizzata. Alcune persone pensano che il numero di porta utilizzato in una connessione deve essere la stessa su entrambi i lati. Questo non è vero. Basta aprire un sito web e digitare ‘netstat-an’ in una riga di comando. Si potrebbe vedere una riga come questa:
TCP xxx.xxx.xxx.xxx:2894 173.194.35.23:80 ESTABLISHED
xxx.xxx.xxx.xxx è il mio IP, 173.194.35.23:80 è l’IP di Google. Il numero dopo i due punti è il numero di porta. Come si può vedere, il server utilizza la porta 80, mentre il client utilizza un a caso (2894). Ogni connessione client necessita di una potra sul lato client, poiché ogni connessione è associato a un diverso client.
quindi il parole povere
Client
è il programma che avvia la connessione, e richiede le informazioni
server
Il programma che è in ascolto per le connessioni in ingresso, le accetta e le risponde in base alle richieste pervenute. L’indirizzo IP e la porta del server devono essere conosciute dal client per connettersi ad esso.
P.S Nei capitoli precedenti ho mostrato diversi protocolli ai vari livelli di una interfaccia di rete. I protocolli di cui non ho ancora discusso sono i protocolli che lavorano a livello di software. Esempi di questi sono HTTP, FTP, POP3, SMTP. La maggior parte lavorano in un client-server, vale a dire. il client esegue richieste, il server risponde. Il formato esatto delle richieste e le risposte sono descritti in questi protocolli. Ora non ne discuterò ulteriormente, ma lo farò più tardi, quando si conosceranno le basi di Winsock/Soket e li implementeremo.
si ringrazia Lu@Hck88 per la partecipazione