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

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

[comment]: # ({4fd5942c-faa3c87b})
#### Descripción general

El encabezado está presente en todos los mensajes de solicitud y respuesta entre los componentes de Zabbix.
Se requiere determinar la longitud del mensaje, si está comprimido o no, si es un paquete grande o no.

El protocolo de comunicaciones Zabbix tiene un límite de tamaño de paquete de 1 GB por conexión. El límite de 1GB
se aplica tanto a la longitud de datos del paquete recibido como a la longitud de datos sin comprimir.

Al enviar la configuración al proxy Zabbix, el límite de tamaño del paquete aumenta a 4 GB para permitir
sincronizar configuraciones grandes. Cuando la longitud de los datos antes de la compresión excede los 4 GB, el servidor Zabbix automáticamente
comienza a utilizar el formato de paquete grande (indicador 0x04), que aumenta el límite de tamaño del paquete a 16 GB.

Tenga en cuenta que, si bien se puede utilizar un formato de paquete grande para enviar cualquier dato, actualmente solo el sincronizador de configuración del proxy Zabbix
puede manejar paquetes de más de 1 GB.

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

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

#### Estructura

El encabezado consta de cuatro campos. Todos los números del encabezado tienen el formato little-endian.

|Campo|Tamaño|Tamaño<br>(paquete grande)|Descripción|
|--|-|-|------|
|`<PROTOCOLO>`|4|4|`"ZBXD"` o `5A 42 58 44`|
|`<FLAGS>`|1|1|Indicadores de protocolo:<br>`0x01` - protocolo de comunicaciones Zabbix<br>`0x02` - compresión<br>`0x04` - paquete grande|
|`<DATALEN>`|4|8|Longitud de los datos.|
|`<RESERVADO>`|4|8|Cuando se usa compresión (indicador `0x02`): la longitud de los datos sin comprimir<br>Cuando no se usa compresión - `00 00 00 00`|

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

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

Aquí hay algunos fragmentos de código que muestran cómo agregar el encabezado del protocolo Zabbix a los datos que desea enviar en orden.
Para obtener el paquete debes enviarlo a Zabbix para que se interprete correctamente. Estos fragmentos de código
presuponen que los datos no superan 1 GB, por lo que no se utiliza el formato de paquete grande.

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

o

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

o

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

or

```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})
