[comment]: # ({5ed66e47-9153def3})
# 6 Header 标头

[comment]: # ({/5ed66e47-9153def3})

[comment]: # ({4fd5942c-faa3c87b})
#### 概述

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

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

将配置发送到 Zabbix   proxy 时，数据包大小限制增加到 4GB 以允许同步大型配置。 当压缩前的数据长度超过 4GB 时，Zabbix server 自动开始使用大数据包格式（0x04 标志），将数据包大小限制增加到 16GB。

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

[comment]: # ({/4fd5942c-faa3c87b})

[comment]: # ({40e74a00-409c40cc})
#### 结构

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

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

[comment]: # ({/40e74a00-409c40cc})

[comment]: # ({bb53a69e-8698de59})
#### 例子

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

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

或

```python
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

```perl
my $packet = "ZBXD\1" . pack("(II)<", length($data), 0) . $data;
```

或

```perl
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

```php
$packet = "ZBXD\1" . pack("VV", strlen($data), 0) . $data;
```

或

```php
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
  
```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"
```

[comment]: # ({/bb53a69e-8698de59})
