4 标头

概述

Zabbix组件之间的响应和请求消息中包含标头。标头用来确定消息的长度。标头包括:

  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).

当启用压缩(0x02标志)时,<RESERVED>字节包含未压缩的数据大小,即32 bit小字节序。

Zabbix协议每个连接的数据包大小限制为1GB。

Implementation

这些代码片段展示了如何将Zabbix协议标头添加到你想要发送的数据中,从而使zabbix正确地解析数据包

语言代码
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;
  1. $packet = ZBXD\1 . pack(‘V’, strlen($data)) . \0\0\0\0 . $data;
Perl
  1. my $packet = ZBXD\1 . pack(‘<Q’, length($data)) . $data;
  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