[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
   ако је compressed_data_size None:
   len podataka = plain_data_size
   reserved = 0
   else:
   flags |= 0x02
   len podataka = compressed_data_size
   reserved = plain_data_size
   return protocol + struct.pack("<BII", flags, len podataka, 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})
