Yapılandırılmış Gövde Formatı

Giriş

Bu belge, Azure Depolama Blob, Dosya ve DFS API'leri tarafından istek içeriği üzerinde verimli kontrol toplamı hesaplamasını desteklemek için kullanılan Yapılandırılmış Gövde formatını tanımlar. Bu, verileri (örneğin, blob veya dosya içeriği) takip eden kontrol toplamlarıyla kontrol toplamı bazında kodlayan özel bir ikili formattır. Bu formata kodlanan şeyin istek gövdesinin kendisi olduğunu unutmayın.

Bu dokümantasyon öncelikle Azure Storage REST API'lerini doğrudan kullanan müşterilere yöneliktir. Desteklenen Azure Depolama SDK'sı kullanan müşterilerin istekleri otomatik olarak bu formatta kodlanacaktır.

Şu anda Azure Storage yalnızca bu formatın 1. sürümünü destekliyor, o da yalnızca crc64 kontrol toplamlarını destekliyor. Yapılandırılmış mesaj formatının kullanımı isteğe bağlıdır.

Specification

Bölümler

Şifrelenmiş bir mesajın üç bölümü vardır.

Bölüm Description
Header Başlık, şema versiyonu (1), mesaj uzunluğu, seçenekler ve segment sayısını içerir.
Segment(ler) Her mesajın bir veya daha fazla segmenti vardır ve her segment segment #, veri ve isteğe bağlı takip eden meta verileri içerir. V1 için desteklenen tek fragman crc64 kontrol toplamı.
Treyler Her mesajın isteğe bağlı takip meta verileri vardır. V1 için desteklenen tek fragman crc64 kontrol toplamı.

İkili Format, v1

Structured Body v1 ikili formatı şu şekilde tanımlanır:

Header:
   uint8      message-version
   uint64     message-length
   uint16     message-flags
   uint16     num-segments

Segment(s):
   uint16     segment-num
   uint64     segment-data-length (dl)
   byte[dl]   segment-data
   byte[8]    [optional] segment-data-crc64

Trailer:
   byte[8]    [optional] message-data-crc64

Tüm tamsayı veri türleri little-endian olarak kodlanır.

Saha Referansı

Veri Alanı Türü Description
message-version uint8 Mesajın şema versiyonu. Bu olmalıdır 1.
message-length uint64 Tam mesajın uzunluğu. Bir HTTP mesajında bu başlıkla Content-Length eşleşmelidir.
message-flags uint16 Bu mesaj için bayraklar (seçenekler) etkinleştirildi. Sürüm 1 sadece kontrol toplamları için tek bir bayrak crc64 desteğini verir. Bayraklara bakınız.
num-segments uint16 Mesajda yer alan segment sayısı. Bu en azından 1öyle olmalı. Bölümlere bakınız
segment-num uint16 Mevcut bölüm #. İlk segment, 1 sonraki her segment için artmalıdır ve artmalıdır.
segment-data-length (dl) uint64 Segmentin blob/dosya verisinin uzunluğu, bayt cinsinden.
segment-data byte[dl] Blob/dosya veri baytları.
segment-data-crc64[^1] byte[8] Segmentin için datacrc64 kontrol toplamı hesaplandı.
message-data-crc64[^1] byte[8] Mesaj verisi için hesaplanmış crc64 kontrol toplamı (tüm segmentler' data.)

[^1]: Seçenekle include-crc64 belirtildiğinde CRC64 kontrol toplamları mevcuttur. Bayraklara bakınız.

Flags

Alan, message-flags kodlanmış mesaj için seçenekler belirtmek için kullanılır. Sürüm 1 yalnızca tek bir seçeneği destekler, include-crc64ancak kalan bitler diğer kontrol toplamı algoritmaları ve meta veriler gibi gelecekteki seçenekler için ayrılmıştır.

Değer İsim Description
0x0001 include-crc64 crc64 kontrol toplamlarını segmentlere ve mesaj fragmanına ekleyin.
0x0002-0x8000 Gelecek sürümler için ayrılmıştır.

Segmentler

Kodlanmış mesajlar bir veya daha fazla segmente ayrılır. Her segment kendi segment #, segment verisi ve bir kontrol toplamı[^1] içerir. Bu tasarım, büyük talepler için artılı bütünlük doğrulamasına olanak tanır ve kısmi indirmelerin yeniden başlatılması için faydalıdır.

Uyarı

Segmentler ile 1başlayan şekilde numaralandırılır. Segmentlerin en fazla sayısı .65535

Boş Segmentler

Segmentlerin boş segment-data bir alanı olabileceğini unutmayın. Tek ve boş bir segmente sahip olan boş blob örneğine bakınız. Boş segmentlerde bir segment-data-length ' 0 olmalı ve eğer include-crc64 etkinleştirilmişse, geçerli kontrol toplamı da içermelidir.

Segment Boyutu

HTTP isteğinde uygun ayar bulunan bir GetBlob veya ReadFile isteğinde x-ms-structured-body , hizmet blob veya dosya verisini kodlanmış yanıtta 4MiB segmentlere böler. Mesaj maksimum segment sayısını aşarsa, segment boyutu artırılır.

Bir istemciden yüklenen blob veya dosya verileri için, hizmet herhangi bir boyutta veya farklı boyutta segmentleri kabul eder. Önerilen 4MiB veya daha büyük segment boyutlarının kullanılmasıdır. SDK'lar varsayılan olarak 4MiB segment boyutlarını kullanır.

CRC64 içerik doğrulaması

CRC64 içerik doğrulaması, Azure Storage REST API'sinde desteklenen API'ler için kontrol toplamı doğrulamasını sağlayan bir özelliktir. CRC64 algoritmalarının birçok varyantı vardır. CRC64 kontrol toplamları CRC64-NVME (diğer adıyla CRC64-Rocksoft) kullanılarak hesaplanır. Bu özellik, aktarılan içeriğin bütünlüğünü doğrulamak için özel bir CRC64 polinomu kullanır. Bu kontrol toplamının iki şekilde kullanılabileceği iki yöntem vardır:

  • Yapılandırılmış gövde: CRC64 kontrol toplamları, veri akışı sırasında kontrol toplamlarının doğrulanmasına olanak tanıyan API isteğinin gövdesine gömülüşüdür.
  • İşlemsel CRC64 kontrol toplamları (yalnızca yüklemelerde desteklenir): Her bireysel API isteği için, istemci CRC64 kontrol toplamını hesaplar ve değeri başlığa ayarlar. x-ms-content-crc64 Depolama hizmeti, alınan baytların kontrol toplamının başlıkta sağlanan kontrol toplamıyla eşleştiğini doğrular.

Polinom

Bu CRC64 varyantı bit-yansıtıcıdır (yansıtılmayan polinom 0xad93d23594c93659 temelinde) ve CRC giriş ve çıkış bitlerini ters çevirir.

Örnekler

Örnek - Boş Kodlanmış Mesaj

Bu örnek, veri olmadan yapılandırılmış gövde formatıyla kodlanmış bir mesajı gösterir. Mesajın boş bir segment içermesi gerektiğini unutmayın.

// header: 13 bytes
0x01, // message-version: 1
0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // message-length: 39
0x01, 0x00, // message-flags: 1 (include-crc64)
0x01, 0x00, // num-segments: 1

// segment 1: 18 bytes
0x01, 0x00, // segment-num: 1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // segment-data-length: 0
// segment-data: empty
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // segment-data-crc64: 0

// trailer: 8 bytes
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // message-data-crc64: 0

Örnek - crc64 olmadan boş kodlanmış mesaj

Bu örnek, veri olmadan ve seçeneği include-crc64 etkin olmayan kodlanmış bir mesajı gösterir.

// header: 13 bytes
0x01, // message-version: 1
0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // message-length: 23
0x00, 0x00, // message-flags: 0 (none)
0x01, 0x00, // num-segments: 1

// segment 1: 10 bytes
0x01, 0x00, // segment-num: 1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // segment-data-length: 0
// segment-data: empty

// trailer: empty

Örnek - İki Segmentli Kodlanmış Mesaj ve crc64 Kontrol Toplamı

// header: 13 bytes
0x01, // message-version: 1
0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // message-length: 59
0x01, 0x00, // message-flags: 1 (include-crc64)
0x02, 0x00, // num-segments: 2

// segment 1: 19 bytes
0x01, 0x00, // segment-num: 1
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // segment-data-length: 1
0x11, // segment-data
0xd0, 0x61, 0x67, 0x57, 0xb4, 0x5f, 0x54, 0xd2, // segment-data-crc64

// segment 2: 19 bytes
0x02, 0x00, // segment-num: 2
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // segment-data-length: 1
0x22, // segment-data
0xd8, 0x4a, 0xfb, 0x9e, 0xa0, 0x4f, 0xc6, 0xda, // segment-data-crc64

// trailer: 8 bytes
0xe2, 0xa6, 0x37, 0x74, 0x50, 0xad, 0xc2, 0xef // message-data-crc64