5 Fejléc

Áttekintés

A fejléc minden kérés- és válaszüzenetben megtalálható a Zabbix-komponensek között. Meg kell határozni az üzenet hosszát, hogy tömörített-e vagy sem, nagy csomag-e vagy sem.

A Zabbix kommunikációs protokoll kapcsolatonként 1 GB-os csomagméret-korláttal rendelkezik. A korlát 1 GB egyaránt vonatkozik a vett csomagadatok hosszára és a tömörítetlen adathosszra.

Amikor konfigurációt küld a Zabbix proxynak, a csomagméret 4 GB-ra nő, hogy lehetővé tegye nagy konfigurációk szinkronizálása. Ha a tömörítés előtti adathossz meghaladja a 4 GB-ot, a Zabbix automatikusan kiszolgál elkezdi használni a nagy csomagformátumot (0x04 jelző), amely 16 GB-ra növeli a csomag méretkorlátját.

Vegye figyelembe, hogy míg a nagy csomagformátum bármilyen adat küldésére használható, jelenleg csak a Zabbix proxy A konfigurációs szinkronizáló képes kezelni az 1 GB-nál nagyobb csomagokat.

Szerkezet

A fejléc négy mezőből áll. A fejlécben szereplő összes szám little-endian formátumú.

Mező Méret Méret
(nagy csomag)
Leírás
<PROTOKOLL> 4 4 "ZBXD" vagy 5A 42 58 44
<FLAGS> 1 1 Protokolljelzők:
0x01 - Zabbix kommunikációs protokoll
0x02 - tömörítés
0x04 - nagy csomag
<ADATOK> 4 8 Adathossz.
<FOGLALVA> 4 8 Tömörítés használata esetén (0x02 jelző) – a tömörítetlen adatok hossza.
Ha nincs tömörítés – 00 00 00 00

Examples

Here are some code snippets showing how to add Zabbix protocol header to the data you want to send in order to obtain the packet you should send to Zabbix so that it is interpreted correctly. These code snippets assume that the data is not larger than 1GB, thus the large packet format is not used.

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

or

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;

or

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;

or

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"