http詳解

2.?HTTP版本之概念篇

HTTP(超文本傳輸協(xié)議),是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,定義了瀏覽器怎樣向服務(wù)器請求文檔,以及服務(wù)器怎樣把文檔傳送給瀏覽器。HTTP基于TCP/IP協(xié)議的應(yīng)用層協(xié)議,它不涉及數(shù)據(jù)包傳輸,主要規(guī)定了客戶端和服務(wù)器之間的通信格式,默認(rèn)使用80端口。

HTTP/0.9版本篇


要點

客戶端向服務(wù)器請求網(wǎng)頁,服務(wù)器只能回應(yīng)HTML格式的字符串,不能回應(yīng)別的格式。

只有GET方式

服務(wù)器發(fā)送完畢。就關(guān)閉TCP連接

缺點

每個TCP連接只能發(fā)送一個請求;發(fā)送數(shù)據(jù)完畢,連接就關(guān)閉,如果還要請求其他資源,就必須再新建一個連接

TCP連接的新建成本很高,因為需要客戶端和服務(wù)器三次握手,并且開始時發(fā)送速率較慢

網(wǎng)頁加載的外部資源越多,性能就越差

只有一種請求方式

HTTP/1.0版本篇

要點

任何格式的內(nèi)容都可以發(fā)送?;ヂ?lián)網(wǎng)不僅可以傳輸文字,還可以傳輸圖像,視頻,二進(jìn)制文件。(由于發(fā)送的數(shù)據(jù)可以是任何格式,因此可以把數(shù)據(jù)壓縮后再發(fā)送。CONTENT-ENCODING字段說明數(shù)據(jù)壓縮的方法

壓縮的方式有(可以并列多個,用逗號隔開):CONTENT-ENCODING:GZIPCONTENT-ENCODING:COMPRESSCONTENT-ENCODING:DEATE

除了GET命令,還引入POST命令和HEAD命令,豐富了瀏覽器與服務(wù)器的互動手段。

HTTP請求和回應(yīng)格式發(fā)生改變,除了數(shù)據(jù)部分,每次通信都包括頭部分,用來描述數(shù)據(jù),

新增的功能還包括:狀態(tài)碼(STATUS CODE),多字符集支持,多部分發(fā)送(MULTI-PART TYPE),權(quán)限(ANTHORIZATION),緩存(CACHE),內(nèi)容編碼(CONTENT ENCODING)等

HTTP/1.0請求的例子:

GET/HTTP/1.0 USER-AGENT:MOZILLA/5.0(MACINTOSH;INTEL MAC OS X 10_10_5 ) ACCEPT:*/*第一行為請求命令,必須在尾部添加協(xié)議版本(HTTP/1.0)

后面為多行頭信息,描述客戶端情況

HTTP/1.0回應(yīng)的例子:

HTTP/1.0 200 OK? ? ? ? ? ? ? /*協(xié)議版本+狀態(tài)碼+狀態(tài)描述*/CONTENT-TYPE: TEXT/PLAIN? CONTENT-LENGTH: 137582EXPIRES: THU, 05 DEC 1997 16:00:00 GMTLAST-MODIFIED: WED, 5 AUGUST 1996 15:55:28 GMTSERVER: APACHE 0.84

<HTML>

? <BODY>HELLO WORLD</BODY>

</HTML>

CONTENT-TYPE:字符編碼,HTTP 1.0規(guī)定 頭部必須是ASCII碼,后面可以是任何格式,

因此,服務(wù)器回應(yīng)時,CONTENT-TYPE的作用是:告訴客戶端,數(shù)據(jù)是什么格式

缺點

非持續(xù)連接:每個TCP連接只能發(fā)送一個請求,每請求一個文檔就需要兩倍的RTT往返時間開銷(一個RTT用于連接TCP連接,另一個用于請求和接收文檔)。


如圖所示:當(dāng)HTTP協(xié)議首先要與服務(wù)器建立TCP連接,這就需要三次握手。當(dāng)三次握手的前兩部分完成后(即經(jīng)過一個RTT時間后),萬維網(wǎng)客戶就把HTTP請求報文作為第三次握手的第三個報文的數(shù)據(jù)發(fā)送給萬維網(wǎng)服務(wù)器,服務(wù)器收到HTTP報文后,就把所請求的文檔作為響應(yīng)報文返回給客戶。

發(fā)送數(shù)據(jù)完畢,連接就關(guān)閉,如果還要請求其他資源,就必須再新建一個連接。

TCP連接的新建成本很高,因為需要客戶端和服務(wù)器三次握手,并且開始時發(fā)送速率較慢。(為了解決這個問題:有些瀏覽器在請求時,用了一個非標(biāo)準(zhǔn)的CONNECTION字段。即CONNECTION:KEEP-ALIVE請求服務(wù)器不要關(guān)閉TCP連接,以便其他請求復(fù)用,服務(wù)器同樣回復(fù)這個字段;以實現(xiàn)TCP的復(fù)用,直到客戶端或服務(wù)器主動關(guān)閉連接,但,這不是標(biāo)準(zhǔn)字段,不同實現(xiàn)的行為可能不一致,因此不是根本的解決辦法。

網(wǎng)頁加載的外部資源越多,性能就越差。

5. HTTP/1.1版本篇

要點

引入了持久連接(PERSISITENT CONNECTION),即TCP連接默認(rèn)不關(guān)閉,可以被多個請求復(fù)用,不用聲明(簡單的說:就是服務(wù)器在發(fā)送響應(yīng)后仍熱在一段時間內(nèi)保持這條連接,使同一個用戶(瀏覽器)和該服務(wù)器可以繼續(xù)在這條連接上傳送后續(xù)的HTTP請求報文和響應(yīng)報文)。CONNECTION:KEEP-ALIVE客戶端和服務(wù)器發(fā)現(xiàn)對方一段時間沒有活動,就可以主動關(guān)閉連接。不過,規(guī)范的做法是,客戶端在最后一個請求時明確要求服務(wù)器關(guān)閉TCP連接。CONNECTION:CLOSE

目前,對于同一個域名,大多數(shù)瀏覽器允許同時建立6個持久連接。

引入了管道機(jī)制,即在同一個TCP連接里面,客戶端可以同時發(fā)送多個請求。(提高HTTP協(xié)議的效率);舉例說明:客戶端需要請求兩個資源,HTTP1.0是在同一個TCP連接里面,先發(fā)送A請求,然后等待服務(wù)器做出回應(yīng),收到后再發(fā)送B請求;管道機(jī)制是允許瀏覽器同時發(fā)生A請求和B請求,但是服務(wù)器還是按照順序,先回應(yīng)A請求,完成后再回應(yīng)B請求

一個TCP連接可以傳送多個回應(yīng),勢必要有機(jī)制,區(qū)分?jǐn)?shù)據(jù)包是屬于哪一個回應(yīng)的。這就是CONTENT-LENGTH字段的作用,聲明本次回應(yīng)的數(shù)據(jù)長度。

CONTENT-LENGTH:3495告訴瀏覽器本次回應(yīng)的長度是3495個字節(jié),后面的字節(jié)就屬于下一個回應(yīng)

分塊傳輸編碼;HTTP1.1采用分塊傳輸編碼;使用CONTENT-LENGTH字段的前提是服務(wù)器發(fā)送回應(yīng)之前,必須知道回應(yīng)數(shù)據(jù)的長度。但對于一些耗時的動態(tài)操作來說,這意味著,服務(wù)器要等所有操作完成,才能發(fā)送數(shù)據(jù),顯然效率不高,更好的處理方式是:服務(wù)器每產(chǎn)生一塊數(shù)據(jù),就發(fā)送一塊,采用“流模式(STREAM)”取代“緩存模式(BUFFER)”.因此1.1版規(guī)定可以不使用CONTENT-LENGTH字段,而使用“分塊傳輸編碼”,只要請求或回應(yīng)的頭信息有TRANSFER-ENCODING字段,就表明回應(yīng)的數(shù)據(jù)將由數(shù)量未定的數(shù)據(jù)塊組成。TRANSFER-ENCODING:CHUNKED?每個非空的數(shù)據(jù)塊之前,會有16進(jìn)制的數(shù)值,表示這個塊的長度,最后是一個大小為0的塊,就表示本次回應(yīng)的數(shù)據(jù)發(fā)送完。

Eg:

HTTP/1.1 200 OKCONTENT-TYPE: TEXT/PLAINTRANSFER-ENCODING: CHUNKED

25

THIS IS THE DATA IN THE FIRST CHUNK

1CAND THIS IS THE SECOND ONE

3

CON

8

SEQUENCE

0

** 新增功能**:PUT,PATCH,HEAD,OPTIONS,DELECT. 客戶端的頭信息增加HOST字段,用來指定服務(wù)器的域名。?HOST:WWW.EXAMPLE.COM?有了HOST字段,就可以將請求發(fā)往同一臺服務(wù)器的不同的網(wǎng)站,為虛擬主機(jī)的新起打下了基礎(chǔ)。

缺點

雖然復(fù)用TCP連接,但是在同一個TCP連接里面,所有的數(shù)據(jù)通信都是按照次序進(jìn)行的。服務(wù)器只有處理完一個回應(yīng),才能進(jìn)行下一個回應(yīng)。(解決辦法:A. 減少HTTP請求數(shù);B:同時多開持久連接)

6. HTTP/2版本篇

要點

采用二進(jìn)制協(xié)議:HTTP/1.1的頭信息是文本(ASCII編碼),數(shù)據(jù)體可以是文本(解析非常麻煩),也可以是二進(jìn)制。而HTTP/2則是一個徹底的二進(jìn)制協(xié)議,頭信息和數(shù)據(jù)體都是二進(jìn)制,通稱為“幀”(FRAME):頭信息幀和數(shù)據(jù)幀。二進(jìn)制協(xié)議的一個好處是:可以定義額外的幀,解析方便。

多路復(fù)用(雙向,實時的通信):HTTP/2復(fù)用TCP連接,在一個連接里,客戶端和服務(wù)端都可以同時發(fā)送多個請求或回應(yīng),而不用按照順序一一對應(yīng),這樣就避免“隊頭阻塞”。舉例來說:在一個TCP連接里面,服務(wù)器同時收到A請求和B請求,先回應(yīng)A請求,結(jié)果發(fā)現(xiàn)處理過程非常耗時,于是就發(fā)送A請求已經(jīng)處理好的部分,接著回應(yīng)B請求,完成后,才發(fā)送B請求剩下的部分。

數(shù)據(jù)流:HTTP/2的數(shù)據(jù)流是不按順序發(fā)送的,同一個連接里面連續(xù)的數(shù)據(jù)包,可能屬于不同的回應(yīng)。因此必須要對數(shù)據(jù)包標(biāo)記,指出它屬于哪個回應(yīng)。HTTP/2將每一個請求或回應(yīng)的所有數(shù)據(jù)包,稱為一個數(shù)據(jù)流。每個數(shù)據(jù)流都有一個獨一無二的編號。數(shù)據(jù)包發(fā)送時,都必須標(biāo)記數(shù)據(jù)流ID,用于區(qū)分它屬于哪一個數(shù)據(jù)流,另外規(guī)定:客戶端發(fā)出的數(shù)據(jù)流,ID一律為奇數(shù),服務(wù)器發(fā)出的,ID為偶數(shù)。數(shù)據(jù)流發(fā)送一半時,客戶端和服務(wù)器都可以發(fā)送信號,取消這個數(shù)據(jù)流。即HTTP/2可以取消某一個請求,同時保證TCP連接還開著,可以被其他請求使用??蛻舳诉€可以指定數(shù)據(jù)流的優(yōu)先級,優(yōu)先級越高,服務(wù)器就越早回應(yīng)。

頭信息壓縮:HTTP2以前的版本協(xié)議不帶有狀態(tài),每次請求都必須附上所有的信息。所以,請求的很多字段都是重復(fù)的,比如COOKIE和USER AGENT,一模一樣的內(nèi)容,每次請求都必須附帶,這很浪費很多寬帶,也影響速度。HTTP/2優(yōu)化了這一點。引入了頭信息壓縮機(jī)制。一方面:頭信息使用GZIP或COMPRESS壓縮后再發(fā)送,另一方面,客戶端和服務(wù)端同時維護(hù)一張頭信息表,所有字段都會存入這個表,生成一個索引號,以后就不發(fā)送同樣字段,只發(fā)送索引號,提高速度。

服務(wù)器推送:HTTP/2允許服務(wù)器未經(jīng)請求,主動向客戶端發(fā)送資源-->服務(wù)器推送。eg:客戶端請求一個網(wǎng)頁,這個網(wǎng)頁里面包含靜態(tài)資源。正常情況下,客戶端必須收到網(wǎng)頁后,解析HTML源碼,發(fā)現(xiàn)有靜態(tài)資源,再發(fā)送靜態(tài)資源請求;其實,服務(wù)器可以預(yù)期到客戶端請求網(wǎng)頁后,很可能再請求靜態(tài)資源,所以主動把這些靜態(tài)資源隨網(wǎng)頁一起發(fā)給客戶端。

缺點

請求太多時也需要排隊

7. HTTPS版本篇

要點

HTTPS 是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL

HTTPS協(xié)議的主要作用是:建立一個信息安全通道,來確保數(shù)組的傳輸,確保網(wǎng)站的真實性

HTTPS的SSL加密是在傳輸層實現(xiàn)的

工作原理

客戶使用HTTPS URL訪問服務(wù)器,則要求WEB 服務(wù)器建立SSL鏈接。

WEB服務(wù)器接收到客戶端的請求之后,會將網(wǎng)站的證書(證書中包含了公鑰),返回或者說傳輸給客戶端。

客戶端和WEB服務(wù)器端開始協(xié)商SSL鏈接的安全等級,也就是加密等級。

客戶端瀏覽器通過雙方協(xié)商一致的安全等級,建立會話密鑰,然后通過網(wǎng)站的公鑰來加密會話密鑰,并傳送給網(wǎng)站。

WEB服務(wù)器通過自己的私鑰解密出會話密鑰。

WEB服務(wù)器通過會話密鑰加密與客戶端之間的通信。

優(yōu)點

使用HTTPS協(xié)議可認(rèn)證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機(jī)和服務(wù)器

HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比HTTP協(xié)議安全,可防止數(shù)據(jù)在傳輸過程中不被竊取、改變,確保數(shù)據(jù)的完整性。

HTTPS是現(xiàn)行架構(gòu)下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本。

缺點

HTTPS握手階段比較費時,會使頁面加載時間延長50%,增加10%~20%的耗電。

HTTPS緩存不如HTTP高效,會增加數(shù)據(jù)開銷。

SSL證書也需要錢,功能越強(qiáng)大的證書費用越高。

SSL證書需要綁定IP,不能再同一個IP上綁定多個域名,IPV4資源支持不了這種消耗。

HTTP和HTTPS的區(qū)別

HTTPS協(xié)議需要證書,費用較高。

HTTP是超文本傳輸協(xié)議,傳輸?shù)臄?shù)據(jù)都是未加密的即明文傳輸,HTTPS則是具有安全性的SSL加密傳輸協(xié)議。

使用不同的鏈接方式,端口也不同,一般而言,HTTP協(xié)議的端口為80,HTTPS的端口為443

HTTP協(xié)議是無連接,無狀態(tài)的;(無連接:雖然HTTP使用了TCP連接,但通信的雙方在交換HTTP報文之前不需要建立HTTP連接;無狀態(tài):是指服務(wù)端對于客戶端每次發(fā)送的請求都認(rèn)為它是一個新的請求,上一次會話和下一次會話沒有聯(lián)系);HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比HTTP協(xié)議安全。

HTTPS提升訪問速度(可以對于,請求資源所需時間更少,訪問速度更快,相比HTTP1.0)

HTTPS允許多路復(fù)用:多路復(fù)用允許同時通過單一的HTTP/2連接發(fā)送多重請求-響應(yīng)信息。改善了:在HTTP1.1中,瀏覽器客戶端在同一時間,針對同一域名下的請求有一定數(shù)量限制(連接數(shù)量),超過限制會被阻塞。

二進(jìn)制分幀:HTTP2.0會將所有的傳輸信息分割為更小的信息或者幀,并對他們進(jìn)行二進(jìn)制編碼

HTTP2首部壓縮;服務(wù)器端推送(相對于HTTP1.0)

7. SSL/TLS協(xié)議介紹

互聯(lián)網(wǎng)的通信安全是建立在SSL/TLS協(xié)議之上。不使用SSL/TLS的HTTP協(xié)議,就是不加密的通信;會帶來三大風(fēng)險:

(1)竊聽風(fēng)險:第三方可以獲取通信內(nèi)容;

(2)篡改風(fēng)險:第三方可以修改通信內(nèi)容。

(3)冒失風(fēng)險:第三方可以冒充他人身份參與通信。

SSL/TLS就是為了解決這三大風(fēng)險而設(shè)計的,希望達(dá)到:

(1)所有信息都是加密傳播,第三方無法竊聽

(2)具有校驗機(jī)制,一旦被篡改,通信雙方立即發(fā)現(xiàn)。

(3)配備身份證書,防止身份被冒充。

SSL/TLS協(xié)議的基本思路

采用公鑰加密法,即客戶端先向服務(wù)端索要公鑰,然后用公鑰加密信息,客戶端收到密文后,用自己的私鑰解密。

如何保證公鑰不被篡改?

解決方法:將公鑰放在數(shù)字證書中。只要證書是可信的,公鑰就是可信的。

公鑰加密計算量太大,如何減少耗用的時間?

解決方法:每一次對話(SESSION),客戶端和服務(wù)器端都生成一個"對話密鑰"(SESSION KEY),用它來加密信息。由于"對話密鑰"是對稱加密,所以運算速度非常快,而服務(wù)器公鑰只用于加密"對話密鑰"本身,這樣就減少了加密運算的消耗時間。

SSL/TLS協(xié)議的基本過程:

(1) 客戶端向服務(wù)器端索要并驗證公鑰。

(2) 雙方協(xié)商生成"對話密鑰"。

(3) 雙方采用"對話密鑰"進(jìn)行加密通信。 上面過程的前兩步,又稱為"握手階段"(HANDSHAKE)。 開始加密通信之前,客戶端和服務(wù)器首先必須建立連接和交換參數(shù),這個過程叫做握手;HTTP耗時 = TCP握手;HTTPS耗時 = TCP握手 + SSL握手 所以,HTTPS肯定比HTTP耗時,這就叫SSL延遲

8.** 參考文章**

http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

http://www.ruanyifeng.com/blog/2016/08/http.html

https://github.com/forthealllight/blog/issues/19

https://github.com/YanceyOfficial/interview/blob/master/HTTP/%5BHTTP%20%E7%B3%BB%E5%88%97%5D%20%E7%AC%AC%202%20%E7%AF%87%20%E2%80%94%E2%80%94%20HTTP%20%E5%8D%8F%E8%AE%AE%E9%82%A3%E4%BA%9B%E4%BA%8B.md

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 爬蟲又稱網(wǎng)絡(luò)爬蟲,所以在講解爬蟲之前,我們有必要了解一下什么是網(wǎng)絡(luò)?網(wǎng)絡(luò)是由若干節(jié)點和連接這些節(jié)點的鏈路構(gòu)成,然后...
    豬哥66閱讀 468評論 0 0
  • 作者:滌生_Woo鏈接:http://www.itdecent.cn/p/6e9e4156ece3 本篇文章篇幅...
    Fi的學(xué)習(xí)筆記閱讀 1,830評論 0 4
  • HTTP屬于老話題了,在項目中我們經(jīng)常需要往服務(wù)端發(fā)POST或者GET請求,但是對于HTTP的了解不應(yīng)只局限于此。...
    Www劉閱讀 1,154評論 6 7
  • 看過很多次http相關(guān)知識了,但沒做過什么總結(jié),這里就仔細(xì)總結(jié)下吧。 tip下,我是根據(jù)《圖解http》總結(jié)的,這...
    pengweinan閱讀 414評論 0 0
  • IPV4和IPV6的區(qū)別 - 小螞蟻zoe - 博客園 1.IPv6 把 IP 地址由 32 位增加到 128 位...
    一代驕馬閱讀 492評論 0 1

友情鏈接更多精彩內(nèi)容