6 Header标头

概述

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

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

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

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

结构

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

字段大小大小
(大包)
描述
<PROTOCOL>44“ZBXD”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

or

  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;

or

  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;

or

  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"