6 Capçalera

Vista general

La capçalera és present a tots els missatges de petició i de resposta entre els components de Zabbix. És necessari determinar la longitud del missatge, si és comprimit o no, i si és o no un paquet gros.

El protocol de comunicacions de Zabbix tenen una mida limitada de paquet d'1Go per connexió. El límit d'1Go s'aplica tant a la longitud de les dades del paquet rebut com a la de les dades no comprimides.

Quan s'envia la configuració al proxy de Zabbix, el límit de mida del paquet s'incrementa a 4Go per permetre sincronitzar configuracions grans. Quan la longitud de les dades abans de la compressió passa de 4Go, el servidor de Zabbix engega automàticament l'ús de format de paquets grans (flag 0x04), que augmenta el límit de la mida del paquet a 16Go.

Veieu que mentre un format de gran paquet pot emprar-se per enviar qualsevol informació, actualment només el sincronitzar de configuració del proxy Zabbix pot manejar els paquets superiors a 1Go.

Estructura

La capçalera es composa de quatre camps. Tots els nombres de la capçalera són amb format Little Endian.

Camp Mida Mida
(paquet gros)
Descripció
<PROTOCOL> 4 4 "ZBXD" or 5A 42 58 44
<FLAGS> 1 1 Indicadors de protocol:
0x01 - Protocol de comunicacions Zabbix
0x02 - compressió
0x04 - paquet gros
<DATALEN> 4 8 Longitud de les dades.
<RESERVED> 4 8 Quan la compressió sigui emprada (0x02 flag) - la longitud de les dades no comprimides
Quan no s'empra la compressió - 00 00 00 00

Exemples

Aquí hi ha alguns extractes de codi que ensenyen com afegir una capçalera de protocol Zabbix a les dades que volem enviar dins l'ordre per obtindre el paquet que hem d'enviar a Zabbix, per tal que sigui interpretat correctament. Aquestes mostres de codi suposen que les dades no són superiors a 1Go i, per tant, el format de paquet gros no s'empra pas.

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"