HTTP協議之chunk編碼(分塊傳輸編碼)

來源:互聯網
上載者:User

標籤:結果   分組   發送資料   tac   rom   ica   請求   沒有   hex   

分塊傳輸編碼Chunked transfer encoding)是超文字傳輸通訊協定 (HTTP)(HTTP)中的一種傳輸資料機制,同意HTTP由應用server發送給client應用( 一般是網頁瀏覽器)的資料能夠分成多個部分。分塊傳輸編碼僅僅在HTTP協議1.1版本號碼(HTTP/1.1)中提供。

通常,HTTP應答訊息中發送的資料是整個發送的。Content-Length訊息頭欄位表示資料的長度。資料的長度非常重要,由於client須要知道哪裡是應答訊息的結束,以及興許應答訊息的開始。然而,使用分塊傳輸編碼,資料分解成一系列資料區塊,並以一個或多個塊發送,這樣server能夠發送資料而不須要預Crowdsourced Security Testing道發送內容的總大小。

通常資料區塊的大小是一致的。但也不總是這樣的情況。

 

HTTP 1.1引入分塊傳輸編碼提供了下面幾點優點:

  1. HTTP分塊傳輸編碼同意server為動態產生的內容維持HTTP持久串連。通常,持久連結須要server在開始發送訊息體前發送Content-Length訊息頭欄位,可是對於動態產生的內容來說。在內容建立完之前是不可知的。[動態內容,content-length無法預知]
  2. 分塊傳輸編碼同意server在最後發送訊息頭欄位。

    對於那些頭欄位值在內容被產生之前無法知道的情形非常重要。比如訊息的內容要使用散列進行簽名,散列的結果通過HTTP訊息頭欄位進行傳輸。

    沒有分塊傳輸編碼時,server必須緩衝內容直到完畢後計算頭欄位的值並在發送內容前發送這些頭欄位的值。[散列簽名,需緩衝完畢才幹計算]

  3. HTTPserver有時使用壓縮 (gzip或deflate)以縮短傳輸花費的時間。分塊傳輸編碼能夠用來分隔壓縮對象的多個部分。在這樣的情況下,塊不是分別壓縮的,而是整個負載進行壓縮,壓縮的輸出使用本文描寫敘述的方案進行分塊傳輸。在壓縮的情形中,分塊編碼有利於一邊進行壓縮一邊發送資料,而不是先完畢壓縮過程以得知壓縮後資料的大小。[gzip壓縮。壓縮與傳輸同一時候進行]

   普通情況HTTP的Header包括Content-Length域來指明報文體的長度。有時候服務產生HTTP回應是無法確定訊息大小的,比方大檔案的下載,或者後台須要複雜的邏輯才幹所有處理頁面的請求,這時用須要即時產生訊息長度。server一般使用chunked編碼。



   在進行Chunked編碼傳輸時。在回複訊息的Headers有transfer-coding域值為chunked,表示將用chunked編碼傳輸內容。

使用chunked編碼的Headers例如以下(能夠利用FireFox的FireBug外掛程式或HttpWatch查看Headers資訊):

   採用下面方式編碼:   
    Chunked-Body=*chunk   
           "0"CRLF   
           footer   
           CRLF   
    chunk=chunk-size[chunk-ext]CRLF   
        chunk-dataCRLF   
    
    hex-no-zero=<HEXexcluding"0">   
    
    chunk-size=hex-no-zero*HEX   
    chunk-ext=*(";"chunk-ext-name["="chunk-ext-value])   
    chunk-ext-name=token   
    chunk-ext-val=token|quoted-string   
    chunk-data=chunk-size(OCTET)   
    

    footer=*entity-header 

    編碼使用若干個Chunk組成。由一個標明長度為0的chunk結束,每一個Chunk有兩部分組成,第一部分是該Chunk的長度和長度單位(一般不 寫),第二部分就是指定長度的內容。每一個部分用CRLF隔開。在最後一個長度為0的Chunk中的內容是稱為footer的內容。是一些沒有寫的頭部內 容。       下面給出一個Chunked的解碼過程(RFC文檔中有)   
    length:=0   
    readchunk-size,chunk-ext(ifany)andCRLF   
    while(chunk-size>0){   
    readchunk-dataandCRLF   
    appendchunk-datatoentity-body   
    length:=length+chunk-size   
    readchunk-sizeandCRLF   
    }   
    readentity-header   
    while(entity-headernotempty){   
    appendentity-headertoexistingheaderfields   
    readentity-header   
    }   
    Content-Length:=length   
    Remove"chunked"fromTransfer-Encoding

HTTP協議之chunk編碼(分塊傳輸編碼)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.