6 标题

概述

该头部存在于所有Zabbix组件间的请求与响应消息中. 用于确定消息长度, 判断是否经过压缩, 以及是否为大尺寸数据包.

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

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

请注意虽然大尺寸数据包格式可用于发送任意数据, 但目前仅Zabbix proxy 配置同步器能够处理超过1GB的数据包.

结构

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

字段 大小 大包尺寸
(large packet)
描述
<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"