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 Zabbix proxy, 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 Zabbix server 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 quaisquer dados, atualmente apenas o sincronizador de configuração do Zabbix proxy pode 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;