PHP getprotobynumber() Funktion: Alles, was Sie wissen müssen
Erfahren Sie, wie die PHP-Funktion getprotobynumber() eine Protokollnummer in einen registrierten Protokollnamen umwandelt – mit Beispielen.
Netzwerkprotokolle werden als Zahlen übertragen, nicht als Namen. In einem IP-Paket ist TCP 6, UDP 17 und ICMP 1 — es gibt kein für Menschen lesbares Label. Wenn PHP-Code eine rohe Protokollnummer liest (zum Beispiel aus einem geparsten Paket, einem Firewall-Log oder einem anderen C-Level-Netzwerkaufruf), möchte man diese Zahl oft in einen lesbaren Namen umwandeln. Die Funktion getprotobynumber() tut genau das: Sie sucht eine Protokollnummer und gibt den registrierten Namen zurück.
Dieses Kapitel erklärt, was die Funktion zurückgibt, wie sie die System-Protokolldatenbank liest, welche Portabilitätsfallen es gibt und wie sie mit ihrer Umkehrfunktion getprotobyname() zusammenarbeitet.
Was ist die getprotobynumber() Funktion?
getprotobynumber() ist eine eingebaute PHP-Funktion, die einen numerischen Protokollbezeichner dem registrierten Protokollnamen zuordnet. Sie liest aus der Protokolldatenbank des Systems — typischerweise /etc/protocols auf Unix-ähnlichen Systemen oder %SystemRoot%\system32\drivers\etc\protocol unter Windows — und gibt den passenden Namen als string zurück.
Ein häufiges Missverständnis ist, dass sie ein array zurückgibt. Das tut sie nicht: Der Rückgabewert ist ein einfacher string wie "tcp", oder false, wenn kein Protokoll mit dieser Nummer im System registriert ist. Da die Suche von der lokalen Protokolldatei abhängt, kann dieselbe Nummer theoretisch auf verschiedenen Betriebssystemen unterschiedlich aufgelöst werden, obwohl die bekannten Protokollnummern von der IANA standardisiert und überall einheitlich sind.
Syntax
getprotobynumber(int $protocol): string|falseDie Funktion akzeptiert einen Parameter:
$protocol: Die zu suchende Protokollnummer (zum Beispiel6für TCP).
Sie gibt den Protokollnamen als string zurück, wenn die Suche erfolgreich war, oder false, wenn die Nummer nicht in der Protokolldatenbank gefunden wird.
Einfaches Beispiel
Die Protokollnummer 6 steht für TCP. Das folgende Beispiel sucht sie und behandelt den Fehlerfall explizit mit einem strikten (===) Vergleich, da false das einzige Fehlersignal ist:
Ausgabe:
Protocol number 6 is 'tcp'Verwenden Sie den strikten ===-Vergleich statt !$protocol_name, da ein gültiger Name immer ein nicht-leerer string ist — aber das explizite Prüfen auf false macht die Absicht klar und vermeidet Grenzfälle.
Häufige Protokollnummern
Diese bekannten Nummern sind von der IANA standardisiert und auf praktisch jedem System vorhanden:
| Nummer | Name | Beschreibung |
|---|---|---|
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 | IPv6-Kapselung |
47 | gre | Generic Routing Encapsulation |
58 | ipv6-icmp | ICMP für IPv6 |
Sie können einen Bereich durchlaufen, um zu sehen, welche Nummern Ihr System erkennt:
<?php
foreach ([1, 6, 17, 132, 9999] as $number) {
$name = getprotobynumber($number);
echo $number . ' => ' . ($name === false ? '(unknown)' : $name) . PHP_EOL;
}Eine Nummer wie 9999 ist nicht vergeben, daher gibt die Suche false zurück und gibt (unknown) aus.
getprotobynumber() vs getprotobyname()
Die beiden Funktionen sind genaue Umkehrungen voneinander:
getprotobynumber(6)gibt den string"tcp"zurück.getprotobyname("tcp")gibt den Integer6zurück.
Verwenden Sie getprotobynumber(), wenn Sie eine rohe Zahl haben (aus einem Paket, Log oder Socket-Aufruf) und einen lesbaren Namen benötigen. Verwenden Sie getprotobyname(), wenn Sie einen Namen haben und die Zahl benötigen — zum Beispiel um sie als $protocol-Argument beim Öffnen eines Raw-Sockets zu übergeben.
Wann würde ich das verwenden?
- Lesen von Paketmitschnitten oder Firewall-Logs, die das numerische Protokollfeld des IP-Headers aufzeichnen.
- Anzeige benutzerfreundlicher Ausgaben in Netzwerkdiagnose- oder Monitoring-Tools.
- Validierung, ob eine Protokollnummer dem System bekannt ist, bevor darauf reagiert wird.
Für übergeordnetes Networking greifen Sie häufiger auf die Host- und Dienst-Lookup-Helfer zurück: getservbyport() und getservbyname() ordnen Ports Dienstnamen zu, während gethostbyname() Hostnamen auflöst.
Fazit
getprotobynumber() wandelt einen numerischen Protokollbezeichner in den registrierten Namen um und gibt einen string zurück (kein array) oder false, wenn die Nummer unbekannt ist. Sie liest die lokale Protokolldatenbank und ist die Umkehrfunktion von getprotobyname(). Das Wissen, dass sie einen einfachen string zurückgibt — und die Prüfung auf false mit einem strikten Vergleich — ist der Schlüssel zur korrekten Verwendung.