Http協議(3)—HTTP實體和編碼

HTTP實體實現目標
        .可以被正確識別(通過Content-Type和Content-Launage)
        .可以被正確解包(通過Content-Lenght首部和Content-Encoding首部)
        .是最新的(通過實體驗證碼和緩存過期控制)
        .符合用戶需要(基於Accept系列的內容協商首部)
        .在網絡上可以快速有效的傳輸(通過範圍請求、差異編碼以及其他數據壓縮方法)
        .完整到達、未被篡改(通過傳輸編碼首部和Content-MD5校驗和首部)

一、報文是箱子,實體是貨物
        1.HTTP基本實體首部
            .Content-Type
                實體所承載對象的類型
            .Content-Length
                實體主體的長度或大小
            .Content-Launage
                與所傳送實體最相配的語言
            .Content-Encoding
                實體數據是不是已經被壓縮
            .Content-Location
                備用位置
            .Content-Range
                如果這是部分實體,則說明它是整體的哪部分
            .Content-MD5
                實體主體內容的校驗和
            .Last-Modified
                所傳輸的內容在服務器上創建或最後修改的日期
            .Expires
                實體數據將要失效的日期
            .Allow
                該資源所允許的各種請求方法,例如,GET、Post等
            .ETag
                這份文檔特定實例的唯一驗證碼
            .Cache-Control
                應該如何緩存該文檔

        2.實體主體
            
二、Content-Length:實體的大小
        1.檢測截尾
            客戶端需要通過Content-Length來檢測報文結尾以區分到底是報文結束時正常的連接關閉
            還是報文傳輸時服務器崩潰而導致的連接關閉
            緩存代理服務器不會爲沒有Content-Length首部的HTTP主題作緩存

        2.錯誤的Content-Length
            
        3.Content-Length與持久連接
            因爲持久連接,客戶端無法通過連接關閉來判斷報文是否結束,故必須帶有Content-Length
            首部.
            但是當分塊編碼時可以沒有Content-Length首部,因爲數據分爲一系列的塊來傳送,每塊都    
            有大小說明

        4.內容編碼
            如果對主體進行了內容編碼(壓縮),則Content-Length就是編碼後的主體的長度

        5.確定實體主體長度的規則
            a.如果特定的HTTP報文類型不允許帶有主體,就忽略Content-Length首部
            b.如果報文中含有描述傳輸編碼的Transfer-Encoding,那實體就由一個稱爲零字節塊的
               特殊模式結束
            c.如果報文中含有Content-Length首部,而沒有Transfer-Encoding首部,那麼Content-
              Length的值就是主體的長度,如果兩者皆有,則應該忽略Content-Length的值
            d.如果報文使用了multipart/byteranges媒體類型,並且沒有用Content-Length首部指定
                實體主體長度,那麼多部分報文的每個部分都要說明自己的大小 
            e.如果以上規則均無法匹配,則就在連接關閉的時候結束     

三、實體摘要   發送方在生成初始主體時,生成一個數據校驗和,接收方可以通過檢查這個校驗和來捕獲所有
        意外的實體修改  
        服務器使用Content-MD5首部發送對實體主體運行MD5算法

四、媒體類型和字符集
        Content-Type指明的是原始主體的媒體類型
        
        1.文本的字符編碼
            Content-Type:text/html; charset=xxxxx

        2.多部分媒體類型

        3.多部分表格提交
            Content-Type:multipart/form-data; boundary=[abcdefg......]
            boundary表明分隔主題中不同部分所用的字符串

        4.多部分範圍響應
            Content-Type:multipart/byteranges

五、內容編碼
        1.過程
            a.網站服務器生成原始響應報文,其中有原始的Content-Type和Content-Length首部
            b.內容編碼服務器創建編碼後的報文,並增加Content-Encoding首部,以便接受的應用程序
                進行解碼
            c.接收程序得到編碼後的報文,進行解碼,獲得原始報文

        2.內容編碼類型
            

        3.Accept-Encoding首部
            客戶端會把自己能夠識別的編碼列表放在Accept-Encoding首部裏發出去,如果http請求中
            沒有包含首部,則表示客戶端可以接受任何編碼方式

六、傳輸編碼和分塊編碼
        傳輸編碼與內容編碼的區別:
                經過內容編碼的報文只是對報文的實體部分進行編碼,而對於經過傳輸編碼的報文,編碼
                作用在整個報文上,報文自身的結構發生了變化

        使用傳輸編碼(Transfer-encoding)是爲了改變報文中的數據在網絡上的傳輸方式
        
        1.可靠傳輸
            傳輸報文會引發的問題
                .未知的尺寸
                        有些網關應用程序或則內容編碼器要想知道報文的大小,這時可以採用傳輸編碼來發
                        送數據,並用特別的結束腳註表明數據結束
                 .安全性
                        可以用傳輸編碼把報文內容擾亂,然後在共享的傳輸網絡上發送
        
        2.Transfer-Encoding
            .Transfer-Encoding:
                    告知接收方爲了可靠的傳輸報文,已經對其進行了何種編碼
            .TE:
                用在請求首部,告知服務器可以使用哪些傳輸編碼

        3.分塊編碼
            .把報文分割爲若干大小已知的塊,塊之間是緊挨着發送的
            .分塊編碼是一種傳輸編碼,是報文的屬性,而不是主體的屬性

            3.1.分塊與持久連接
                    .若客戶端與服務器不是持久連接,則服務端不需要知道它正在讀取的主體的長度,只需
                     要讀到服務器關閉主體連接爲止
                    .服務器在寫主體之前必須知道主體的大小,如果服務器動態創建內容,就無法知道長度,
                     分塊編碼只要服務器逐塊發出並且說明每塊大小即可,服務器可以用大小爲0的塊作爲
                     主體結束的信號
            
            3.2.分塊報文的拖掛
                
        4.內容編碼與傳輸編碼的結合
            
        
        5.傳輸編碼規則
            .傳輸編碼集合中必須包含分塊,唯一的例外是使用關閉連接來結束報文
            .當使用分塊傳輸編碼時,它必須是最後一個作用在報文中主體之上的
            .分塊傳輸編碼不能多次作用到一個報文主體之上
             以上規則使得接收方能確定報文的長度

七、驗證碼與新鮮度
        1.新鮮度
            .服務器告知客戶端能夠將內容緩存多長時間,在這個時間之內是新鮮的
            .可以用Expires首部或者Cache-Control
    
        2.有條件的請求和驗證碼
            有條件的請求:
                    .當資源改變時才請求副本
                    .通過If-Modified-Since首部實現
            驗證碼:
                    .弱驗證碼
                    .強驗證碼
                    強驗證碼能唯一標識一個實例

八、範圍請求
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章