Você está visualizando a documentação da versão de desenvolvimento, que pode estar incompleta.
Esta página foi traduzida automaticamente. Se você notar um erro, selecione-o e pressione Ctrl+Enter para reportá-lo aos editores.

6 Cabeçalho

Visão geral

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.

Estrutura

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 Zabbix
0x02 - compressão
0x04 - pacote grande
<DATALEN> 4 8 Comprimento dos dados.
<RESERVED> 4 8 Quando a compressão é usada (flag 0x02) - o comprimento dos dados descompactados
Quando a compressão não é usada - 00 00 00 00

Exemplos

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.

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

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)) + data
Perl
my $packet = "ZBXD\1" . pack("(II)<", length($data), 0) . $data;

ou

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;

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