[comment]: # ({5ed66e47-9153def3})
# 6 Заглавље

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

[comment]: # ({4fd5942c-faa3c87b})
#### Преглед

Заглавље је присутно у свим порукама захтева и одговора између Zabbix компоненти. 
Потребно је одредити дужину поруке, да ли је компримована или не, да ли је велики пакет или не.

Zabbix комуникациони протокол има ограничење величине пакета од 1GB по конекцији. Ограничење од 1GB 
примењује се и на дужину примљеног пакета података и на дужину некомпримованих података.

Приликом слања конфигурације на Zabbix прокси, ограничење величине пакета се повећава на 4GB да би се то омогућило 
синхронизовање великих конфигурација. Када дужина података пре компресије пређе 4GB, Zabbix сервер аутоматски 
почиње да користи формат великог пакета (0x04 flag) који повећава ограничење величине пакета на 16GB.

Имајте на уму да иако се велики формат пакета може користити за слање било каквих података, тренутно само Zabbix прокси 
конфигурациони синхронизатор може да обрађује пакете који су већи од 1GB.

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

[comment]: # ({40e74a00-409c40cc})
#### Структура

Заглавље се састоји од четири поља. Сви бројеви у заглављу су форматирани у формату little-endian.

|Field|Size|Size<br>(large packet)|Description|
|--|-|-|------|
|`<PROTOCOL>`|4|4|`"ZBXD"` или `5А 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})
