Función PHP getprotobyname(): Todo lo que necesitas saber
Aprende a usar la función PHP getprotobyname() para obtener el número de protocolo asociado a un nombre de protocolo dado.
Cuando trabajas con redes de bajo nivel en PHP, a veces tienes un nombre de protocolo como tcp o udp pero necesitas su número de protocolo numérico — el valor asignado a ese protocolo por la IANA y usado dentro de las cabeceras de paquetes IP. La función getprotobyname() realiza exactamente esa búsqueda. Esta página cubre su sintaxis, valor de retorno, números de protocolo comunes, manejo de errores y cómo se relaciona con las demás funciones de búsqueda de protocolos/servicios en PHP.
¿Qué es la función getprotobyname()?
La función getprotobyname() es una función integrada de PHP que mapea un nombre de protocolo a su número correspondiente. Lee la base de datos de protocolos del sistema — normalmente /etc/protocols en sistemas tipo Unix y %SystemRoot%\System32\drivers\etc\protocol en Windows — por lo que los nombres que reconoce son los que aparecen listados allí (por ejemplo ip, icmp, tcp, udp, ipv6).
Es la inversa de getprotobynumber(), que convierte un número de vuelta en un nombre. Normalmente necesitas un número de protocolo sin procesar cuando abres un socket raw con socket_create() y APIs de bajo nivel similares, donde el protocolo debe especificarse numéricamente.
Sintaxis
getprotobyname(string $protocol): int|falseLa función acepta un parámetro:
$protocol— el nombre del protocolo a buscar. La búsqueda no distingue entre mayúsculas y minúsculas, por lo que"TCP"y"tcp"devuelven el mismo resultado.
Devuelve un entero que representa el número de protocolo, o false si el nombre del protocolo no se encuentra en la base de datos del sistema.
Ejemplo básico
A continuación se muestra cómo buscar el número del protocolo tcp y manejar el caso en que la búsqueda falla:
Para "tcp" esto imprime:
The protocol number for protocol name tcp is 6Observa la comparación estricta === false. Dado que el número de protocolo válido más pequeño es 0 (el protocolo ip), una comprobación no estricta como if (!$protocol_number) trataría erróneamente una búsqueda exitosa de ip como un fallo. Compara siempre con false usando ===.
Números de protocolo comunes
Estos son los valores que verás con más frecuencia. Provienen directamente de la base de datos de protocolos del sistema, por lo que son estables en todas las plataformas:
| Nombre del protocolo | Número | Significado |
|---|---|---|
ip | 0 | Protocolo de Internet |
icmp | 1 | Protocolo de mensajes de control de Internet |
tcp | 6 | Protocolo de control de transmisión |
udp | 17 | Protocolo de datagramas de usuario |
ipv6 | 41 | Protocolo de Internet v6 |
Búsqueda de varios protocolos
Puedes iterar sobre una lista de nombres e informar cada resultado, tratando los nombres desconocidos de forma adecuada:
<?php
$protocols = ["tcp", "udp", "icmp", "bogus"];
foreach ($protocols as $name) {
$number = getprotobyname($name);
if ($number === false) {
echo "$name: not found\n";
} else {
echo "$name => $number\n";
}
}Esto produce:
tcp => 6
udp => 17
icmp => 1
bogus: not found¿Cuándo usaría esto?
En el desarrollo web cotidiano rara vez necesitas números de protocolo — fopen(), cURL y los envoltorios de flujos aceptan URLs, no números sin procesar. Recurrirás a getprotobyname() cuando bajes un nivel más:
- Creación de sockets raw.
socket_create(AF_INET, SOCK_RAW, getprotobyname("icmp"))escribe el número de protocolo en el socket. Codificar1directamente funciona, perogetprotobyname("icmp")documenta la intención y permanece correcto si la base de datos difiere. - Construcción o análisis de paquetes IP, donde el campo de protocolo es numérico.
- Herramientas de red y diagnósticos que reportan tanto el nombre como el número de un protocolo.
Funciones relacionadas
getprotobynumber()— la búsqueda inversa: de número a nombre.getservbyname()— mapea un nombre de servicio (comohttp) más un protocolo a un número de puerto.getservbyport()— la inversa: de número de puerto a nombre de servicio.fsockopen()— abre una conexión de red por host y puerto.
Conclusión
getprotobyname() resuelve un nombre de protocolo al número de protocolo numérico definido en la base de datos del sistema, devolviendo false cuando el nombre es desconocido. Recuerda probar el resultado con una comparación estricta === false para que el valor válido 0 del protocolo ip no se confunda con un error, y recurre a esta función siempre que una API de red de bajo nivel espere un protocolo numérico en lugar de un nombre.