6 Nagłówek
Przegląd
Nagłówek jest obecny we wszystkich komunikatach żądania i odpowiedzi między komponentami Zabbix. Jest wymagany do określenia długości komunikatu, tego, czy jest on skompresowany, czy nie, oraz tego, czy jest to duży pakiet, czy nie.
Protokół komunikacyjny Zabbix ma limit rozmiaru pakietu wynoszący 1 GB na połączenie. Limit 1 GB ma zastosowanie zarówno do długości odebranych danych pakietu, jak i do długości danych po dekompresji.
Podczas wysyłania konfiguracji do Zabbix proxy limit rozmiaru pakietu jest zwiększany do 4 GB, aby umożliwić synchronizację dużych konfiguracji. Gdy długość danych przed kompresją przekracza 4 GB, Zabbix server automatycznie zaczyna używać formatu dużych pakietów (flaga 0x04), co zwiększa limit rozmiaru pakietu do 16 GB.
Należy pamiętać, że chociaż format dużych pakietów może być używany do wysyłania dowolnych danych, obecnie tylko synchronizator konfiguracji Zabbix proxy może obsługiwać pakiety większe niż 1 GB.
Structure
The header consists of four fields. All numbers in the header are formatted as little-endian.
| Field | Size | Size (large packet) |
Description |
|---|---|---|---|
<PROTOCOL> |
4 | 4 | "ZBXD" or 5A 42 58 44 |
<FLAGS> |
1 | 1 | Protocol flags:0x01 - Zabbix communications protocol0x02 - compression0x04 - large packet |
<DATALEN> |
4 | 8 | Data length. |
<RESERVED> |
4 | 8 | When compression is used (0x02 flag) - the length of uncompressed dataWhen compression is not used - 00 00 00 00 |
Przykłady
Poniżej znajdują się fragmenty kodu pokazujące, jak dodać nagłówek protokołu Zabbix do danych, które chcesz wysłać, aby uzyskać pakiet, który należy wysłać do Zabbix, tak aby został poprawnie zinterpretowany. Te fragmenty kodu zakładają, że dane nie są większe niż 1 GB, dlatego format dużych pakietów nie jest używany.
Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data
lub
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;
lub
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;
lub
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"