Funzione PHP getprotobynumber(): Tutto quello che devi sapere
Scopri come usare la funzione PHP getprotobynumber() per ottenere il nome di un protocollo a partire dal suo numero numerico nel database di sistema.
I protocolli di rete viaggiano sulla rete come numeri, non come nomi. In un pacchetto IP, TCP è 6, UDP è 17 e ICMP è 1 — non è presente alcuna etichetta leggibile dall'uomo. Quando il codice PHP legge un numero di protocollo grezzo (ad esempio da un pacchetto analizzato, un log di firewall o un'altra chiamata di rete a livello C), spesso si desidera riconvertire quel numero in un nome leggibile. La funzione getprotobynumber() fa esattamente questo: cerca un numero di protocollo e restituisce il suo nome registrato.
Questo capitolo spiega cosa restituisce la funzione, come legge il database di protocolli del sistema, le insidie riguardanti la portabilità e come si abbina alla sua funzione inversa, getprotobyname().
Che cos'è la funzione getprotobynumber()?
getprotobynumber() è una funzione PHP integrata che associa un identificatore numerico di protocollo al suo nome di protocollo registrato. Legge dal database dei protocolli del sistema — tipicamente /etc/protocols sui sistemi Unix-like, oppure %SystemRoot%\system32\drivers\etc\protocol su Windows — e restituisce il nome corrispondente come string.
Un malinteso comune è che restituisca un array. Non è così: il valore di ritorno è una semplice string come "tcp", oppure false se nessun protocollo con quel numero è registrato nel sistema. Poiché la ricerca dipende dal file di protocolli locale, lo stesso numero può in teoria risolversi in modo diverso tra sistemi operativi, sebbene i numeri di protocollo più noti siano standardizzati da IANA e coerenti ovunque.
Sintassi
getprotobynumber(int $protocol): string|falseLa funzione accetta un parametro:
$protocol: Il numero di protocollo da cercare (ad esempio6per TCP).
Restituisce il nome del protocollo come string in caso di successo, oppure false se il numero non viene trovato nel database dei protocolli.
Esempio di base
Il numero di protocollo 6 corrisponde a TCP. L'esempio seguente lo cerca e gestisce esplicitamente il caso di fallimento con un confronto stretto (===), poiché false è l'unico segnale di errore:
Output:
Protocol number 6 is 'tcp'Usa il confronto stretto === anziché !$protocol_name, perché un nome valido è sempre una string non vuota — ma verificare esplicitamente false mantiene chiaro l'intento ed evita casi limite.
Numeri di protocollo comuni
Questi numeri ben noti sono standardizzati da IANA e presenti praticamente su ogni sistema:
| Numero | Nome | Descrizione |
|---|---|---|
0 | ip | Protocollo Internet |
1 | icmp | Protocollo di controllo messaggi Internet |
2 | igmp | Protocollo di gestione gruppi Internet |
6 | tcp | Protocollo di controllo trasmissione |
17 | udp | Protocollo datagramma utente |
41 | ipv6 | Incapsulamento IPv6 |
47 | gre | Incapsulamento generico di routing |
58 | ipv6-icmp | ICMP per IPv6 |
Puoi iterare un intervallo per vedere quali numeri riconosce il tuo sistema:
<?php
foreach ([1, 6, 17, 132, 9999] as $number) {
$name = getprotobynumber($number);
echo $number . ' => ' . ($name === false ? '(unknown)' : $name) . PHP_EOL;
}Un numero come 9999 non è assegnato, quindi la ricerca restituisce false e stampa (unknown).
getprotobynumber() vs getprotobyname()
Le due funzioni sono esatte inverse l'una dell'altra:
getprotobynumber(6)restituisce la string"tcp".getprotobyname("tcp")restituisce l'intero6.
Usa getprotobynumber() quando hai un numero grezzo (da un pacchetto, un log o una chiamata socket) e hai bisogno di un nome leggibile. Usa getprotobyname() quando hai un nome e hai bisogno del numero — ad esempio per passarlo come argomento $protocol quando apri un socket grezzo.
Quando usarla?
- Lettura di catture di pacchetti o log di firewall, che registrano il campo numerico del protocollo nell'intestazione IP.
- Visualizzazione di output leggibile in strumenti di diagnostica o monitoraggio di rete.
- Validazione del fatto che un numero di protocollo sia conosciuto dal sistema prima di agire su di esso.
Per il networking di livello superiore si ricorre più spesso agli helper di ricerca host e servizio: getservbyport() e getservbyname() mappano le porte ai nomi di servizio, mentre gethostbyname() risolve i nomi host.
Conclusione
getprotobynumber() converte un identificatore numerico di protocollo nel suo nome registrato, restituendo una string (non un array) oppure false quando il numero è sconosciuto. Legge il database dei protocolli locale ed è l'inversa di getprotobyname(). Sapere che restituisce una semplice string — e verificare false con un confronto stretto — è la chiave per usarla correttamente.