HTTP 協議入門(轉)

(轉自:http://www.ruanyifeng.com/blog/2016/08/http.html
HTTP 協議是互聯網的基礎協議柜思,也是網頁開發(fā)的必備知識漆改,最新版本 HTTP/2 更是讓它成為技術熱點畸颅。

本文介紹 HTTP 協議的歷史演變和設計思路抛计。

image

一挺身、HTTP/0.9

HTTP 是基于 TCP/IP 協議的應用層協議透乾。它不涉及數據包(packet)傳輸,主要規(guī)定了客戶端和服務器之間的通信格式,默認使用80端口从隆。

最早版本是1991年發(fā)布的0.9版。該版本極其簡單缭裆,只有一個命令GET键闺。


GET /index.html

上面命令表示,TCP 連接(connection)建立后幼驶,客戶端向服務器請求(request)網頁index.html艾杏。

協議規(guī)定,服務器只能回應HTML格式的字符串盅藻,不能回應別的格式购桑。


<html>
  <body>Hello World</body>
</html>

服務器發(fā)送完畢,就關閉TCP連接氏淑。

二勃蜘、HTTP/1.0

2.1 簡介

1996年5月,HTTP/1.0 版本發(fā)布假残,內容大大增加缭贡。

首先炉擅,任何格式的內容都可以發(fā)送。這使得互聯網不僅可以傳輸文字阳惹,還能傳輸圖像谍失、視頻、二進制文件莹汤。這為互聯網的大發(fā)展奠定了基礎快鱼。

其次,除了GET命令纲岭,還引入了POST命令和HEAD命令抹竹,豐富了瀏覽器與服務器的互動手段。

再次止潮,HTTP請求和回應的格式也變了窃判。除了數據部分,每次通信都必須包括頭信息(HTTP header)喇闸,用來描述一些元數據袄琳。

其他的新增功能還包括狀態(tài)碼(status code)、多字符集支持仅偎、多部分發(fā)送(multi-part type)跨蟹、權限(authorization)、緩存(cache)橘沥、內容編碼(content encoding)等窗轩。

2.2 請求格式

下面是一個1.0版的HTTP請求的例子。


GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

可以看到座咆,這個格式與0.9版有很大變化痢艺。

第一行是請求命令,必須在尾部添加協議版本(HTTP/1.0)介陶。后面就是多行頭信息堤舒,描述客戶端的情況。

2.3 回應格式

服務器的回應如下哺呜。


HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

<html>
  <body>Hello World</body>
</html>

回應的格式是"頭信息 + 一個空行(\r\n) + 數據"舌缤。其中,第一行是"協議版本 + 狀態(tài)碼(status code) + 狀態(tài)描述"某残。

2.4 Content-Type 字段

關于字符的編碼国撵,1.0版規(guī)定,頭信息必須是 ASCII 碼玻墅,后面的數據可以是任何格式介牙。因此,服務器回應的時候澳厢,必須告訴客戶端环础,數據是什么格式囚似,這就是Content-Type字段的作用。

下面是一些常見的Content-Type字段的值线得。

  • text/plain
  • text/html
  • text/css
  • image/jpeg
  • image/png
  • image/svg+xml
  • audio/mp4
  • video/mp4
  • application/javascript
  • application/pdf
  • application/zip
  • application/atom+xml

這些數據類型總稱為MIME type饶唤,每個值包括一級類型和二級類型,之間用斜杠分隔贯钩。

除了預定義的類型搬素,廠商也可以自定義類型。


application/vnd.debian.binary-package

上面的類型表明魏保,發(fā)送的是Debian系統的二進制數據包。

MIME type還可以在尾部使用分號摸屠,添加參數谓罗。


Content-Type: text/html; charset=utf-8

上面的類型表明,發(fā)送的是網頁季二,而且編碼是UTF-8檩咱。

客戶端請求的時候,可以使用Accept字段聲明自己可以接受哪些數據格式胯舷。


Accept: */*

上面代碼中刻蚯,客戶端聲明自己可以接受任何格式的數據。

MIME type不僅用在HTTP協議桑嘶,還可以用在其他地方炊汹,比如HTML網頁。


<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!-- 等同于 -->
<meta charset="utf-8" /> 

2.5 Content-Encoding 字段

由于發(fā)送的數據可以是任何格式逃顶,因此可以把數據壓縮后再發(fā)送讨便。Content-Encoding字段說明數據的壓縮方法。


Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate

客戶端在請求時以政,用Accept-Encoding字段說明自己可以接受哪些壓縮方法霸褒。


Accept-Encoding: gzip, deflate

2.6 缺點

HTTP/1.0 版的主要缺點是,每個TCP連接只能發(fā)送一個請求盈蛮。發(fā)送數據完畢废菱,連接就關閉,如果還要請求其他資源抖誉,就必須再新建一個連接殊轴。

TCP連接的新建成本很高,因為需要客戶端和服務器三次握手寸五,并且開始時發(fā)送速率較慢(slow start)梳凛。所以,HTTP 1.0版本的性能比較差梳杏。隨著網頁加載的外部資源越來越多韧拒,這個問題就愈發(fā)突出了淹接。

為了解決這個問題,有些瀏覽器在請求時叛溢,用了一個非標準的Connection字段塑悼。


Connection: keep-alive

這個字段要求服務器不要關閉TCP連接,以便其他請求復用楷掉。服務器同樣回應這個字段厢蒜。


Connection: keep-alive

一個可以復用的TCP連接就建立了,直到客戶端或服務器主動關閉連接烹植。但是斑鸦,這不是標準字段,不同實現的行為可能不一致草雕,因此不是根本的解決辦法巷屿。

三、HTTP/1.1

1997年1月墩虹,HTTP/1.1 版本發(fā)布嘱巾,只比 1.0 版本晚了半年。它進一步完善了 HTTP 協議诫钓,一直用到了20年后的今天旬昭,直到現在還是最流行的版本。

3.1 持久連接

1.1 版的最大變化菌湃,就是引入了持久連接(persistent connection)问拘,即TCP連接默認不關閉,可以被多個請求復用慢味,不用聲明Connection: keep-alive场梆。

客戶端和服務器發(fā)現對方一段時間沒有活動,就可以主動關閉連接纯路。不過或油,規(guī)范的做法是,客戶端在最后一個請求時驰唬,發(fā)送Connection: close顶岸,明確要求服務器關閉TCP連接。


Connection: close

目前叫编,對于同一個域名辖佣,大多數瀏覽器允許同時建立6個持久連接。

3.2 管道機制

1.1 版還引入了管道機制(pipelining)搓逾,即在同一個TCP連接里面卷谈,客戶端可以同時發(fā)送多個請求。這樣就進一步改進了HTTP協議的效率霞篡。

舉例來說世蔗,客戶端需要請求兩個資源端逼。以前的做法是,在同一個TCP連接里面污淋,先發(fā)送A請求顶滩,然后等待服務器做出回應,收到后再發(fā)出B請求寸爆。管道機制則是允許瀏覽器同時發(fā)出A請求和B請求礁鲁,但是服務器還是按照順序,先回應A請求赁豆,完成后再回應B請求仅醇。

3.3 Content-Length 字段

一個TCP連接現在可以傳送多個回應,勢必就要有一種機制魔种,區(qū)分數據包是屬于哪一個回應的着憨。這就是Content-length字段的作用,聲明本次回應的數據長度务嫡。


Content-Length: 3495

上面代碼告訴瀏覽器,本次回應的長度是3495個字節(jié)漆改,后面的字節(jié)就屬于下一個回應了心铃。

在1.0版中,Content-Length字段不是必需的挫剑,因為瀏覽器發(fā)現服務器關閉了TCP連接去扣,就表明收到的數據包已經全了。

3.4 分塊傳輸編碼

使用Content-Length字段的前提條件是樊破,服務器發(fā)送回應之前愉棱,必須知道回應的數據長度。

對于一些很耗時的動態(tài)操作來說哲戚,這意味著奔滑,服務器要等到所有操作完成,才能發(fā)送數據顺少,顯然這樣的效率不高朋其。更好的處理方法是,產生一塊數據脆炎,就發(fā)送一塊梅猿,采用"流模式"(stream)取代"緩存模式"(buffer)。

因此秒裕,1.1版規(guī)定可以不使用Content-Length字段袱蚓,而使用"分塊傳輸編碼"(chunked transfer encoding)。只要請求或回應的頭信息有Transfer-Encoding字段几蜻,就表明回應將由數量未定的數據塊組成喇潘。


Transfer-Encoding: chunked

每個非空的數據塊之前体斩,會有一個16進制的數值,表示這個塊的長度响蓉。最后是一個大小為0的塊硕勿,就表示本次回應的數據發(fā)送完了。下面是一個例子枫甲。


HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk

1C
and this is the second one

3
con

8
sequence

0

3.5 其他功能

1.1版還新增了許多動詞方法:PUT源武、PATCHHEAD想幻、 OPTIONS粱栖、DELETE

另外脏毯,客戶端請求的頭信息新增了Host字段闹究,用來指定服務器的域名。


Host: www.example.com

有了Host字段食店,就可以將請求發(fā)往同一臺服務器上的不同網站渣淤,為虛擬主機的興起打下了基礎。

3.6 缺點

雖然1.1版允許復用TCP連接吉嫩,但是同一個TCP連接里面价认,所有的數據通信是按次序進行的。服務器只有處理完一個回應自娩,才會進行下一個回應用踩。要是前面的回應特別慢,后面就會有許多請求排隊等著忙迁。這稱為"隊頭堵塞"(Head-of-line blocking)脐彩。

為了避免這個問題,只有兩種方法:一是減少請求數姊扔,二是同時多開持久連接惠奸。這導致了很多的網頁優(yōu)化技巧,比如合并腳本和樣式表恰梢、將圖片嵌入CSS代碼晨川、域名分片(domain sharding)等等。如果HTTP協議設計得更好一些删豺,這些額外的工作是可以避免的共虑。

四、SPDY 協議

2009年呀页,谷歌公開了自行研發(fā)的 SPDY 協議妈拌,主要解決 HTTP/1.1 效率不高的問題。

這個協議在Chrome瀏覽器上證明可行以后,就被當作 HTTP/2 的基礎尘分,主要特性都在 HTTP/2 之中得到繼承猜惋。

五、HTTP/2

2015年培愁,HTTP/2 發(fā)布著摔。它不叫 HTTP/2.0,是因為標準委員會不打算再發(fā)布子版本了定续,下一個新版本將是 HTTP/3谍咆。

5.1 二進制協議

HTTP/1.1 版的頭信息肯定是文本(ASCII編碼),數據體可以是文本私股,也可以是二進制摹察。HTTP/2 則是一個徹底的二進制協議,頭信息和數據體都是二進制倡鲸,并且統稱為"幀"(frame):頭信息幀和數據幀供嚎。

二進制協議的一個好處是,可以定義額外的幀峭状。HTTP/2 定義了近十種幀克滴,為將來的高級應用打好了基礎。如果使用文本實現這種功能优床,解析數據將會變得非常麻煩偿曙,二進制解析則方便得多。

5.2 多工

HTTP/2 復用TCP連接羔巢,在一個連接里,客戶端和瀏覽器都可以同時發(fā)送多個請求或回應罩阵,而且不用按照順序一一對應竿秆,這樣就避免了"隊頭堵塞"。

舉例來說稿壁,在一個TCP連接里面幽钢,服務器同時收到了A請求和B請求,于是先回應A請求傅是,結果發(fā)現處理過程非常耗時匪燕,于是就發(fā)送A請求已經處理好的部分, 接著回應B請求喧笔,完成后帽驯,再發(fā)送A請求剩下的部分。

這樣雙向的书闸、實時的通信尼变,就叫做多工(Multiplexing)。

5.3 數據流

因為 HTTP/2 的數據包是不按順序發(fā)送的浆劲,同一個連接里面連續(xù)的數據包嫌术,可能屬于不同的回應哀澈。因此,必須要對數據包做標記度气,指出它屬于哪個回應割按。

HTTP/2 將每個請求或回應的所有數據包,稱為一個數據流(stream)磷籍。每個數據流都有一個獨一無二的編號适荣。數據包發(fā)送的時候,都必須標記數據流ID择示,用來區(qū)分它屬于哪個數據流束凑。另外還規(guī)定,客戶端發(fā)出的數據流栅盲,ID一律為奇數汪诉,服務器發(fā)出的,ID為偶數谈秫。

數據流發(fā)送到一半的時候扒寄,客戶端和服務器都可以發(fā)送信號(RST_STREAM幀),取消這個數據流拟烫。1.1版取消數據流的唯一方法该编,就是關閉TCP連接。這就是說硕淑,HTTP/2 可以取消某一次請求课竣,同時保證TCP連接還打開著,可以被其他請求使用置媳。

客戶端還可以指定數據流的優(yōu)先級于樟。優(yōu)先級越高,服務器就會越早回應拇囊。

5.4 頭信息壓縮

HTTP 協議不帶有狀態(tài)迂曲,每次請求都必須附上所有信息。所以寥袭,請求的很多字段都是重復的路捧,比如CookieUser Agent,一模一樣的內容传黄,每次請求都必須附帶杰扫,這會浪費很多帶寬,也影響速度膘掰。

HTTP/2 對這一點做了優(yōu)化涉波,引入了頭信息壓縮機制(header compression)。一方面,頭信息使用gzipcompress壓縮后再發(fā)送啤覆;另一方面苍日,客戶端和服務器同時維護一張頭信息表,所有字段都會存入這個表窗声,生成一個索引號相恃,以后就不發(fā)送同樣字段了,只發(fā)送索引號笨觅,這樣就提高速度了拦耐。

5.5 服務器推送

HTTP/2 允許服務器未經請求,主動向客戶端發(fā)送資源见剩,這叫做服務器推送(server push)杀糯。

常見場景是客戶端請求一個網頁,這個網頁里面包含很多靜態(tài)資源苍苞。正常情況下固翰,客戶端必須收到網頁后,解析HTML源碼羹呵,發(fā)現有靜態(tài)資源骂际,再發(fā)出靜態(tài)資源請求。其實冈欢,服務器可以預期到客戶端請求網頁后歉铝,很可能會再請求靜態(tài)資源,所以就主動把這些靜態(tài)資源隨著網頁一起發(fā)給客戶端了凑耻。

六太示、參考鏈接

(完)

文檔信息

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末香浩,一起剝皮案震驚了整個濱河市类缤,隨后出現的幾起案子,更是在濱河造成了極大的恐慌弃衍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坚俗,死亡現場離奇詭異镜盯,居然都是意外死亡,警方通過查閱死者的電腦和手機猖败,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門速缆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恩闻,你說我怎么就攤上這事艺糜。” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵破停,是天一觀的道長翅楼。 經常有香客問我,道長真慢,這世上最難降的妖魔是什么毅臊? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮黑界,結果婚禮上管嬉,老公的妹妹穿的比我還像新娘。我一直安慰自己朗鸠,他們只是感情好蚯撩,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烛占,像睡著了一般胎挎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扰楼,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天呀癣,我揣著相機與錄音,去河邊找鬼弦赖。 笑死项栏,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蹬竖。 我是一名探鬼主播沼沈,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼币厕!你這毒婦竟也來了列另?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤旦装,失蹤者是張志新(化名)和其女友劉穎页衙,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體阴绢,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡店乐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了呻袭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眨八。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖左电,靈堂內的尸體忽然破棺而出廉侧,到底是詐尸還是另有隱情页响,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布段誊,位于F島的核電站闰蚕,受9級特大地震影響,放射性物質發(fā)生泄漏枕扫。R本人自食惡果不足惜陪腌,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烟瞧。 院中可真熱鬧诗鸭,春花似錦、人聲如沸参滴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砾赔。三九已至蝌箍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暴心,已是汗流浹背妓盲。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留专普,地道東北人悯衬。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像檀夹,于是被迫代替她去往敵國和親筋粗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容

  • http協議有http0.9炸渡,http1.0娜亿,http1.1和http2三個版本,但是現在瀏覽器使用的是htt...
    一現_閱讀 1,855評論 0 3
  • 原文地址HTTP 協議是互聯網的基礎協議蚌堵,也是網頁開發(fā)的必備知識买决,最新版本 HTTP/2 更是讓它成為技術熱點。 ...
    baixiaoshuai閱讀 373評論 0 0
  • 深入淺出HTTP協議(WEB開發(fā)和面試必備) 1.基礎概念篇 a.簡介 HTTP是Hyper Text Trans...
    半世韶華憶闌珊閱讀 1,212評論 0 7
  • 個人認為吼畏,Goodboy1881先生的TCP /IP 協議詳解學習博客系列博客是一部非常精彩的學習筆記督赤,這雖然只是...
    貳零壹柒_fc10閱讀 5,051評論 0 8
  • 本文整理自MIN飛翔博客 [1] 1. 概念 協議是指計算機通信網絡中兩臺計算機之間進行通信所必須共同遵守的規(guī)定或...
    HoyaWhite閱讀 2,640評論 2 20