sabato 31 dicembre 2016

Datagramma IP

Nella pila protocollare TCP/IP il datagramma è l'unità dati di livello rete ed è composto dai seguenti campi :


L'header IP è costituito dalle prime 5 righe (campo options escluso poichè opzionale e poco usato).Il campo Data sono i dati utili provenienti dai livelli superiori .
La lunghezza minima della parte di controllo è di 20 byte; difatti sono 5 righe a 4 byte ciascuno. La lunghezza massima è di 60 byte. Vediamo ora il significato di ogni singolo campo.

Version
Esistono più versioni di protocollo IP , come IPv4 o IPv6 . Questo campo indica come interpretare il datagramma, quindi quale versione di protocollo IP viene utilizzata.


IHL (Internet Header Length)
Denota la lunghezza dell'header , quindi l'inizio dell'informazione contenente i dati .
Sono 4 bit, perciò il piu' grande numero rappresentabile è 1111 = 15, da cui essendo un multiplo di 4 byte, si conclude che la massima lunghezza dell'header è di 15x4=60 byte.
Invece dal momento che la lunghezza minima della parte di controllo è di 20 byte il campo IHL non può avere valore minore a 5. Dunque il minimo valore consentito è 0101.

Type of service
Il campo TOS denota la precedenza dei livelli di traffico. In parole povere in base a specifiche combinazioni di questi 8 bit, per quel particolare datagramma si potrebbe voler minimizzare il traffico, massimizzare il throughput o l'affidabilita. Quindi verrano scelti percorsi ad hoc per tali esigenze. 

Packet length
Rappresenta la lunghezza dell'intero pacchetto IP, compresi i dati. E di 16 bit, dunque il suo valore massimo è 2^16=65536, ma in genere non supera i 1500 byte.


Ora, vista la prima riga del pacchetti IP, per capire i campi della seconda bisogna comprendere prima cosa si intende per frammentazione e perchè un pacchetto IP viene frammentato.

Frammentazione
La frammentazione è una delle operazione svolte dal livello 3 insieme ad indirizzamento e instradamento. E' opportuno frammentare poichè un pacchetto quando viaggia può avere a che fare con tecnologie differenti. Ad esempio un router che ha una interfaccia  che utilizza una tecnologia IEE 802.3 (Ethernet) supporta MTU di 1500 byte, oppure altre tecnologie che permettono la comunicazione a grandi distanze possono avere trame al massimo di 526 byte.
Dunque è facile intuire che se il nostro pacchetto è di 3000 byte e deve essere inoltrato verso una interfaccia di rete che utilizza tecnologia IEE 802.3 è opportuno frammentare il pacchetto in due informazioni da 1500 byte ciascuna.

Identifier
Il campo identificatore "marchia" i pacchetti numerandoli, secondo una numerazione progressiva. Pertanto è utile a riconoscere frammenti che appartengono alla stesso pacchetto,quindi alla stessa informazione. Ad esempio, ritornando all'esempio precedente, nel caso in cui il nostro pacchetto da inviare sia di 3000 byte e questo debba essere diviso in due, il campo Identifier per i due frammenti sarà lo stesso.

Fragment Offset
I frammenti di un singolo pacchetto devono essere a loro volta ordinati. Di questo se ne occupa il campo fragment offset che rappresenta lo spiazzamento del frammento . Questo campo,di 13 bit è 0 per il primo frammento ed è orientato al byte.

Flag
Il campo flag è di soli 3 bit. Il bit più significativo(More fragment) di tale campo se posto ad uno indica che ci sono più frammenti per quel pacchetto. Ad esempio 100. Se invece il bit meno significativo e posto ad 1 , significa "Don't Fragment", cioè non si vuole che questo pacchetto venga frammentato per varie esigenze. Quindi è come se si stesse chiedendo al router di trovare percorsi alternativi, quindi interfacce di uscita con tecnologie tali che ci permettano di non dover frammentare il paccheto. Se il router non riesce nell'impresa il livello 3 lo dirà ai livelli superiori che a loro volta decideranno le azioni da svolgere.

Time to leave
Tradotto in italiano è il tempo di vita del pacchetto. E' un numero di 8 bit che indica quanti router intermedi può attraversare il pacchetto. Ogni volta che il pacchetto arriva in un router questo ne decrementa il time to leave di una unità; se il time to leave di un pacchetto è 0 il router provvede a scartarlo.
Si usa il time to leave per evitare di creare cicli nella rete e che un pacchetto vi possa viaggiare indefinitamente. Quindi questo fa presupporre che i protocolli di instradamento non sono perfetti e vengono adottate alcune precauzioni come il TTL.

Protocol
Questo campo risponde alla semplice domanda " A quale protocollo di livello trasporto va mandato questo pacchetto ?". Quindi identifica i vari protocolli , ad esempio il valore 6 indica il protocollo TCP e il valore 17 indica il protocollo UDP.  Questi valori sono consultabili sugli RFC publicati dalla IANA.

Checksum
Si occupa di fare un controllo sull'integrità del solo header IP, ma non dei dati.Quindi è un controllo errore abbastanza Ligth questo che fa il livello 3, proprio perché si presuppone che della integrità dei dati se ne occupi il livello collegamento.
La checksum consiste nel complemento ad 1 della somma dei byte dei campi di controllo.
Ogni router quando arriva il pacchetto calcola la propria checksum e vede se coincide con quella presente sul datagramma. Se dovesse essere diversa allora il pacchetto viene scartato.
Si noti che la checksum e il TTL sono gli unici due campi del pacchetto IP che vengono aggiornati di router in router.


Indirizzi IP sorgente e destinazione
Gli indirizzi IP svolgono la funzione di identificare univocamente un host nella rete. Ogni volta che viene generato un pacchetto vengono inseriti indirizzo IP sorgente e destinazione per raggiungere l'host destinatario.


Data
Nel campo data infine ci andranno i dati provenienti dai livelli superiori. In particolare la PDU del livello trasporto.




domenica 2 ottobre 2016

Progetto Android: codice fiscale

Dopo il primo esempio di generatore di codice fiscale in Java, ci poniamo la questione di risolvere lo stesso problema mediante un applicazione Android.
In questo post renderò disponibile la mia versione di generatore di codice fiscale.
Immergersi nella creazione di tale tipo di applicazione potrebbe essere utile a permettervi di comprendere i primi passi per sviluppare applicazioni per dispositivi mobili (almeno per me lo è stato).
Essendo un esempio, la grafica è abbastanza scarna, ma, se qualcuno desidera migliorarla metto a disposizione il codice sorgente per ulteriori sviluppi.
L'applicazione si presenta con una splash screen di durata 3 secondi, ma sensibile al touch se non si aspira ad attendere i fatidici secondi di attesa.


A seguire, l'app ci porrà di fronte 5 finestre che domanderanno rispettivamente il nome,il cognome,il sesso,la data di nascita e la città natale.
Sulla falsa riga del famoso libro "Il venditore di tempo" decidiamo di chiamare la persona di cui ambiamo a calcolare il codice fiscale Tizio Qualunque.




Ovviamente,per ciascuna finestra sussistono gli appositi controlli.Ad esempio provando ad inserire una qualsiasi data fantasiosa l'applicazione non proseguirà:


Dal momento che il 1995 non è un anno bisestile, febbraio non ha 29 giorni,dunque errore.
Inoltre è importante che il formato della data sia del tipo g/m/anno,come ad esempio 25/09/1958.
La stessa cosa accade in caso di inserimento di città inesistente:


Dopo aver adeguatamente compilato tutti i campi necessari passiamo al calcolo del codice fiscale di Tizio Qualunque che sarà:



E con questo è tutto, l'obiettivo di generare il codice fiscale di Tizio Qualunque è stato raggiunto.

Al seguente link metto a disposizione il file APK dell'applicazione appena illustrata : Codice fiscale . Basta solo scaricarlo e installarlo sul dispositivo Android con la procedura qui indicata-> Installare file APK.
Suggerisco inoltre ulteriori modifiche all'applicazione che potrebbero essere quella di gestire il fenomeno dell'omocodia, oppure fare il 'reverse' del codice fiscale. Cioè dal codice fiscale ottenere il sesso,la data di nascita e la città di nascita(con relativa provincia).



venerdì 12 agosto 2016

Esempio di prima applicazione Android : Convertitore Euro-Lira

Se siete alle prime armi con Android e in cerca di una applicazione con cui esercitarvi, successiva al classico "Hello World" vi propongo questo semplicissimo esempio di convertitore da Euro a Lira e viceversa .
L'implementazione è di facile realizzazione ,non a caso è un esempio di prima applicazione strumentale per comprendere i primissimi concetti e fattibile anche senza la piena conoscenza di tutti i componenti Android .
Propongo ora la mia versione dell'applicazione ,il cui APK è scaricabile qui -> Euro-Lira .Da questo è possibile ottenere il codice sorgente utile per osservare come l'applicazione viene realizzata.
Vediamo ora cosa fa con qualche esempio .
Ricordandosi la formula di conversione 1 Euro = 1936,27 Lire ,ecco un esempio di funzionamento in cui si desidera tramutare da Euro a Lira :


2 Euro corrispondono a 3827,54 Lire 

In questo esempio di conversione da Euro a Lira basta inserire nella EditText sotto la TextView il cui testo è "EURO"  la cifra desiderata ,toccare il bottone "Converti" e si ottiene la corrispondente cifra in Lire .

Il procedimento inverso ,ossia la conversione da Lire a Euro è speculare al precedente con la sola differenza che la cifra desiderata va inserita all'interno della EditText sotto la TextView il cui testo è "LIRA".


 6528 Lire corrispondono a 3,37 Euro 
                                                                                           
                                                
Ovviamente dal file APK messo a disposizione è possibile ottenere il codice sorgente attraverso piccoli accorgimenti facilmente individuabili sul Web  . Lo stesso ragionamento vale per l'installazione del file APK sul dispositivo ,il cui procedimento è anche disponibile qui : https://zangariappunti.blogspot.it/2016/07/how-to-install-apk-files.html .

venerdì 29 luglio 2016

How to install APK files

If you need to install an application outside Google Play for different reasons, you have to learn what is an APK file and how to intall it.
An APK file is an application package created for Android devices ,used to distribuite and to install  Android components.
Now let's see how to install it .
From your Android device you have to go  to Settings , scroll to Security and select Unkown Source.






The next step is to find the .apk  and download it  on your smartphone,tablet ,or computer. In this phase you have to be careful to malware, and download the APK from trusted Web sites .
Finally , you can find the APK file (using a File Manager) ,install it and it's done!
After the end of installation , is  recomended deselect Unkown Source , to avoid
 downloading dangerous applications .


lunedì 23 maggio 2016

Cos'è un firewall?

Sentiamo sovente parlare di firewall,di configurare un firewall e cosi via. Ma cos'è veramente un firewall in termini spiccioli? 
Un firewall(muro di protezione) è un modulo software o anche hardware posto tra un sistema affidabile e uno inaffidabile . Generalmente, il sistema non fidato è considerato internet(rete esterna) e il sistema fidato è considerato una rete locale (LAN) . Il firewall limita l'accesso di rete tra questi due domini,controlla e registra tutte le connessioni e al limite,a seconda della configurazione, potrebbe anche bloccarle . 
In alcuni casi è possibile prevedere  una rete parzialmente fidata ,detta zona smilitarizzata ,DMZ(demilitiarized zone).
Questo terzo dominio contiene sistemi che devono essere isolati dalla rete interna(cosi' da mantenerne l'integrità), ma che hanno bisogno di comunicare con l'esterno . Si pensi ad esempio ad un web server. 
In questo schema le connessioni sono consentite da internet ai calcolatori della DMZ e dalla rete locale alla rete internet,ma non da internet alla rete locale e ne dalla DMZ alla rete locale.



 

venerdì 13 maggio 2016

Traduttore testo-binario

Vi siete mai chiesti come suona il vostro nome in codice binario? Probabilmente no ,ma, se per eccesso di curiosità siete "ansiosi" di tradurre un testo in binario ,metto a disposizione una semplice GUI che realizza questo compito :

Ecco come si presenta la GUI


In realtà non si tratta di una vera e propria interpretazione da testo a binario ,ma , il tutto consiste in una traduzione dei caratteri(che compongono la stringa) in un numero univoco  secondo l'alfabeto Unicode. Questo numero viene poi tradotto in binario. Quindi,ricapitolando, è una traduzione da testo ad Unicode,e da Unicode a binario. 
Per chi non lo sapesse l'alfabeto Unicode è un sistema di codifica del testo,che assegna un numero ad ogni carattere .

mercoledì 11 maggio 2016

Memoria virtuale: Come facilita la vita dei programmatori?

Per permettere la multiprogrammazione è necessario caricare più processi possibile in memoria .Ma non è necessario che l'intero processo si trovi completamente in RAM per essere eseguito ; difatti, i processi non vengono mai caricati interamente in memoria centrale, ma "a pezzi". Lo stesso ragionamento è valido per il sistema operativo ad esempio.
Chi è avvezzo alla programmazione non avrà difficoltà ad immaginare questa situazione : si pensi per esempio ad un programma che contiene codice per gestire delle eccezioni o situazioni di errore. Spesso,sono porzioni di codice che verranno eseguite raramente e quindi non è necessario avere sempre il relativo codice in memoria. Insomma anche nei casi in cui è necessario disporre di tutto il programma è possibile che non serva tutto in una volta . Inoltre,per il principio di località  se la CPU sta eseguendo una certa istruzione,probabilmente la prossima istruzione ad essere eseguita sarà nelle vicinanze di quella correntemente in esecuzione.
Questo meccanismo di caricare "a pezzi" un programma è permesso dalla memoria virtuale.
Cos'è la memoria virtuale?
 La memoria virtuale è una tecnica che permette di eseguire i processi che possono anche non essere completamente in memoria . Non è altro che un meccanismo di separazione tra la memoria logica com'è vista dall'utente dalla memoria fisica . Cosi facendo i programmi possono essere anche più grandi della memoria fisica ,tanto vengono caricati a pezzi e quando si ha bisogno del "pezzo" non caricato in memoria ,ma che risiederà bensi' sul disco(page fault),lo si carica,oppure lo si rimpiazza con un altro pezzo di processo in memoria centrale se questa è piena(esistono degli appositi algoritmi di rimpiazzo delle pagine) . Questa tecnica ,inoltre, permette di aumentare il grado di multiprogrammazione poichè ogni programma ha bisogno di meno memoria fisica e questo permette di caricare più programmi in memoria,ottenendo una maggiore produttività della CPU senza aumentarne il tempo di risposta(http://zangariappunti.blogspot.it/2016/04/scheduling-della-cpu.html).L'unico svantaggio di questo meccanismo è di non essere semplice da realizzare e può ridurre le prestazioni del sistema .



Tornando a noi...
Ora,dovrebbe essere semplice rispondere alla domanda posta nel titolo del post (Come facilita la vita dei programmatori?). La risposta è semplice, questi, infatti non necessitano affatto di preoccuparsi della quantità di memoria fisica disponibile per i motivi sopra citati.
La  memoria virtuale viene realizzata per tramite della paginazione su richiesta . Con questa i "pezzi dei processo" ,di cui parlavo prima ,si dicono pagine e chi si occupa di "spostare" le pagine da memoria a disco e viceversa ,è il paginatore.