ヘッダーは、Zabbix コンポーネント間のすべての要求および応答メッセージに存在します。 ヘッダーの情報からメッセージの長さ、圧縮されているかどうか、大きなパケットであるかどうかを判断できます。
Zabbix 通信プロトコルには、接続ごとに 1GB のパケット サイズ制限があります。 受信パケットのデータ長、圧縮前のデータ長ともに1GBの制限が適用されます。
構成を Zabbix プロキシに送信する場合、大きな構成を同期できるように、パケット サイズの制限が 4 GB に増加します。 圧縮前のデータ長が 4GB を超えると、Zabbix サーバーは自動的に大きなパケット形式 (0x04 フラグ) を使用して起動し、パケット サイズの制限を 16GB に増やします。
任意のデータの送信に大きなパケット形式を使用できますが、現在、1GB を超えるパケットを処理できるのは Zabbix プロキシ構成シンカーのみであることに注意してください。
ヘッダーは 4 つのフィールドで構成されます。 ヘッダー内のすべての数値は、リトルエンディアンとしてフォーマットされています。
フィールド | サイズ | サイズ (ラージパケット) |
説明 |
---|---|---|---|
<PROTOCOL> |
4 | 4 | "ZBXD" または 5A 42 58 44 |
<FLAGS> |
1 | 1 | Protocol フラグ:0x01 - Zabbix 通信プロトコル0x02 - 圧縮0x04 - ラージパケット |
<DATALEN> |
4 | 8 | データ長 |
<RESERVED> |
4 | 8 | 圧縮を使用する場合(0x02 フラグ) - 非圧縮データの長さ圧縮を使用しない場合 - 00 00 00 00 |
以下は、Zabbix に送信する必要があるパケットを取得して正しく解釈されるようにするために、送信するデータに Zabbix プロトコル ヘッダーを追加する方法を示すコード スニペットです。 これらのコード スニペットは、データが 1GB を超えないことを前提としているため、ラージ パケット フォーマットは使用されません。
または
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
または
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;
または
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;