6 Überschrift

Übersicht

Der Header ist in allen Anfrage- und Antwortnachrichten zwischen Zabbix-Komponenten vorhanden. Er ist erforderlich, um die Nachrichtenlänge zu bestimmen, ob sie komprimiert ist oder nicht und ob es sich um ein großes Paket handelt oder nicht.

Das Zabbix-Kommunikationsprotokoll hat ein Paketgrößenlimit von 1 GB pro Verbindung. Das Limit von 1 GB gilt sowohl für die Länge der empfangenen Paketdaten als auch für die Länge der unkomprimierten Daten.

Beim Senden der Konfiguration an den Zabbix Proxy wird das Paketgrößenlimit auf 4 GB erhöht, um die Synchronisierung großer Konfigurationen zu ermöglichen. Wenn die Datenlänge vor der Komprimierung 4 GB überschreitet, beginnt der Zabbix Server automatisch, das große Paketformat (Flag 0x04) zu verwenden, wodurch das Paketgrößenlimit auf 16 GB erhöht wird.

Beachten Sie, dass das große Paketformat zwar zum Senden beliebiger Daten verwendet werden kann, derzeit jedoch nur der Zabbix-Proxy-Konfigurationssynchronisierer Pakete verarbeiten kann, die größer als 1 GB sind.

Struktur

Der Header besteht aus vier Feldern. Alle Zahlen im Header sind im Little-Endian-Format formatiert.

Feld Größe Größe
(großes Paket)
Beschreibung
<PROTOCOL> 4 4 "ZBXD" oder 5A 42 58 44
<FLAGS> 1 1 Protokoll-Flags:
0x01 - Zabbix-Kommunikationsprotokoll
0x02 - Komprimierung
0x04 - großes Paket
<DATALEN> 4 8 Datenlänge.
<RESERVED> 4 8 Wenn Komprimierung verwendet wird (0x02-Flag) - die Länge der unkomprimierten Daten
Wenn keine Komprimierung verwendet wird - 00 00 00 00

Beispiele

Hier sind einige Codeschnipsel, die zeigen, wie man den Zabbix-Protokoll-Header zu den Daten hinzufügt, die man senden möchte, um das Paket zu erhalten, das man an Zabbix senden sollte, damit es korrekt interpretiert wird. Diese Codeschnipsel gehen davon aus, dass die Daten nicht größer als 1 GB sind, so dass das Format für große Pakete nicht verwendet wird.

Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data

or

def zbx_create_header(plain_data_size, compressed_data_size=None):
    protocol = b"ZBXD"
    flags = 0x01
    if compressed_data_size is None:
        datalen = plain_data_size
        reserved = 0
    else:
        flags |= 0x02
        datalen = compressed_data_size
        reserved = plain_data_size
    return protocol + struct.pack("<BII", flags, datalen, reserved)

packet = zbx_create_header(len(data)) + data
Perl
my $packet = "ZBXD\1" . pack("(II)<", length($data), 0) . $data;

or

sub zbx_create_header($;$)
{
    my $plain_data_size = shift;
    my $compressed_data_size = shift;

    my $protocol = "ZBXD";
    my $flags = 0x01;
    my $datalen;
    my $reserved;

    if (!defined($compressed_data_size))
    {
        $datalen = $plain_data_size;
        $reserved = 0;
    }
    else
    {
        $flags |= 0x02;
        $datalen = $compressed_data_size;
        $reserved = $plain_data_size;
    }

    return $protocol . chr($flags) . pack("(II)<", $datalen, $reserved);
}

my $packet = zbx_create_header(length($data)) . $data;
PHP
$packet = "ZBXD\1" . pack("VV", strlen($data), 0) . $data;

or

function zbx_create_header($plain_data_size, $compressed_data_size = null)
{
    $protocol = "ZBXD";
    $flags = 0x01;
    if (is_null($compressed_data_size))
    {
        $datalen = $plain_data_size;
        $reserved = 0;
    }
    else
    {
        $flags |= 0x02;
        $datalen = $compressed_data_size;
        $reserved = $plain_data_size;
    }
    return $protocol . chr($flags) . pack("VV", $datalen, $reserved);
}

$packet = zbx_create_header(strlen($data)) . $data;
Bash
datalen=$(printf "%08x" ${#data})
datalen="\\x${datalen:6:2}\\x${datalen:4:2}\\x${datalen:2:2}\\x${datalen:0:2}"
printf "ZBXD\1${datalen}\0\0\0\0%s" "$data"