O cabeçalho está presente em todas as mensagens de solicitação e resposta entre os componentes do Zabbix. Ele é necessário para determinar o comprimento da mensagem, se ela está compactada ou não, se é um pacote grande ou não.
O protocolo de comunicação do Zabbix possui um limite de tamanho de pacote de 1GB por conexão. O limite de 1GB é aplicado tanto ao comprimento dos dados do pacote recebido quanto ao comprimento dos dados descompactados.
Ao enviar a configuração para o proxy do Zabbix, o limite de tamanho do pacote é aumentado para 4GB para permitir a sincronização de grandes configurações. Quando o comprimento dos dados antes da compactação excede 4GB, o server do Zabbix automaticamente começa a usar o formato de pacote grande (flag 0x04), o que aumenta o limite de tamanho do pacote para 16GB.
Observe que, embora o formato de pacote grande possa ser usado para enviar qualquer dado, atualmente apenas o sincronizador de configuração do proxy do Zabbix consegue lidar com pacotes maiores que 1GB.
O cabeçalho consiste em quatro campos. Todos os números no cabeçalho são formatados como little-endian.
| Campo | Tamanho | Tamanho (pacote grande) |
Descrição |
|---|---|---|---|
<PROTOCOL> |
4 | 4 | "ZBXD" ou 5A 42 58 44 |
<FLAGS> |
1 | 1 | Flags do protocolo:0x01 - protocolo de comunicação Zabbix0x02 - compressão0x04 - pacote grande |
<DATALEN> |
4 | 8 | Comprimento dos dados. |
<RESERVED> |
4 | 8 | Quando a compressão é usada (flag 0x02) - o comprimento dos dados descompactadosQuando a compressão não é usada - 00 00 00 00 |
Aqui estão alguns trechos de código mostrando como adicionar o cabeçalho do protocolo Zabbix aos dados que você deseja enviar para obter o pacote que deve ser enviado ao Zabbix para que seja interpretado corretamente. Esses trechos de código assumem que os dados não são maiores que 1GB, portanto, o formato de pacote grande não é usado.
ou
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)) + dataou
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;ou
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;