Zabbix Documentation 4.4

3.04.05.0 (current)| In development:5.2 (devel)| Unsupported:1.82.02.22.43.23.44.24.4Guidelines

User Tools

Site Tools


Sidebar

ru:manual:appendix:protocols:header_datalen

4 Длина заголовка и данных

Обзор

Заголовок присутствует в сообщениях ответа и запроса между компонентами Zabbix. Это требуется для определения длины сообщения. Заголовок состоит из:

<ПРОТОКОЛ> - "ZBXD" (4 байта).
<ФЛАГИ> - флаги протокола, (1 байт). 0x01 - Протокол передачи данных Zabbix, 0x02 - сжатие.
<ДЛИНА_ДАННЫХ> - размер данных (4 байта). число 1 форматируется в 01/00/00/00 (четыре байта, 32-битное число в little-endian формате).
<ЗАРЕЗЕРВИРОВАНО> - зарезервировано для расширений протокола (4 байта).

Когда включено сжатие (флаг 0x02), <ЗАРЕЗЕРВИРОВАНО> байты содержит размер данных без сжатия, 32-битное число в little-endian формате.

Чтобы не израсходовать память полностью (в теории) Zabbix протокол ограничен на прием данных только 128МБ за одно соединение.

Реализация

Здесь представлены выдержки кода, которые показывают как добавить заголовок Zabbix протокола к data, которые вы хотите отправить, чтобы получить packet вам необходимо отправлять на Zabbix, так чтобы он интерпретировался корректным образом.

ЯзыкКод
bash
printf -v LENGTH '%016x' "${#DATA}"
PACK=""
for (( i=14; i>=0; i-=2 )); do PACK="$PACK\\x${LENGTH:$i:2}"; done
printf "ZBXD\1$PACK%s" "$DATA"
Java
byte[] header = new byte[] {
	'Z', 'B', 'X', 'D', '\1',
	(byte)(data.length & 0xFF),
	(byte)((data.length >> 8) & 0xFF),
	(byte)((data.length >> 16) & 0xFF),
	(byte)((data.length >> 24) & 0xFF),
	'\0', '\0', '\0', '\0'};
 
byte[] packet = new byte[header.length + data.length];
System.arraycopy(header, 0, packet, 0, header.length);
System.arraycopy(data, 0, packet, header.length, data.length);
PHP
$packet = "ZBXD\1" . pack('P', strlen($data)) . $data;
или
$packet = "ZBXD\1" . pack('V', strlen($data)) . "\0\0\0\0" . $data;
Perl
my $packet = "ZBXD\1" . pack('<Q', length($data)) . $data;
или
my $packet = "ZBXD\1" . pack('V', length($data)) . "\0\0\0\0" . $data;
Python
packet = "ZBXD\1" + struct.pack('<Q', len(data)) + data