标头存在于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,因此不使用大数据包格式。
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)) + dataor
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;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;