Pillole di TCP/IP: l’utility PING

Spread the love

Ping è un programma disponibile in tutti i sistemi operativi che permette di controllare se un host o più in generale, una qualsiasi interfaccia di rete anche di un router, è raggiungibile dal punto in cui siamo.

Ping è una utility che invia e riceve messaggi ICMP (Internet Control Message Protocol). Partiamo da questo protocollo.

ICMP è un protocollo (in sostanza, come tutti i protocolli, un set di comandi per svolgere una determinata operazione) di supporto della più vasta suite IP (Internet Protocol). Con ICMP non si trasferiscono messaggi creati dall’utente ma solo informazioni sullo stato della rete, di solito elaborate dagli stessi dispositivi che se li scambiano.

ICMP è stato definito dallo IANA nel settembre del 1981 per opera di Jon Postel (il papà anche di FTP e di DNS). La RFC in cui è definito è la rfc792.

I messaggi ICMP vengono inviati in diverse situazioni: per esempio, quando un datagramma (un pacchetto) non riesce a raggiungere la sua destinazione; quando un gateway (uno “smistatore”) non ha la capacità di accumulazione (buffering) necessaria per reindirizzare un pacchetto o quando il gateway può forzare l’host a inoltrare il traffico su un percorso (route) più corto. [1]

Facciamo anche un piccolo approfondimento sulla suite TCP/IP completa.

ICMP usa la suite IP come se fosse un protocollo di grado superiore, come TCP o UDP, ma è progettato come tutti i protocolli IP per essere non assolutamente affidabile (not absolutely reliable), in quanto non viene fatto un controllo sulla correttezza della trasmissione. Quindi ICMP è a tutti gli effetti parte del protocollo IP.

Infatti, il protocollo IP non è stato progettato per essere assolutamente affidabile. Lo scopo di questi messaggi di controllo è di fornire un feedback sui problemi di comunicazione, non quella di rendere il protocollo IP affidabile. Non c’è nemmeno la garanzia che un pacchetto di controllo sarà effettivamente inoltrato oppure che sarà  effettivamente ricevuto. Qualche pacchetto può venire perso (e con PING molte volte si può vedere che capita) senza alcuna informazione di ritorno sulla loro perdita. Nel quadro del protocollo TCP/IP, sono gli stessi protocolli di ordine superiore costruiti sopra IP che devono implementare le loro specifiche procedure di controllo se è richiesta una comunicazione affidabile.

Questo per una visione generale nel quadro del procollo TCP/IP.

I messaggi ICMP sono quindi dei datagrammi incapsulati dentro a pacchetti IP e sono usati sia con i protocolli IPv4 che con IPv6. Questi pacchetti partono con una intestazione IP, seguita dall’intestazione ICMP, il tipo, il codice, il codice di controllo (checksum) e i dati da trasmettere che sono determinati univocamente dai campi tipo e codice che identificano il messaggio da inviare. [2]

I tipi di messaggi ICMP che vengono  inviati esplorativamente per saggiare lo stato della rete, informano l’host sul verificarsi di varie circostanze:

  • rete non raggiungibile o di host non raggiungibile (Destination Unreacheable Message),
  • gateway sovraccarico (source quence message)
  • echo
  • Time Exceeded

 

I messaggi ICMP sono trasmessi con un messaggio IP ordinario la cui intestazione è

  • Versione (4 o 6)
  • IHL (Internet Header Length) di 32 bit
  • Tipo di servizio: 0
  • Identificazione, flag, fragment offset
  • TTL (Time To Live in secondi): essendo questo campo decrementato di uno da ogni macchina attraversata dal datagramma, il suo valore dovrebbe essere maggiore o uguale al numero di gateway che il datagramma attraversa.
    In altre parole, ogni router che prende in consegna un messaggio ICMP, decrementa questo valore di 1 e il pacchetto viene preso in gestione finché questo numero è positivo. Quando esso si annulla, il pacchetto viene scartato e non più inoltrato. Questo ha a che vedere con gli hop necessari a inviare un messaggio ICMP (un messaggio IP in generale) dalla sorgente alla destinazione. I nodi che può attraversare sono molti e uno degli scopi di ICMP è quello di trovare un routing ottimale che minimizzi il numero di hop necessari.
  • Protocollo: ICMP = 1
  • Header Checksum: codice di controllo dell’header, nella prima versione della RFC è i complemento a 1 dei primi 16 bit dell’header
  • Indirizzo IP sorgente
  • Indirizzo IP destinazione

La parte dati del datagramma poi inizia con il tipo del messaggio ICMP; i messaggi ICMP hanno tutti questa forma:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  <-- 32 bit
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             unused                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Internet Header + 64 bits of Original Data Datagram      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

I tipi di messaggio (network/destination unreacheable, echo, time exceeded, …) sono determinati dal Type e dal Code.

Noi siamo partiti dal comando PING che in sostanza è l’invio un messaggio ICMP di tipo echo, ma i messaggi ICMP sono ordinariamente inviati dai vari dispositivi per informarsi sullo stato della rete.

Nel caso del ping, come detto, implementiamo un messaggio echo o reply che è così costituito:

  • Type: 0 (se messaggio echo) oppure 8 (se messaggio reply)
  • Code: 0
  • Checksum
  • Identificatore
  • Numero di sequenza, che è l’icmp_seq che leggiamo nel ping:
$ ping www.google.com
PING www.google.com (172.217.21.68) 56(84) bytes of data.
64 bytes from mrs08s05-in-f4.1e100.net (172.217.21.68): icmp_seq=1 ttl=49 time=78.1 ms
64 bytes from mrs08s05-in-f4.1e100.net (172.217.21.68): icmp_seq=2 ttl=49 time=64.4 ms
64 bytes from mrs08s05-in-f4.1e100.net (172.217.21.68): icmp_seq=3 ttl=49 time=60.9 ms
^C
--- www.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 60.902/67.815/78.141/7.440 ms

Come funziona il datagramma ICMP di tipo echo/reply

I dati ricevuti dal messaggio di echo devono essere ritornati nel messaggio echo di risposta (reply).
L’identificatore e il numero di sequenza posso essere usati dal mittente il messaggio di echo per agevolare il confronto delle risposte con le richieste di echo.
Per esempio l’identificatore può essere usato come una porta TCP/UDP per identificare una sessione, e il numero di sequenza può essere incrementato da ogni invio di una richiesta echo. Il destinatario (echoer) ritornerà questi stessi valori nella risposta all’echo.

Quindi nell’output del messaggio ping vediamo il TTL, la sequenza del pacchetto e il round trip time (tempo di andata e ritorno tra un messaggio di echo e uno di reply).

Un’altra cosa importante nei messaggi ICMP è che non vengono creati messaggi ICMP per inoltrare messaggi ICMP (controllo lo stato della rete per mandare un messaggio di controllo di stato della rete) perché questo porterebbe presto al blocco dei dispositivi. A questo proposito, un ultimo aspetto importante da considerare è che spesso il comando ping non è determinante nel caratterizzare la raggiungibilità di un host. Infatti posso fare in modo che un certo host rigetti i comandi di echo per evitare di impegnare risorse a inoltrare un comando reply. Infatti ping spesso viene usato come attacco dDOS.

Quindi potremmo avere un web server perfettamente rispondente anche se non è reattivo al ping.

 

Bibliografia

[1] http://www.ietf.org/rfc/rfc792.txt

[2] https://www.pcwdld.com/what-is-icmp-and-port

Image: Piaxabay Creative Commons CC0

Lascia un commento

Your email address will not be published.