6 Galvene
Pārskats
Galvene ir iekļauta visos pieprasījumu un atbilžu ziņojumos starp Zabbix komponentiem. Tā ir nepieciešama, lai noteiktu ziņojuma garumu, vai tas ir saspiests vai nē, vai tā ir liela pakete vai nē.
Zabbix sakaru protokolam ir 1 GB paketes izmēra ierobežojums vienam savienojumam. 1 GB ierobežojums attiecas gan uz saņemtās paketes datu garumu, gan uz nesaspiesto datu garumu.
Sūtot konfigurāciju uz Zabbix starpniekserveris, paketes izmēra ierobežojums tiek palielināts līdz 4 GB, lai ļautu sinhronizēt lielas konfigurācijas. Ja datu garums pirms saspiešanas pārsniedz 4 GB, Zabbix serveris automātiski sāk izmantot lielās paketes formātu (0x04 karodziņš), kas palielina paketes izmēra ierobežojumu līdz 16 GB.
Ņemiet vērā, ka, lai gan lielās paketes formātu var izmantot jebkādu datu sūtīšanai, pašlaik tikai Zabbix starpniekserveris konfigurācijas sinhronizētājs var apstrādāt paketes, kas ir lielākas par 1 GB.
Structure
The header consists of four fields. All numbers in the header are formatted as little-endian.
| Field | Size | Size (large packet) |
Description |
|---|---|---|---|
<PROTOCOL> |
4 | 4 | "ZBXD" or 5A 42 58 44 |
<FLAGS> |
1 | 1 | Protocol flags:0x01 - Zabbix communications protocol0x02 - compression0x04 - large packet |
<DATALEN> |
4 | 8 | Data length. |
<RESERVED> |
4 | 8 | When compression is used (0x02 flag) - the length of uncompressed dataWhen compression is not used - 00 00 00 00 |
Piemēri
Šeit ir daži koda fragmenti, kas parāda, kā pievienot Zabbix protokola galveni datiem, kurus vēlaties nosūtīt, lai iegūtu paketi, kas jānosūta uz Zabbix, lai tā tiktu pareizi interpretēta. Šie koda fragmenti pieņem, ka dati nav lielāki par 1GB, tādēļ lielo pakešu formāts netiek izmantots.
Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data
vai
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
my $packet = "ZBXD\1" . pack("(II)<", length($data), 0) . $data;
vai
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
$packet = "ZBXD\1" . pack("VV", strlen($data), 0) . $data;
vai
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
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"