4 Header

Overview

Header is present in response and request messages between Zabbix components. It is required to determine the length of message. The header consists of:

  1. <PROTOCOL> - "ZBXD" (4 bytes).
  2. <FLAGS> -the protocol flags, (1 byte). 0x01 - Zabbix communications protocol, 0x02 - compression).
  3. <DATALEN> - data length (4 bytes). 1 will be formatted as 01/00/00/00 (four bytes, 32 bit number in little-endian format).
  4. <RESERVED> - reserved for protocol extensions (4 bytes).

When compression is enabled (0x02 flag) the <RESERVED> bytes contains uncompressed data size, 32 bit number in little-endian format.

Zabbix protocol has 1GB packet size limit per connection.

Implementation

Here are code snippets showing how to add Zabbix protocol header to the data you want to send in order to obtain packet you should send to Zabbix so it is interpreted correctly.

LanguageCode
bash
  1. printf -v LENGTH ‘%016x ${#DATA}”
  2. PACK=””
  3. for (( i=14; i>=0; i-=2 )); do PACK=”$PACK\x${LENGTH:$i:2}”; done
  4. printf ZBXD\1$PACK%s $DATA
Java
  1. byte[] header = new byte[] {
  2. Z’, B’, X’, D’, \1’,
  3. (byte)(data.length & 0xFF),
  4. (byte)((data.length >> 8) & 0xFF),
  5. (byte)((data.length >> 16) & 0xFF),
  6. (byte)((data.length >> 24) & 0xFF),
  7. \0’, \0’, \0’, \0’};
  8.  
  9. byte[] packet = new byte[header.length + data.length];
  10. System.arraycopy(header, 0, packet, 0, header.length);
  11. System.arraycopy(data, 0, packet, header.length, data.length);
PHP
  1. $packet = ZBXD\1 . pack(‘P’, strlen($data)) . $data;
or
  1. $packet = ZBXD\1 . pack(‘V’, strlen($data)) . \0\0\0\0 . $data;
Perl
  1. my $packet = ZBXD\1 . pack(‘<Q’, length($data)) . $data;
or
  1. my $packet = ZBXD\1 . pack(‘V’, length($data)) . \0\0\0\0 . $data;
Python
  1. packet = ZBXD\1 + struct.pack(‘<Q’, len(data)) + data