6 Intestazione

Panoramica

L'intestazione è presente in tutti i messaggi di richiesta e risposta tra i componenti di Zabbix. È necessaria per determinare la lunghezza del messaggio, se è compresso o meno, se è un pacchetto grande oppure no.

Il protocollo di comunicazione di Zabbix ha un limite di dimensione del pacchetto di 1 GB per connessione. Il limite di 1 GB si applica sia alla lunghezza dei dati del pacchetto ricevuto sia alla lunghezza dei dati non compressi.

Quando si invia la configurazione a Zabbix proxy, il limite di dimensione del pacchetto viene aumentato a 4 GB per consentire la sincronizzazione di configurazioni di grandi dimensioni. Quando la lunghezza dei dati prima della compressione supera i 4 GB, Zabbix server inizia automaticamente a utilizzare il formato di pacchetto grande (flag 0x04), che aumenta il limite di dimensione del pacchetto a 16 GB.

Si noti che, sebbene il formato di pacchetto grande possa essere utilizzato per inviare qualsiasi dato, attualmente solo il sincronizzatore della configurazione di Zabbix proxy può gestire pacchetti di dimensioni superiori a 1 GB.

Struttura

L'intestazione è composta da quattro campi. Tutti i numeri nell'intestazione sono formattati in little-endian.

Campo Dimensione Dimensione
(pacchetto grande)
Descrizione
<PROTOCOL> 4 4 "ZBXD" oppure 5A 42 58 44
<FLAGS> 1 1 Flag del protocollo:
0x01 - protocollo di comunicazione Zabbix
0x02 - compressione
0x04 - pacchetto grande
<DATALEN> 4 8 Lunghezza dei dati.
<RESERVED> 4 8 Quando viene utilizzata la compressione (flag 0x02) - la lunghezza dei dati non compressi
Quando la compressione non viene utilizzata - 00 00 00 00

Esempi

Ecco alcuni frammenti di codice che mostrano come aggiungere l'header del protocollo Zabbix ai dati che si desidera inviare, in modo da ottenere il pacchetto da inviare a Zabbix affinché venga interpretato correttamente. Questi frammenti di codice presuppongono che i dati non siano più grandi di 1GB, pertanto il formato dei pacchetti grandi non viene utilizzato.

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

oppure

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;

oppure

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;

oppure

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"