Função PHP getprotobynumber(): Tudo o Que Você Precisa Saber
Saiba como usar a função PHP getprotobynumber() para obter o nome do protocolo associado a um número de protocolo.
Os protocolos de rede trafegam pela rede como números, não como nomes. Em um pacote IP, o TCP é 6, o UDP é 17 e o ICMP é 1 — não há nenhum rótulo legível por humanos associado. Quando o código PHP lê um número de protocolo bruto (por exemplo, de um pacote analisado, um log de firewall ou outra chamada de rede em nível C), muitas vezes você quer converter esse número de volta a um nome legível. A função getprotobynumber() faz exatamente isso: ela pesquisa um número de protocolo e retorna o nome registrado correspondente.
Este capítulo explica o que a função retorna, como ela lê o banco de dados de protocolos do sistema, as armadilhas relacionadas à portabilidade e como ela se combina com sua inversa, getprotobyname().
O que é a Função getprotobynumber()?
getprotobynumber() é uma função PHP embutida que mapeia um identificador numérico de protocolo para o nome de protocolo registrado correspondente. Ela lê a partir do banco de dados de protocolos do sistema — tipicamente /etc/protocols em sistemas Unix, ou %SystemRoot%\system32\drivers\etc\protocol no Windows — e retorna o nome correspondente como uma string.
Um equívoco comum é que ela retorna um array. Não retorna: o valor de retorno é uma string simples como "tcp", ou false se nenhum protocolo com esse número estiver registrado no sistema. Como a pesquisa depende do arquivo de protocolo local, o mesmo número pode, em teoria, ser resolvido de forma diferente entre sistemas operacionais, embora os números de protocolo conhecidos sejam padronizados pela IANA e consistentes em todos os lugares.
Sintaxe
getprotobynumber(int $protocol): string|falseA função aceita um parâmetro:
$protocol: O número do protocolo a ser pesquisado (por exemplo,6para TCP).
Ela retorna o nome do protocolo como string em caso de sucesso, ou false se o número não for encontrado no banco de dados de protocolos.
Exemplo Básico
O número de protocolo 6 é o TCP. O exemplo abaixo pesquisa esse número e trata o caso de falha explicitamente com uma comparação estrita (===), já que false é o único sinal de erro:
Saída:
Protocol number 6 is 'tcp'Use a comparação estrita === em vez de !$protocol_name, porque um nome válido é sempre uma string não vazia — mas verificar contra false explicitamente mantém a intenção clara e evita casos extremos.
Números de Protocolo Comuns
Estes números bem conhecidos são padronizados pela IANA e estão presentes em praticamente todos os sistemas:
| Número | Nome | Descrição |
|---|---|---|
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 | Encapsulamento IPv6 |
47 | gre | Generic Routing Encapsulation |
58 | ipv6-icmp | ICMP para IPv6 |
Você pode iterar um intervalo para ver quais números seu sistema reconhece:
<?php
foreach ([1, 6, 17, 132, 9999] as $number) {
$name = getprotobynumber($number);
echo $number . ' => ' . ($name === false ? '(unknown)' : $name) . PHP_EOL;
}Um número como 9999 não está atribuído, portanto a pesquisa retorna false e imprime (unknown).
getprotobynumber() vs getprotobyname()
As duas funções são inversas exatas uma da outra:
getprotobynumber(6)retorna a string"tcp".getprotobyname("tcp")retorna o inteiro6.
Use getprotobynumber() quando você tiver um número bruto (de um pacote, log ou chamada de socket) e precisar de um nome legível. Use getprotobyname() quando você tiver um nome e precisar do número — por exemplo, para passar como argumento $protocol ao abrir um socket bruto.
Quando Eu Usaria Isso?
- Leitura de capturas de pacotes ou logs de firewall, que registram o campo numérico do protocolo no cabeçalho IP.
- Exibição de saída amigável em ferramentas de diagnóstico ou monitoramento de rede.
- Validação de que um número de protocolo é reconhecido pelo seu sistema antes de agir sobre ele.
Para redes de nível mais alto, você recorrerá com mais frequência aos auxiliares de pesquisa de host e serviço: getservbyport() e getservbyname() mapeiam portas para nomes de serviço, enquanto gethostbyname() resolve nomes de host.
Conclusão
getprotobynumber() converte um identificador numérico de protocolo em seu nome registrado, retornando uma string (não um array) ou false quando o número é desconhecido. Ela lê o banco de dados de protocolos local e é a inversa de getprotobyname(). Saber que ela retorna uma string simples — e verificar false com uma comparação estrita — é a chave para usá-la corretamente.