De header is aanwezig in alle verzoek- en antwoordberichten tussen Zabbix-componenten. Het is nodig 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 per pakket per verbinding. De limiet van 1 GB is van toepassing op zowel de ontvangen pakketgegevenslengte als de lengte van de ongecomprimeerde gegevens.
Bij het verzenden van configuratie naar een Zabbix-proxy wordt de pakketgroottegrens verhoogd naar 4 GB om het synchroniseren van grote configuraties mogelijk te maken. Wanneer de lengte van de gegevens vóór compressie de 4 GB overschrijdt, begint de Zabbix-server automatisch het grote pakketformaat (0x04-vlag) te gebruiken, waardoor de pakketgroottegrens wordt verhoogd naar 16 GB.
Merk op dat hoewel een groot pakketformaat kan worden gebruikt om alle gegevens te verzenden, momenteel alleen de Zabbix-proxyconfiguratiesynchronisator pakketten kan verwerken die groter zijn dan 1 GB.
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-communicatieprotocol0x02 - compressie0x04 - groot pakket |
<DATALEN> |
4 | 8 | Gegevenslengte. |
<GERESERVEERD> |
4 | 8 | Bij gebruik van compressie (0x02 -vlag) - de lengte van ongecomprimeerde gegevensBij geen gebruik van compressie - 00 00 00 00 |
Hier zijn enkele codefragmenten die laten zien hoe je een Zabbix-protocolheader kunt toevoegen aan de gegevens 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, dus het grote pakketformaat wordt niet gebruikt.
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
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;
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;