W3docs

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|false

La funzione accetta un parametro:

  • $protocol: Il numero di protocollo da cercare (ad esempio 6 per 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:

php— editable, runs on the server

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:

NumeroNomeDescrizione
0ipProtocollo Internet
1icmpProtocollo di controllo messaggi Internet
2igmpProtocollo di gestione gruppi Internet
6tcpProtocollo di controllo trasmissione
17udpProtocollo datagramma utente
41ipv6Incapsulamento IPv6
47greIncapsulamento generico di routing
58ipv6-icmpICMP 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:

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.

Pratica

Pratica
Quale funzione PHP viene utilizzata per ottenere il nome di qualsiasi numero di protocollo?
Quale funzione PHP viene utilizzata per ottenere il nome di qualsiasi numero di protocollo?
Was this page helpful?