W3docs

Función PHP getprotobynumber(): Todo lo que necesitas saber

Aprende a usar la función PHP getprotobynumber() para obtener el nombre de protocolo asociado a un número de protocolo dado.

Los protocolos de red viajan por la red como números, no como nombres. En un paquete IP, TCP es 6, UDP es 17 e ICMP es 1 — no hay ninguna etiqueta legible para los humanos adjunta. Cuando el código PHP lee un número de protocolo sin procesar (por ejemplo, de un paquete analizado, un registro de firewall u otra llamada de red a nivel C), a menudo querrás convertir ese número de vuelta en un nombre legible. La función getprotobynumber() hace exactamente eso: busca un número de protocolo y devuelve su nombre registrado.

Este capítulo explica qué devuelve la función, cómo lee la base de datos de protocolos del sistema, los problemas de portabilidad y cómo se combina con su inversa, getprotobyname().

¿Qué es la función getprotobynumber()?

getprotobynumber() es una función integrada de PHP que mapea un identificador de protocolo numérico a su nombre de protocolo registrado. Lee de la base de datos de protocolos del sistema — normalmente /etc/protocols en sistemas tipo Unix, o %SystemRoot%\system32\drivers\etc\protocol en Windows — y devuelve el nombre coincidente como un string.

Un malentendido común es que devuelve un array. No es así: el valor de retorno es un string simple como "tcp", o false si no hay ningún protocolo con ese número registrado en el sistema. Dado que la búsqueda depende del archivo de protocolos local, el mismo número puede en teoría resolverse de forma diferente en distintos sistemas operativos, aunque los números de protocolo bien conocidos están estandarizados por la IANA y son consistentes en todas partes.

Sintaxis

getprotobynumber(int $protocol): string|false

La función toma un parámetro:

  • $protocol: El número de protocolo a buscar (por ejemplo 6 para TCP).

Devuelve el nombre del protocolo como un string en caso de éxito, o false si el número no se encuentra en la base de datos de protocolos.

Ejemplo básico

El número de protocolo 6 es TCP. El siguiente ejemplo lo busca y maneja el caso de fallo explícitamente con una comparación estricta (===), ya que false es la única señal de error:

php— editable, runs on the server

Salida:

Protocol number 6 is 'tcp'

Utiliza la comparación estricta === en lugar de !$protocol_name, porque un nombre válido es siempre un string no vacío — pero comparar explícitamente con false mantiene la intención clara y evita casos límite.

Números de protocolo comunes

Estos números bien conocidos están estandarizados por la IANA y presentes en prácticamente todos los sistemas:

NúmeroNombreDescripción
0ipInternet Protocol
1icmpInternet Control Message Protocol
2igmpInternet Group Management Protocol
6tcpTransmission Control Protocol
17udpUser Datagram Protocol
41ipv6Encapsulación IPv6
47greGeneric Routing Encapsulation
58ipv6-icmpICMP para IPv6

Puedes iterar un rango para ver qué números reconoce tu sistema:

<?php

foreach ([1, 6, 17, 132, 9999] as $number) {
  $name = getprotobynumber($number);
  echo $number . ' => ' . ($name === false ? '(unknown)' : $name) . PHP_EOL;
}

Un número como 9999 no está asignado, por lo que la búsqueda devuelve false e imprime (unknown).

getprotobynumber() vs getprotobyname()

Las dos funciones son inversas exactas entre sí:

Usa getprotobynumber() cuando tienes un número sin procesar (de un paquete, registro o llamada a socket) y necesitas un nombre legible. Usa getprotobyname() cuando tienes un nombre y necesitas el número — por ejemplo, para pasarlo como argumento $protocol al abrir un socket sin procesar.

¿Cuándo usaría esto?

  • Leer capturas de paquetes o registros de firewall, que registran el campo de protocolo numérico del encabezado IP.
  • Mostrar salida legible para humanos en herramientas de diagnóstico o monitoreo de red.
  • Validar que un número de protocolo sea uno que tu sistema reconozca antes de actuar sobre él.

Para redes de nivel superior, a menudo recurrirás a los helpers de búsqueda de host y servicio: getservbyport() y getservbyname() mapean puertos a nombres de servicio, mientras que gethostbyname() resuelve nombres de host.

Conclusión

getprotobynumber() convierte un identificador de protocolo numérico en su nombre registrado, devolviendo un string (no un array) o false cuando el número es desconocido. Lee la base de datos de protocolos local y es la inversa de getprotobyname(). Saber que devuelve un string simple — y verificar si es false con una comparación estricta — es la clave para usarla correctamente.

Práctica

Práctica
¿Qué función en PHP se usa para obtener el nombre de cualquier número de protocolo?
¿Qué función en PHP se usa para obtener el nombre de cualquier número de protocolo?
Was this page helpful?