4 Header

Overzicht

De header is aanwezig in alle verzoek- en antwoordberichten tussen Zabbix-componenten. Het is vereist om de lengte van het bericht te bepalen, of het gecomprimeerd is of niet, of het een groot pakket is of niet.

Het Zabbix-communicatieprotocol heeft een limiet van 1 GB voor de pakketgrootte per verbinding. De limiet van 1 GB geldt zowel voor de ontvangen pakketgegevenslengte als voor de ongecomprimeerde gegevenslengte.

Bij het verzenden van configuratie naar Zabbix-proxy wordt de pakketgroottegrens verhoogd naar 4 GB om het synchroniseren van grote configuraties mogelijk te maken. Wanneer de gegevenslengte vóór compressie 4 GB overschrijdt, begint de Zabbix-server automatisch de grote pakketindeling (0x04-vlag) te gebruiken, waardoor de pakketgroottegrens wordt verhoogd naar 16 GB.

Let op dat hoewel een grote pakketindeling kan worden gebruikt voor het verzenden van willekeurige gegevens, op dit moment alleen de Zabbix-proxy configuratiesynchronisator pakketten kan verwerken die groter zijn dan 1 GB.

Structuur

De header bestaat uit vier velden. Alle getallen in de header zijn opgemaakt als little-endian.

Veld Grootte Grootte
(groot pakket)
Beschrijving
<PROTOCOL> 4 4 "ZBXD" of 5A 42 58 44
<FLAGS> 1 1 Protocolvlaggen:
0x01 - Zabbix-communicatieprotocol
0x02 - compressie
0x04 - groot pakket
<DATALEN> 4 8 Gegevenslengte.
<GERESERVEERD> 4 8 Bij gebruik van compressie (0x02-vlag) - de lengte van ongecomprimeerde gegevens
Bij geen gebruik van compressie - 00 00 00 00

Voorbeelden

Hier zijn enkele codefragmenten die laten zien hoe je de Zabbix-protocolheader aan de gegevens kunt toevoegen die je wilt verzenden om het pakket te verkrijgen dat je naar Zabbix moet sturen zodat het correct wordt geïnterpreteerd. Deze codefragmenten gaan ervan uit dat de gegevens niet groter zijn dan 1 GB, waardoor het grote pakketformaat niet wordt gebruikt.

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

Of

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;

Of

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;

Of

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"