6 Header标头

概述

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

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

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

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

结构

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

字段 大小 大小
(大包)
描述
<PROTOCOL> 4 4 "ZBXD"5A 42 58 44
<FLAGS> 1 1 协议标志:
0x01 - Zabbix 通信协议
0x02 - 压缩
0x04 - 大数据包
<DATALEN> 4 8 数据长度。
<RESERVED> 4 8 使用压缩时(0x02 标志)- 未压缩数据的长度
不使用压缩时- 00 00 00 00

例子

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

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

or

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;

or

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;

or

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"