Fonction PHP getprotobynumber() : Tout ce que vous devez savoir
Apprenez à utiliser getprotobynumber() en PHP pour obtenir le nom d'un protocole réseau à partir de son numéro d'identification.
Les protocoles réseau transitent sur le fil sous forme de nombres, et non de noms. Dans un paquet IP, TCP vaut 6, UDP vaut 17 et ICMP vaut 1 — aucune étiquette lisible par un humain n'y est attachée. Lorsqu'un code PHP lit un numéro de protocole brut (par exemple issu d'un paquet analysé, d'un journal de pare-feu ou d'un autre appel réseau de niveau C), on souhaite souvent reconvertir ce numéro en un nom lisible. La fonction getprotobynumber() fait exactement cela : elle recherche un numéro de protocole et renvoie son nom enregistré.
Ce chapitre explique ce que renvoie la fonction, comment elle lit la base de données des protocoles système, les pièges liés à la portabilité, et comment elle s'associe à sa fonction inverse, getprotobyname().
Qu'est-ce que la fonction getprotobynumber() ?
getprotobynumber() est une fonction PHP intégrée qui associe un identifiant de protocole numérique à son nom de protocole enregistré. Elle lit la base de données des protocoles du système — généralement /etc/protocols sur les systèmes de type Unix, ou %SystemRoot%\system32\drivers\etc\protocol sous Windows — et renvoie le nom correspondant sous forme de string.
Une idée reçue fréquente est qu'elle renvoie un array. Ce n'est pas le cas : la valeur de retour est une string simple telle que "tcp", ou false si aucun protocole portant ce numéro n'est enregistré sur le système. Comme la recherche dépend du fichier de protocoles local, un même numéro peut théoriquement se résoudre différemment selon les systèmes d'exploitation, bien que les numéros de protocoles bien connus soient standardisés par l'IANA et cohérents partout.
Syntaxe
getprotobynumber(int $protocol): string|falseLa fonction prend un paramètre :
$protocol: Le numéro de protocole à rechercher (par exemple6pour TCP).
Elle renvoie le nom du protocole sous forme de string en cas de succès, ou false si le numéro n'est pas trouvé dans la base de données des protocoles.
Exemple de base
Le numéro de protocole 6 correspond à TCP. L'exemple ci-dessous effectue la recherche et gère explicitement le cas d'échec avec une comparaison stricte (===), car false est le seul signal d'erreur :
Résultat :
Protocol number 6 is 'tcp'Utilisez la comparaison stricte === plutôt que !$protocol_name, car un nom valide est toujours une string non vide — mais vérifier explicitement contre false rend l'intention claire et évite les cas limites.
Numéros de protocoles courants
Ces numéros bien connus sont standardisés par l'IANA et présents sur pratiquement tous les systèmes :
| Numéro | Nom | Description |
|---|---|---|
0 | ip | Internet Protocol |
1 | icmp | Internet Control Message Protocol |
2 | igmp | Internet Group Management Protocol |
6 | tcp | Transmission Control Protocol |
17 | udp | User Datagram Protocol |
41 | ipv6 | Encapsulation IPv6 |
47 | gre | Generic Routing Encapsulation |
58 | ipv6-icmp | ICMP pour IPv6 |
Vous pouvez itérer sur une plage pour voir quels numéros votre système reconnaît :
<?php
foreach ([1, 6, 17, 132, 9999] as $number) {
$name = getprotobynumber($number);
echo $number . ' => ' . ($name === false ? '(unknown)' : $name) . PHP_EOL;
}Un numéro comme 9999 n'est pas attribué, donc la recherche renvoie false et affiche (unknown).
getprotobynumber() vs getprotobyname()
Les deux fonctions sont des inverses exactes l'une de l'autre :
getprotobynumber(6)renvoie la string"tcp".getprotobyname("tcp")renvoie l'entier6.
Utilisez getprotobynumber() lorsque vous disposez d'un numéro brut (issu d'un paquet, d'un journal ou d'un appel socket) et avez besoin d'un nom lisible. Utilisez getprotobyname() lorsque vous avez un nom et avez besoin du numéro — par exemple pour le passer comme argument $protocol lors de l'ouverture d'un socket brut.
Quand l'utiliser ?
- Lecture de captures de paquets ou de journaux de pare-feu, qui enregistrent le champ de protocole numérique de l'en-tête IP.
- Affichage de sorties conviviales dans des outils de diagnostic ou de surveillance réseau.
- Validation qu'un numéro de protocole est connu de votre système avant d'agir dessus.
Pour la mise en réseau de plus haut niveau, vous ferez plus souvent appel aux helpers de recherche d'hôte et de service : getservbyport() et getservbyname() associent les ports aux noms de services, tandis que gethostbyname() résout les noms d'hôtes.
Conclusion
getprotobynumber() convertit un identifiant de protocole numérique en son nom enregistré, renvoyant une string (et non un array) ou false lorsque le numéro est inconnu. Elle lit la base de données des protocoles locale et est l'inverse de getprotobyname(). Savoir qu'elle renvoie une string simple — et vérifier false avec une comparaison stricte — est la clé pour l'utiliser correctement.