6 Header 标头

概述

标头存在于 Zabbix 组件之间的所有请求和响应消息中 。需要确定消息长度,是否压缩,是否为大数据包。

Zabbix 通信协议每个连接的数据包大小限制为 1GB。 1GB 的限制适用于接收到的数据包数据长度和未压缩的数据长度。

将配置发送到 Zabbix proxy 时,数据包大小限制增加到 4GB 以允许同步大型配置。 当压缩前的数据长度超过 4GB 时,Zabbix server 自动开始使用大数据包格式(0x04 标志),将数据包大小限制增加到 16GB。

请注意,虽然大数据包格式可用于发送任何数据,但目前只有 Zabbix proxy 配置同步器可以处理大于 1GB 的数据包。

结构

标头由四个字段组成。 标头中的所有数字都采用小端格式。

字段大小大小
(大包)
描述
<PROTOCOL>44“ZBXD” or 5A 42 58 44
<FLAGS>11协议标志:
0x01 - Zabbix 通信协议
0x02 - 压缩
0x04 - 大数据包
<DATALEN>48数据长度.
<RESERVED>48使用压缩时 (0x02 标志) - 未压缩数据的长度
不使用压缩时 - 00 00 00 00
被动请求检查中包含监控项超时值.

例子

以下是一些代码片段,展示了如何将 Zabbix 协议标头添加到您要发送的数据中,以便获得您应该发送到 Zabbix 的数据包,从而正确解释它。 这些代码片段假定数据不大于 1GB,因此不使用大数据包格式。

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

  1. def zbx_create_header(plain_data_size, compressed_data_size=None):
  2. protocol = b"ZBXD"
  3. flags = 0x01
  4. if compressed_data_size is None:
  5. datalen = plain_data_size
  6. reserved = 0
  7. else:
  8. flags |= 0x02
  9. datalen = compressed_data_size
  10. reserved = plain_data_size
  11. return protocol + struct.pack("<BII", flags, datalen, reserved)
  12. packet = zbx_create_header(len(data)) + data
Perl
  1. my $packet = "ZBXD\1" . pack("(II)<", length($data), 0) . $data;

  1. sub zbx_create_header($;$)
  2. {
  3. my $plain_data_size = shift;
  4. my $compressed_data_size = shift;
  5. my $protocol = "ZBXD";
  6. my $flags = 0x01;
  7. my $datalen;
  8. my $reserved;
  9. if (!defined($compressed_data_size))
  10. {
  11. $datalen = $plain_data_size;
  12. $reserved = 0;
  13. }
  14. else
  15. {
  16. $flags |= 0x02;
  17. $datalen = $compressed_data_size;
  18. $reserved = $plain_data_size;
  19. }
  20. return $protocol . chr($flags) . pack("(II)<", $datalen, $reserved);
  21. }
  22. my $packet = zbx_create_header(length($data)) . $data;
PHP
  1. $packet = "ZBXD\1" . pack("VV", strlen($data), 0) . $data;

  1. function zbx_create_header($plain_data_size, $compressed_data_size = null)
  2. {
  3. $protocol = "ZBXD";
  4. $flags = 0x01;
  5. if (is_null($compressed_data_size))
  6. {
  7. $datalen = $plain_data_size;
  8. $reserved = 0;
  9. }
  10. else
  11. {
  12. $flags |= 0x02;
  13. $datalen = $compressed_data_size;
  14. $reserved = $plain_data_size;
  15. }
  16. return $protocol . chr($flags) . pack("VV", $datalen, $reserved);
  17. }
  18. $packet = zbx_create_header(strlen($data)) . $data;
Bash
  1. datalen=$(printf "%08x" ${#data})
  2. datalen="\\x${datalen:6:2}\\x${datalen:4:2}\\x${datalen:2:2}\\x${datalen:0:2}"
  3. printf "ZBXD\1${datalen}\0\0\0\0%s" "$data"