目錄
前置知識:HTTP協議
數據的分塊傳輸
我們都知道http協議是由TCP協議封裝而來的應用層協議。我們和服務器之間的每次http交互都要進行三次握手和四次揮手。那么,服務器端怎么判斷客戶端傳來的數據已經發送完了,然后斷開這次tcp連接呢?我們客戶端在發送給服務器端報文中有一個Connection字段,一般這個值為close。也就是說這次數據傳輸完成了,服務器就會斷開這次tcp連接。但是,當我們要傳送的數據量比較大時,一次傳輸不能傳輸完成時,該如何辦呢?這就要用到數據的分塊傳輸了。
當使用分塊傳輸時,請求頭中的 Connection字段的值為:keep-alive ,最后一個數據包的Connection字段值為:close。
當服務器端收到Connection值為keep-alive的數據包時,會先將它存儲在一個緩沖區中,當收到Connection值為close的數據包時,即表明這次數據傳輸完成!
通常,Content-Length消息頭字段表示數據的長度。數據的長度很重要,因為服務器端需要知道哪里是應答消息的結束,以及后續應答消息的開始。然而,使用分塊傳輸編碼,數據分解成一系列數據塊,並以一個或多個塊發送,這樣可以發送數據而不需要預先知道發送內容的總大小。通常數據塊的大小是一致的,但也不總是這種情況。於是我們分塊進行傳輸數據的每一次請求的Content-Length是我們這次請求的大小,當服務器端收到 Connection值為close的請求消息后,就會把之前的Content-Length加起來,即是我們請求的數據的總大小了。
數據的分段編碼(transfer-encoding)
數據的分段編碼就是將完整的請求數據,分段進行編碼傳輸。在請求頭中加入這么一個字段: Transfer-Encoding: chunked ,即表示這個報文采用了分段編碼,分段編碼只適用於POST提交方式。
這時,POST請求報文中的數據部分需要改為用一系列分段來傳輸。每個分段包含十六進制的長度值和數據,空格也算一個長度值,長度值獨占一行,最后需要用0獨占一行表示編碼結束。並在0后空兩行表示數據包結束,不然點擊提交按鈕后會看到一直處於waiting狀態。
相關文章:在HTTP協議層面繞過WAF