Transfer-Encoding 的作用

通過HTTP傳送數(shù)據(jù)時(shí)聂宾,有些時(shí)候并不能事先確定body的長(zhǎng)度,因此無法得到Content-Length的值诊笤, 就不能在header中指定Content-Length了系谐,造成的最直接的影響就是:接收方無法通過Content-Length得到報(bào)文體的長(zhǎng)度, 那怎么判斷發(fā)送方發(fā)送完畢了呢讨跟?HTTP 1.1協(xié)議在header中引入了Transfer-Encoding纪他,當(dāng)其值為chunked時(shí), 表明采用chunked編碼方式來進(jìn)行報(bào)文體的傳輸

HTTP 1.1中有兩個(gè)實(shí)體頭(Entity-Header)直接與編碼相關(guān),分別為Content-Encoding和Transfer-Encoding.
先說Content-Encoding, 該頭表示實(shí)體已經(jīng)采用了的編碼方式.Content-Encoding是請(qǐng)求URL對(duì)應(yīng)實(shí)體(Entity)本身的一部分.比如請(qǐng)求URL為http://host/image.png.gz時(shí),可能會(huì)得到的Content-Encoding為gzip.Content-Encoding的值是不區(qū)分大小寫的,目前HTTP1.1標(biāo)準(zhǔn)中已包括的有g(shù)zip/compress/deflate/identity等.
與Content-Encoding頭對(duì)應(yīng),HTTP請(qǐng)求中包含了一個(gè)Accept-Encoding頭,該頭用來說明用戶代理(User-Agent,一般也就是瀏覽器)能接受哪些類型的編碼. 如果HTTP請(qǐng)求中不存在該頭,服務(wù)器可以認(rèn)為用戶代理能接受任何編碼類型.

接下來重點(diǎn)描述Transfer-Encoding, 該頭表示為了達(dá)到安全傳輸或者數(shù)據(jù)壓縮等目的而對(duì)實(shí)體進(jìn)行的編碼. Transfer-Encoding與Content-Encoding的不同之處在于:
1, Transfer-Encoding只是在傳輸過程中才有的,并非請(qǐng)求URL對(duì)應(yīng)實(shí)體的本身特性.
2, Transfer-Encoding是一個(gè)"跳到跳"頭,而Content-Encoding是"端到端"頭.
該頭的用途舉例如,請(qǐng)求URL為http://host/abc.txt,服務(wù)器發(fā)送數(shù)據(jù)時(shí)認(rèn)為該文件可用gzip方式壓縮以節(jié)省帶寬,接收端看到Transfer-Encoding為gzip首先進(jìn)行解碼然后才能得到請(qǐng)求實(shí)體.
此外多個(gè)編碼可能同時(shí)對(duì)同一實(shí)體使用,所以Transfer-Encoding頭中編碼順序相當(dāng)重要,它代表了解碼的順序過程.同樣,Transfer-Encoding的值也是不區(qū)分大小寫的,目前HTTP1.1標(biāo)準(zhǔn)中已包括的有g(shù)zip/compress/deflate/identity/chunked等.
Transfer-Encoding中有一類特定編碼:chunked編碼.該編碼將實(shí)體分塊傳送并逐塊標(biāo)明長(zhǎng)度,直到長(zhǎng)度為0塊表示傳輸結(jié)束, 這在實(shí)體長(zhǎng)度未知時(shí)特別有用(比如由數(shù)據(jù)庫(kù)動(dòng)態(tài)產(chǎn)生的數(shù)據(jù)). HTTP1.1標(biāo)準(zhǔn)規(guī)定,只要使用了Transfer-Encoding的地方就必須使用chunked編碼,并且chunked必須為最后一層編碼.任何HTTP 1.1應(yīng)用都必須能處理chunked編碼.
與Transfer-Encoding對(duì)應(yīng)的請(qǐng)求頭為TE,它主要表示請(qǐng)求發(fā)起者愿意接收的Transfer-Encoding類型. 如果TE為空或者不存在,則表示唯一能接受的類型為chunked.
其他與Transfer-Encoding相關(guān)的頭還包括Trailer,它與chunked編碼相關(guān),就不細(xì)述了.

顧名思義,Content-Length表示傳輸?shù)膶?shí)體長(zhǎng)度,以字節(jié)為單位(在請(qǐng)求方法為HEAD時(shí)表示會(huì)要發(fā)送的長(zhǎng)度,但并不實(shí)際發(fā)送.).Content-Length受Transfer-Encoding影響很大,只要Transfer-Encoding不為identity,則實(shí)際傳輸長(zhǎng)度由編碼中的chunked決定,Content-Length即使存在也被忽略.

關(guān)于HTTP Message Body的長(zhǎng)度
在HTTP中有消息體(Message body)和實(shí)體(Entity body)之分,簡(jiǎn)單說來在沒有Transfer-Encoding作用時(shí),消息體就是實(shí)體,而應(yīng)用了Transfer-Encoding后,消息體就是編碼后的實(shí)體,如下:

    Message body = Transfer-Encoding encode(Entity body)
如何確定消息體的長(zhǎng)度? HTTP 1.1標(biāo)準(zhǔn)給出了如下方法(按照優(yōu)先級(jí)依次排列):
    1, 響應(yīng)狀態(tài)(Response Status)為1xx/204/304或者請(qǐng)求方法為HEAD時(shí),消息體長(zhǎng)度為0.
    2, 如果使用了非"identity"的Transfer-Encoding編碼方式,則消息體長(zhǎng)度由"chunked"編碼決定,除非該消息以連接關(guān)閉為結(jié)束.
    3, 如果存在"Content-Length"實(shí)體頭,則消息長(zhǎng)度為該數(shù)值.
    3, 如果消息使用關(guān)閉連接方式代表消息體結(jié)束,則長(zhǎng)度由關(guān)閉前收到的長(zhǎng)度決定. 該條對(duì)HTTP Request包含的消息體不適用.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晾匠,隨后出現(xiàn)的幾起案子茶袒,更是在濱河造成了極大的恐慌,老刑警劉巖凉馆,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薪寓,死亡現(xiàn)場(chǎng)離奇詭異亡资,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)向叉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門锥腻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人植康,你說我怎么就攤上這事旷太。” “怎么了销睁?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵供璧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我冻记,道長(zhǎng)睡毒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任冗栗,我火速辦了婚禮演顾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隅居。我一直安慰自己钠至,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布胎源。 她就那樣靜靜地躺著棉钧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涕蚤。 梳的紋絲不亂的頭發(fā)上宪卿,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音万栅,去河邊找鬼佑钾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烦粒,可吹牛的內(nèi)容都是我干的休溶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼扰她,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兽掰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起义黎,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豁跑,沒想到半個(gè)月后廉涕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泻云,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年狐蜕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宠纯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡层释,死狀恐怖婆瓜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贡羔,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布乖寒,位于F島的核電站,受9級(jí)特大地震影響楣嘁,放射性物質(zhì)發(fā)生泄漏磅轻。R本人自食惡果不足惜逐虚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一聋溜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叭爱,春花似錦撮躁、人聲如沸涤伐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祝迂。三九已至,卻和暖如春器净,著一層夾襖步出監(jiān)牢的瞬間型雳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工山害, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浪慌。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像权纤,于是被迫代替她去往敵國(guó)和親乌妒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子外邓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場(chǎng)景: 請(qǐng)求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請(qǐng)求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,521評(píng)論 0 6
  • 深入淺出HTTP協(xié)議(WEB開發(fā)和面試必備) 1.基礎(chǔ)概念篇 a.簡(jiǎn)介 HTTP是Hyper Text Trans...
    半世韶華憶闌珊閱讀 1,216評(píng)論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理侦啸,服務(wù)發(fā)現(xiàn),斷路器光涂,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 本篇文章篇幅比較長(zhǎng)豪诲,先來個(gè)思維導(dǎo)圖預(yù)覽一下顶捷。 一屎篱、概述 1.計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)分層 2.TCP/IP 通信傳輸流 ...
    滌生_Woo閱讀 54,968評(píng)論 24 557
  • http://www.cnblogs.com/skynet/archive/2010/12/11/1903347....
    jianghu000閱讀 482評(píng)論 0 2