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