Esta é uma tradução da página de documentação original em inglês. Ajude-nos a torná-la melhor.

6 Cabeçalho

Visão geral

O cabeçalho está presente nas mensagens de resposta e solicitação entre o Zabbix componentes. É necessário determinar o comprimento da mensagem, se for compactado ou não e o formato dos campos de comprimento da mensagem. O cabeçalho consiste em:

<PROTOCOLO> - "ZBXD" (4 bytes).
       <FLAGS> - os sinalizadores de protocolo, (1 byte). 0x01 - protocolo de comunicação Zabbix, 0x02 - compressão, 0x04 - pacote grande).
       <DATALEN> - comprimento dos dados (4 bytes ou 8 bytes para pacotes grandes). 1 será formatado como 01/00/00/00 (quatro bytes, número de 32 bits no formato little-endian) ou 01/00/00/00/00/00/00/00 (oito bytes, número de 64 bits em pouco -endian formato) para pacotes grandes.
       <RESERVED> - comprimento de dados não compactados (4 bytes ou 8 bytes para pacotes grandes). 1 será formatado como 01/00/00/00 (quatro bytes, número de 32 bits no formato little-endian) ou 01/00/00/00/00/00/00/00 (oito bytes, número de 64 bits em pouco -endian formato) para pacotes grandes.

Quando a compactação está habilitada (sinalizador 0x02) os bytes <RESERVED> contém tamanho de dados não compactado.

O protocolo Zabbix tem um limite de tamanho de pacote de 1 GB por conexão. O limite de 1 GB é aplicado para comprimento de dados de pacote recebido e para dados não compactados comprimento, no entanto, quando o pacote grande está habilitado (flag 0x04) é possível para que o proxy Zabbix receba configuração com tamanho de até 16GB; Nota esse pacote grande só pode ser usado para configuração de proxy Zabbix, e O servidor Zabbix definirá automaticamente (flag 0x04) e enviará campos de comprimento como 8 bytes cada quando o comprimento dos dados antes da compactação exceder 4 GB.

Structure

The header consists of four fields. All numbers in the header are formatted as little-endian.

Field Size Size
(large packet)
Description
<PROTOCOL> 4 4 "ZBXD" or 5A 42 58 44
<FLAGS> 1 1 Protocol flags:
0x01 - Zabbix communications protocol
0x02 - compression
0x04 - large packet
<DATALEN> 4 8 Data length.
<RESERVED> 4 8 When compression is used (0x02 flag) - the length of uncompressed data
When compression is not used - 00 00 00 00

Implementação

Aqui estão trechos de código mostrando como adicionar o cabeçalho do protocolo Zabbix ao data que você deseja enviar para obter o pacote que você deveria enviar para o Zabbix para que seja interpretado corretamente.

Idioma Código
bash printf -v LENGTH '%016x' "${#DATA}"PACK=""for ((i=14; i>=0; i-=2)); do PACK="$PACK\\x${LENGTH:$i:2}"; doneprintf "ZBXD\1$PACK%s" "$DATA"
Java byte[] cabeçalho = new byte[] {'Z', 'B', 'X', 'D', '\1',(byte)(data.length & 0xFF),(byte)( (data.length >> 8) & 0xFF),(byte)((data.length >> 16) & 0xFF),(byte)((data.length >> 24) & 0xFF),'\0', ' \0', '\0', '\0'};| |<|byte[] pacote = new byte[cabeçalho.comprimento + dados.comprimento];System.arraycopy(cabeçalho, 0, pacote, 0, cabeçalho.comprimento);System.arraycopy(dados, 0, pacote, cabeçalho.comprimento , data.length);
PHP $packet = "ZBXD\1" . pack('P', strlen($dados)) . $data;ou$packet = "ZBXD\1" . pack('V', strlen($dados)) . "\0\0\0\0" . $dados;
Perl my $packet = "ZBXD\1" . pack('<Q', comprimento($dados)) . $data;oumy $packet = "ZBXD\1" . pack('V', comprimento($dados)) . "\0\0\0\0" . $data;
Python packet = "ZBXD\1" + struct.pack('<Q', len(data)) + data