6 标题

概述

Zabbix 组件之间的所有请求和响应消息中都包含此头部。
它用于确定消息长度、是否压缩、以及是否为大包。

Zabbix 通信协议对每个连接的数据包大小限制为 1GB。此限制
同时适用于接收的数据包长度和解压后的数据长度。

在向 Zabbix proxy 发送配置时,数据包大小限制会提升至 4GB,以允许
同步大型配置。当压缩前的数据长度超过 4GB 时,Zabbix server 会自动
启用大包格式(0x04 flag),将数据包大小限制提升至 16GB。

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

结构

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

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

示例

以下是一些代码片段,展示了如何将 Zabbix 协议头添加到要发送的数据中,以获得 Zabbix 能够正确解析的数据包。这些代码片段假设数据大小不超过 1GB,因此未使用大包格式。

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

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;

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;

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"