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.
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 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.
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;