该头部存在于所有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,因此未使用大数据包格式。
或
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
或
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;
或
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;