6 Galvene

Pārskats

Galvene ir iekļauta visos pieprasījumu un atbilžu ziņojumos starp Zabbix komponentiem. Tā ir nepieciešama, lai noteiktu ziņojuma garumu, vai tas ir saspiests vai nē, vai tā ir liela pakete vai nē.

Zabbix sakaru protokolam ir 1 GB paketes izmēra ierobežojums vienam savienojumam. 1 GB ierobežojums attiecas gan uz saņemtās paketes datu garumu, gan uz nesaspiesto datu garumu.

Sūtot konfigurāciju uz Zabbix starpniekserveris, paketes izmēra ierobežojums tiek palielināts līdz 4 GB, lai ļautu sinhronizēt lielas konfigurācijas. Ja datu garums pirms saspiešanas pārsniedz 4 GB, Zabbix serveris automātiski sāk izmantot lielās paketes formātu (0x04 karodziņš), kas palielina paketes izmēra ierobežojumu līdz 16 GB.

Ņemiet vērā, ka, lai gan lielās paketes formātu var izmantot jebkādu datu sūtīšanai, pašlaik tikai Zabbix starpniekserveris konfigurācijas sinhronizētājs var apstrādāt paketes, kas ir lielākas par 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 protocol
0x02 - compression
0x04 - large packet
<DATALEN> 4 8 Data length.
<RESERVED> 4 8 When compression is used (0x02 flag) - the length of uncompressed data
When compression is not used - 00 00 00 00

Piemēri

Šeit ir daži koda fragmenti, kas parāda, kā pievienot Zabbix protokola galveni datiem, kurus vēlaties nosūtīt, lai iegūtu paketi, kas jānosūta uz Zabbix, lai tā tiktu pareizi interpretēta. Šie koda fragmenti pieņem, ka dati nav lielāki par 1GB, tādēļ lielo pakešu formāts netiek izmantots.

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

vai

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;

vai

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;

vai

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"