HTTP介紹及其請(qǐng)求方法詳解

一、簡(jiǎn)介

HTTP是(hyper text transfer prototype)超文本傳輸協(xié)議,基于TCP/IP通信協(xié)議來(lái)傳輸數(shù)據(jù),其定義了客戶端與服務(wù)器端之間文本傳輸?shù)囊?guī)范。HTTP默認(rèn)使用80端口,這個(gè)端口指的是服務(wù)器端的端口,而客戶端使用的端口是動(dòng)態(tài)分配的,當(dāng)我們沒(méi)有指定端口訪問(wèn)時(shí),瀏覽器會(huì)默認(rèn)幫我們添加80端口。當(dāng)然我們也可以自己指定訪問(wèn)端口。如http://www.ip.138.com:80。需要注意的是,現(xiàn)在大多數(shù)訪問(wèn)都使用HTTPS協(xié)議,而HTTPS的默認(rèn)端口是443端口。

- 特點(diǎn)

  • HTTP是無(wú)連接的:意思是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開(kāi)連接。采用這種方式可以節(jié)省時(shí)間。
  • HTTP是媒體獨(dú)立的:只要客戶端和服務(wù)器知道如何處理數(shù)據(jù)內(nèi)容,任何類(lèi)型的數(shù)據(jù)都可以通過(guò)HTTP發(fā)送,客戶端以及服務(wù)器指定使用適合的MIME-type內(nèi)容類(lèi)型。
  • HTTP是無(wú)狀態(tài)的:無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力,缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大,另一方面,服務(wù)器不需要先前信息的時(shí)候它的應(yīng)答就較快。

二、請(qǐng)求過(guò)程

1、應(yīng)用層:發(fā)送HTTP請(qǐng)求

瀏覽器接收用戶輸入的域名,解析之后得到對(duì)應(yīng)IP地址,瀏覽器會(huì)開(kāi)始構(gòu)造一個(gè)HTTP請(qǐng)求報(bào)文。其中包括:

  • 請(qǐng)求行:請(qǐng)求方法、請(qǐng)求地址、HTTP協(xié)議版本等。例如GET /index.html HTTP/1.1。請(qǐng)求方法詳見(jiàn)第三節(jié)。
  • 請(qǐng)求頭部(request headers):由關(guān)鍵字/值對(duì)組成,每行一對(duì),關(guān)鍵字和值之間用英文":"分隔,告訴服務(wù)器關(guān)于客戶端的信息。
Header 解釋 示例
Host 接受請(qǐng)求的服務(wù)器地址,可以是IP端口號(hào),也可以是域名 Host: www.zcmhi.com
User-Agent 包含發(fā)出請(qǐng)求的用戶信息 User-Agent: Mozilla/5.0 (Linux; X11)
Connection 表示是否需要持久連接。(HTTP 1.1默認(rèn)進(jìn)行持久連接) Connection: close
Accept-Charset 通知服務(wù)端可以發(fā)送給瀏覽器的編碼格式 Accept-Charset: iso-8859-5
Accept-Encoding 通知服務(wù)端可以發(fā)送給瀏覽器的數(shù)據(jù)壓縮格式 Accept-Encoding: compress, gzip
Accept-Language 通知服務(wù)端可以發(fā)送給瀏覽器的語(yǔ)言 Accept-Language: en,zh
  • 空行:告訴服務(wù)器以下不會(huì)再有請(qǐng)求頭。
  • 請(qǐng)求數(shù)據(jù):請(qǐng)求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用。

2、傳輸層:TCP傳輸報(bào)文

傳輸層會(huì)發(fā)起一條到達(dá)服務(wù)器的TCP連接,為了方便傳輸,會(huì)對(duì)數(shù)據(jù)進(jìn)行分割,并標(biāo)記編號(hào),方便服務(wù)器接收時(shí)能夠準(zhǔn)確地還原報(bào)文信息。在建立連接前,會(huì)先進(jìn)行TCP三次握手。

3、網(wǎng)絡(luò)層:IP協(xié)議查詢Mac地址

將數(shù)據(jù)段打包,并加入源及目標(biāo)的IP地址,并且負(fù)責(zé)尋找傳輸路線。
判斷目標(biāo)地址是否與當(dāng)前地址處于同一網(wǎng)絡(luò)中,是的話直接根據(jù)Mac地址發(fā)送,否則使用路由表查找下一條地址,以及使用ARP協(xié)議查詢其Mac地址。

注意:在OSI參考模型中ARP協(xié)議位于鏈路層,但在TCP/IP中,它位于網(wǎng)絡(luò)層。

4、數(shù)據(jù)鏈路層:以太網(wǎng)協(xié)議

本層除了指明上層協(xié)議外,就是給出Mac地址,本層封裝稱(chēng)為數(shù)據(jù)幀。最后數(shù)據(jù)幀以電流的方式傳輸?shù)交ヂ?lián)網(wǎng),這些就是物理層要做的了。

此過(guò)程是一步一步封裝的過(guò)程,當(dāng)數(shù)據(jù)到達(dá)目的地之后,其操作與本端正好相反是一步一步解封裝。

三、請(qǐng)求方法

根據(jù)HTTP標(biāo)準(zhǔn),HTTP請(qǐng)求可以使用多種請(qǐng)求方法。
HTTP 1.0定義了三種請(qǐng)求方法:GET、POST、HEAD。
HTTP 1.1 新增了五種方法:PUT、DELETE、CONNECT、OPTIONS、TRACE。

方法 描述
GET 請(qǐng)求指定的頁(yè)面,并返回實(shí)體主體。
POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或上傳文件),數(shù)據(jù)被包含在請(qǐng)求主體中,POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立或已有資源的修改。
HEAD 類(lèi)似于GET請(qǐng)求,只不過(guò)返回的響應(yīng)中沒(méi)有具體的內(nèi)容,用戶獲取報(bào)頭。
PUT 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。
DELETE 請(qǐng)求服務(wù)器刪除指定的頁(yè)面
CONNECT HTTP1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS 允許客戶端查看服務(wù)器的性能。
TRACE 回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。
1、GET方法

GET方法要求服務(wù)器將URL定位的資源放在響應(yīng)報(bào)文的數(shù)據(jù)部分,回送給客戶端。使用GET方法時(shí),請(qǐng)求參數(shù)和對(duì)應(yīng)的值附加在URL后面,利用一個(gè)問(wèn)號(hào)(“?”)代表URL的結(jié)尾與請(qǐng)求參數(shù)的開(kāi)始,傳遞參數(shù)長(zhǎng)度受限制。例如,/index.jsp?id=100&op=bind,這樣通過(guò)GET方式傳遞的數(shù)據(jù)直接表示在地址中,所以我們可以把請(qǐng)求結(jié)果以鏈接的形式發(fā)送給好友。
注意:GET方法不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中,例如在Web Application中,其中一個(gè)原因是GET可能會(huì)被網(wǎng)絡(luò)蜘蛛等隨意訪問(wèn)。Loadrunner中對(duì)應(yīng)get請(qǐng)求函數(shù):web_link和web_url。

2、POST方法

向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。 使用POST方法可以允許客戶端給服務(wù)器提供信息較多。POST方法將請(qǐng)求參數(shù)封裝在HTTP請(qǐng)求數(shù)據(jù)中,以名稱(chēng)/值的形式出現(xiàn),可以傳輸大量數(shù)據(jù),這樣POST方式對(duì)傳送的數(shù)據(jù)大小沒(méi)有限制,而且也不會(huì)顯示在URL中。Loadrunner中對(duì)應(yīng)POST請(qǐng)求函數(shù):web_submit_data,web_submit_form。

3、HEAD方法

僅請(qǐng)求響應(yīng)的首部。HEAD就像GET,只不過(guò)服務(wù)端接受到HEAD請(qǐng)求后只返回響應(yīng)頭,而不會(huì)發(fā)送響應(yīng)內(nèi)容。當(dāng)我們只需要查看某個(gè)頁(yè)面的狀態(tài)的時(shí)候,使用HEAD是非常高效的,因?yàn)樵趥鬏數(shù)倪^(guò)程中省去了頁(yè)面內(nèi)容。

4、PUT方法

向指定資源位置上傳其最新內(nèi)容。

5、DELETE方法

請(qǐng)求服務(wù)器刪除Request-URL所標(biāo)識(shí)的資源。DELETE請(qǐng)求一般會(huì)返回3種狀態(tài)碼:

  • 200 (OK) - 刪除成功,同時(shí)返回已經(jīng)刪除的資源
  • 202 (Accepted) - 刪除請(qǐng)求已經(jīng)接受,但沒(méi)有被立即執(zhí)行(資源也許已經(jīng)被轉(zhuǎn)移到了待刪除區(qū)域)
  • 204 (No Content) - 刪除請(qǐng)求已經(jīng)被執(zhí)行,但是沒(méi)有返回資源(也許是請(qǐng)求刪除不存在的資源造成的)
6、CONNECT方法

HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。

7、OPTIONS方法

返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法,也可以利用向web服務(wù)器發(fā)送‘’的請(qǐng)求來(lái)測(cè)試服務(wù)器的功能性。
允許客戶端查看服務(wù)器的性能。(常見(jiàn)的是跨域預(yù)檢Preflighted Reqeusts方法會(huì)采用該方法)。一般來(lái)說(shuō),開(kāi)發(fā)中用到該方法是用來(lái)獲取服務(wù)器支持的請(qǐng)求類(lèi)型或者查看服務(wù)器類(lèi)型,來(lái)確保接下來(lái)發(fā)送的請(qǐng)求夠安全。該請(qǐng)求方法的響應(yīng)不能緩存。如果該URI(統(tǒng)一資源標(biāo)識(shí)符)是一個(gè)星號(hào)(“
”),OPTIONS請(qǐng)求將試圖應(yīng)用于服務(wù)器,而不是某個(gè)指定資源;如果該URI不是星號(hào),則只能用來(lái)獲取該資源通信中可用的選項(xiàng)。

8、TRACE方法

回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。

四、HTTP響應(yīng)信息

HTTP響應(yīng)報(bào)文由狀態(tài)行(status line)、響應(yīng)頭部(headers)、空行(blank line)和響應(yīng)數(shù)據(jù)(response body)4個(gè)部分組成。

  • 狀態(tài)行:狀態(tài)行由3部分組成:協(xié)議版本、狀態(tài)碼、狀態(tài)碼描述。其中協(xié)議版本和請(qǐng)求報(bào)文版本是一致的。如HTTP/1.1 200 OK。其中狀態(tài)碼詳見(jiàn)第五節(jié)。
  • 響應(yīng)頭部:也是由多個(gè)屬性組成,一堆鍵值對(duì)(關(guān)鍵字:值)。
header 解釋 示例
Allow 服務(wù)器應(yīng)用程序軟件的名稱(chēng)和版本 Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
Content-Type 響應(yīng)正文的MIME類(lèi)型(圖片或二進(jìn)制) Content-Type: text/html; charset=utf-8
Content-length 響應(yīng)正文長(zhǎng)度 Content-Length: 348
Last-Modified 請(qǐng)求資源的最后修改時(shí)間 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
Content-Encoding 響應(yīng)正文使用的數(shù)據(jù)壓縮格式 Content-Encoding: gzip
Content-Language 響應(yīng)正文使用的語(yǔ)言 Content-Language: en,zh
  • 空行:告訴客戶端以下不會(huì)再有響應(yīng)頭。
  • 響應(yīng)數(shù)據(jù):用于存放需要返回給客戶端的數(shù)據(jù)信息。

五、HTTP狀態(tài)碼

當(dāng)用戶訪問(wèn)一個(gè)網(wǎng)頁(yè)時(shí),用戶的瀏覽器會(huì)向網(wǎng)頁(yè)所在服務(wù)器發(fā)出請(qǐng)求。當(dāng)瀏覽器接收并顯示網(wǎng)頁(yè)前,此網(wǎng)頁(yè)所在的服務(wù)器會(huì)返回一個(gè)包含HTTP狀態(tài)碼的信息頭(server header)用以響應(yīng)瀏覽器的請(qǐng)求。
HTTP狀態(tài)碼的英文為HTTP Status Code。狀態(tài)代碼由三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類(lèi)別,且有五種可能取值。

  • 1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理。
  • 2xx:成功--表示請(qǐng)求已被成功接收、理解、接受。
  • 3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作。
  • 4xx:客戶端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)。
  • 5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求。
常見(jiàn)狀態(tài)碼如下表
狀態(tài)碼 狀態(tài)碼英文 中文描述
100 Continue 繼續(xù),客戶端繼續(xù)該請(qǐng)求。
101 Switching Protocols 切換協(xié)議,服務(wù)器根據(jù)客戶端的請(qǐng)求切換協(xié)議,只能切換到更高級(jí)的協(xié)議,例如,切換到HTTP的新版本協(xié)議。
200 OK 請(qǐng)求成功,一般用于GET與POST請(qǐng)求。
201 Created 已創(chuàng)建。成功請(qǐng)求并創(chuàng)建了新的資源。
202 Accepted 已接受。已經(jīng)接受請(qǐng)求,但未處理完成。
203 Non-Authoritative-Information 非授權(quán)信息。請(qǐng)求成功,但返回的meta信息不在原始的服務(wù)器,而是一個(gè)副本。
204 No Content 無(wú)內(nèi)容,服務(wù)器成功處理,但未返回內(nèi)容,在未更新網(wǎng)頁(yè)的情況下,可確保瀏覽器繼續(xù)顯示當(dāng)前文檔。
205 Reset Content 重置內(nèi)容,服務(wù)器處理成功,用戶終端(如瀏覽器)應(yīng)重置文檔視圖,可通過(guò)此返回碼清除瀏覽器的表單域。
206 Partial Content 部分內(nèi)容,客戶發(fā)送了一個(gè)帶有Range頭的GET請(qǐng)求,服務(wù)器完成了它。
300 Multiple Choices 多種選擇。請(qǐng)求的資源可包括多個(gè)位置,相應(yīng)可返回一個(gè)資源特征與地址的列表用于用戶終端(如瀏覽器) 選擇。最多允許5個(gè)地址。
301 Moved Permanently 永久重定向。請(qǐng)求的資源已被永久的移動(dòng)到新的URI,返回信息會(huì)包括新的URI,瀏覽器會(huì)自動(dòng)定向到新URI。今后任何新的請(qǐng)求都應(yīng)該使用新的URI代替。
302 Found 臨時(shí)重定向。與301類(lèi)似,但資源是臨時(shí)被移動(dòng),客戶端應(yīng)該繼續(xù)使用原有URI。
303 See Other 查看其他地址,所請(qǐng)求的頁(yè)面可以在別的UTI下被找到。與301類(lèi)似,使用GET和POST請(qǐng)求查看。
304 Not Modified 未修改資源,服務(wù)器返回此狀態(tài)碼時(shí),不會(huì)返回任何資源,客戶端通常會(huì)緩存訪問(wèn)過(guò)的資源,通過(guò)提供一個(gè)頭信息指出客戶端希望只返回在指定日期之后修改的資源。
305 Use Proxy 使用代理。所請(qǐng)求的資源必須通過(guò)代理訪問(wèn)。
306 Unused 已經(jīng)被廢棄的HTTP狀態(tài)碼。
307 Temporary Redirect 臨時(shí)重定向,與302類(lèi)似,使用GET請(qǐng)求重定向。hsts跳轉(zhuǎn),要求瀏覽器下次訪問(wèn)該站點(diǎn)時(shí)使用https來(lái)訪問(wèn),而不再需要先是http再轉(zhuǎn)https。這樣可以避免ssl剝離攻擊。
400 Bad Request 客戶端請(qǐng)求的語(yǔ)法錯(cuò)誤,服務(wù)器無(wú)法理解。
401 Unauthorized 未授權(quán)。請(qǐng)求要求用戶的身份認(rèn)證。
402 Payment Required 保留,將來(lái)使用。
403 Forbidden 服務(wù)器理解請(qǐng)求客戶端的請(qǐng)求,但是拒絕執(zhí)行該請(qǐng)求。
404 Not Found 頁(yè)面不存在。服務(wù)器無(wú)法根據(jù)客戶端的請(qǐng)求找到資源,通過(guò)此代碼,開(kāi)發(fā)人員可設(shè)置"您所請(qǐng)求的資源無(wú)法找的"的個(gè)性頁(yè)面。
405 Method Not Allowed 客戶端請(qǐng)求中的方法被禁止。
406 Not Acceptable 服務(wù)器生成的響應(yīng)無(wú)法被客戶端所接受。
407 Proxy Authentication Required 請(qǐng)求要求代理的身份認(rèn)證,與401類(lèi)似,但請(qǐng)求者應(yīng)當(dāng)使用代理進(jìn)行授權(quán)。
408 Request Time-out 服務(wù)器等待客戶端發(fā)送的請(qǐng)求時(shí)間過(guò)長(zhǎng),超時(shí)。
409 Conflict 服務(wù)器完成客戶端的PUT請(qǐng)求時(shí)可能返回此代碼,服務(wù)器處理請(qǐng)求時(shí)發(fā)生了沖突。
410 Gone 客戶端請(qǐng)求的資源已經(jīng)不存在,410不同于404,如果資源以前有現(xiàn)在被永久刪除了可使用410代碼,開(kāi)發(fā)人員可通過(guò)301代碼指定資源的新位置。
411 Length Required 服務(wù)器無(wú)法處理客戶端發(fā)送的不帶Content-length的請(qǐng)求信息。
412 Precondition Failed 客戶端請(qǐng)求信息的先決條件錯(cuò)誤。
413 Request Entity Too Large 由于請(qǐng)求的實(shí)體過(guò)大,服務(wù)器無(wú)法處理,因此拒絕請(qǐng)求,為防止客戶端的連續(xù)請(qǐng)求,服務(wù)器可能會(huì)關(guān)閉連接,如果只是服務(wù)器暫時(shí)無(wú)法處理,則會(huì)包含一個(gè)Retry-After的響應(yīng)信息。
414 Request-URI Too Large 請(qǐng)求的URI過(guò)長(zhǎng),URI通常為網(wǎng)址,服務(wù)器無(wú)法處理。
415 Unsupported Media Type 服務(wù)器無(wú)法處理請(qǐng)求附帶的媒體格式。
416 Requested range not satisflable 服務(wù)器不能滿足客戶在請(qǐng)求中指定的Range頭。
417 Expectation Failed 服務(wù)器無(wú)法滿足Expect的請(qǐng)求頭信息。
500 Internal Server Error 服務(wù)器內(nèi)部錯(cuò)誤。無(wú)法完成請(qǐng)求。
501 Not Implemented 服務(wù)器不支持請(qǐng)求的功能,無(wú)法完成請(qǐng)求。
502 Bad Gateway 充當(dāng)網(wǎng)關(guān)或代理的服務(wù)器,從遠(yuǎn)端服務(wù)器接收到了一個(gè)無(wú)效的請(qǐng)求。
503 Service Unavallable 由于超載或系統(tǒng)維護(hù),服務(wù)器暫時(shí)無(wú)法處理客戶端的請(qǐng)求,延時(shí)的長(zhǎng)度可包含在服務(wù)器的Retry-After頭信息中。
504 Gateway Time-out 充當(dāng)網(wǎng)關(guān)或代理的服務(wù)器,未及時(shí)從遠(yuǎn)端服務(wù)器獲取請(qǐng)求。
505 HTTP Version not supported 服務(wù)器不支持請(qǐng)求的HTTP協(xié)議的版本,無(wú)法完成處理。

六、HTTP請(qǐng)求GET和POST的區(qū)別

1、GET提交:請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后,并且請(qǐng)求一次。
以?分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)用&連接。如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送;如果是空格,轉(zhuǎn)換為+;如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號(hào)以16進(jìn)制表示的ASCII。
POST提交:把提交的數(shù)據(jù)放在request body 中,請(qǐng)求兩次。
2、GET請(qǐng)求只能進(jìn)行URL編碼,而POST支持多種編碼方式。
3、GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里,而POST參數(shù)不會(huì)保留。
4、GET請(qǐng)求的參數(shù)長(zhǎng)度有限,而POST沒(méi)有。
5、GET請(qǐng)求參數(shù)的數(shù)據(jù)類(lèi)型是ASCII字符,而POST沒(méi)有限制。
6、GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上,所以不能用來(lái)傳遞敏感信息。
7、GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì),除非手動(dòng)設(shè)置。
8、GET在瀏覽器回退時(shí)是無(wú)害的,而POST會(huì)再次提交請(qǐng)求。
9、GET產(chǎn)生的URL地址可以被記錄書(shū)簽(Bookmark),而POST不可以。
10、GET提交的數(shù)據(jù)最大是2K,這個(gè)限制實(shí)際上取決于瀏覽器,(大多數(shù))瀏覽器通常都會(huì)限制url長(zhǎng)度在2K個(gè)字節(jié),即使(大多數(shù))服務(wù)器最多處理64K大小的url。也沒(méi)有卵用。post理論上沒(méi)有限制。實(shí)際上IIS4中最大量為80KB,IIS5中為100KB。
11、GET和POST本質(zhì)上都是TCP連接。GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。
對(duì)于GET來(lái)說(shuō),瀏覽器會(huì)把HTTP header 和 data 一起打包發(fā)出去,服務(wù)器響應(yīng)返回200。
對(duì)于POST來(lái)說(shuō),瀏覽器會(huì)先發(fā)送header,服務(wù)器響應(yīng)返回100(continue),瀏覽器再發(fā)送data,服務(wù)器響應(yīng)返回200。
據(jù)研究,在網(wǎng)絡(luò)環(huán)境好的情況下,發(fā)一次包的時(shí)間和發(fā)兩次包的時(shí)間差別基本可以無(wú)視。而在網(wǎng)絡(luò)環(huán)境差的情況下,兩次包的TCP在驗(yàn)證數(shù)據(jù)包完整性上,有非常大的優(yōu)點(diǎn)。并不是所有瀏覽器都會(huì)在POST中發(fā)送兩次包,F(xiàn)irefox就只發(fā)送一次。

七、HTTP和HTTPS的區(qū)別

HTTP(Hyper Text Transfer Protocol,超文本傳輸協(xié)議)被用于在web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息,HTTP協(xié)議以明文的方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,如果攻擊者截取了web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息,因此,HTTP協(xié)議不適合傳輸一些敏感信息,比如:信用卡號(hào),密碼等支付信息。

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer,安全套接字超文本傳輸協(xié)議),為了數(shù)據(jù)傳輸?shù)陌踩?,HTTPS在HTTP的基礎(chǔ)上加入了SSL/TLS,依靠證書(shū)來(lái)驗(yàn)證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密。其中SSL(Secure Socket Layer,安全套接層)加密傳輸協(xié)議,TLS(Transport Layer Securit,傳輸層安全協(xié)議),SSL 3.0和TLS 1.0差別很小,在HTTPS通信中具體使用哪一個(gè)還要看客戶端和服務(wù)端的支持程度,二者在網(wǎng)絡(luò)模型中位于哪一層?
HTTP協(xié)議和HTTPS協(xié)議位于應(yīng)用層。TCP協(xié)議和UDP協(xié)議位于傳輸層。IP協(xié)議位于網(wǎng)絡(luò)層。


model.png
- 區(qū)別

① HTTPS協(xié)議需要到CA申請(qǐng)證書(shū),一般免費(fèi)證書(shū)比較少,所以需要一定費(fèi)用。
② HTTP是超文本傳輸協(xié)議,信息是明文傳輸,HTTPS則是具有安全性的SSL加密傳輸協(xié)議。
③ HTTP和HTTPS使用的是完全不同的連接方式,使用的端口號(hào)也不一樣,前者是80,后者是443。
④ HTTP連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由HTTP+SSL協(xié)議構(gòu)建的可進(jìn)行加密傳輸,身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比較安全。
⑤ 谷歌搜索引擎算法中,比起同等HTTP網(wǎng)站,采用HTTPS加密的網(wǎng)站在搜索結(jié)果中排名會(huì)更高。

- 客戶端使用HTTPS方式與web服務(wù)器通信的步驟
  1. 客戶使用HTTPS的URL訪問(wèn)web服務(wù)器,要求與web服務(wù)器建立SSL連接;
  2. web服務(wù)器收到客戶端請(qǐng)求后,將網(wǎng)站的證書(shū)信息(證書(shū)中包含公鑰)傳送一份給客戶端,這個(gè)證書(shū)其實(shí)是一套公鑰和私鑰,這里把公鑰給了客戶端,相當(dāng)于鎖頭,私鑰(唯一)服務(wù)器保留,相當(dāng)于鑰匙。
  3. 客戶端的瀏覽器與Web服務(wù)器開(kāi)始協(xié)商SSL連接的安全等級(jí),也就是信息的加密等級(jí)。
  4. 客戶端解析證書(shū):這部分工作由客戶端的TLS(Transport Layer Securit,傳輸層安全協(xié)議)來(lái)完成。首先驗(yàn)證公鑰是否有效,比如頒發(fā)機(jī)構(gòu)、過(guò)期時(shí)間等,如果發(fā)現(xiàn)異常,則會(huì)彈出一個(gè)警告框,提示證書(shū)存在問(wèn)題。如果證書(shū)沒(méi)有問(wèn)題,那么會(huì)生成一個(gè)隨機(jī)值,然后用證書(shū)對(duì)這個(gè)隨機(jī)值加密,把隨機(jī)值用鎖頭鎖起來(lái),這樣除非有鑰匙,否則看不到被鎖住的內(nèi)容。
  5. 傳送加密信息:這部分傳送的是用證書(shū)加密后的隨機(jī)值,目的就是讓服務(wù)器得到這個(gè)隨機(jī)值,以后客戶端和服務(wù)端之間的通信就可以通過(guò)這個(gè)隨機(jī)值來(lái)進(jìn)行加密解密了。
  6. 服務(wù)端解密信息:服務(wù)端用私鑰解密后,得到了客戶端傳過(guò)來(lái)的隨機(jī)值(私鑰),然后把內(nèi)容通過(guò)該值進(jìn)行非對(duì)稱(chēng)加密,所謂非對(duì)稱(chēng)加密,就是將信息和私鑰通過(guò)某種算法混合在一起,這樣除非知道私鑰,否則無(wú)法獲取內(nèi)容,而恰好客戶端和服務(wù)端都知道這個(gè)私鑰,所以只要加密算法夠彪悍,私鑰夠復(fù)雜,數(shù)據(jù)就夠安全。對(duì)稱(chēng)加密就是使用同樣的算法和密鑰對(duì)密文進(jìn)行解密,加密-解密過(guò)程完全對(duì)稱(chēng)。
  7. 傳輸加密后的信息:這部分信息是服務(wù)端用私鑰加密后的信息,可以再客戶端被還原。
  8. 客戶端解密信息:客戶端用之前生成的私鑰解密服務(wù)端傳過(guò)來(lái)的信息,于是獲取了解密后的內(nèi)容,整個(gè)過(guò)程第三方即使監(jiān)聽(tīng)到了數(shù)據(jù),也束手無(wú)策。


    https.png
- 如何從HTTP切換到HTTPS?

1、 需要將頁(yè)面中所有的鏈接例如js、css、圖片等鏈接都由http改為https
2、一般情況下會(huì)建議保留http,所以在切換的時(shí)候可以做http和https的兼容,具體方式是:去掉頁(yè)面連接中的http頭部,這樣可以自動(dòng)匹配http頭和https頭。

八、關(guān)于HTTP2.0

1、簡(jiǎn)介

簡(jiǎn)單來(lái)說(shuō),HTTP/2 超文本傳輸協(xié)議第2版,是HTTP協(xié)議自1999年HTTP 1.1發(fā)布后的首個(gè)更新,主要基于SPDY協(xié)議。HTTP 2.0的特點(diǎn)是:在不改動(dòng)HTTP語(yǔ)義、方法、狀態(tài)碼、URI及首部字段的情況下,大幅度提高了web性能。

2、什么是SPDY協(xié)議

SPDY是Speedy 的呢音,意為“更快”。它是2012年google開(kāi)發(fā)的基于TCP協(xié)議的應(yīng)用層協(xié)議。目標(biāo)是優(yōu)化HTTP協(xié)議的性能,通過(guò)壓縮、多路復(fù)用、優(yōu)先級(jí)等技術(shù),縮短網(wǎng)頁(yè)的加載時(shí)間并提高安全性,SPDY協(xié)議的核心思想是盡量減少TCP連接數(shù),它是對(duì)HTTP協(xié)議的一種增強(qiáng)。
SPDY位于HTTP之下,TCP和SSL之上,這樣可以輕松兼容老版本的HTTP協(xié)議,同時(shí)可以使用已有的SSL功能。

3、HTTP1.x 的缺點(diǎn)

任何事物的更新都是為了彌補(bǔ)或修復(fù)上個(gè)版本的某些問(wèn)題,我們來(lái)看看HTTP 1.x有哪些問(wèn)題:
① HTTP/1.0 一次只允許在一個(gè)TCP連接上發(fā)起一個(gè)請(qǐng)求,HTTP/1.1 使用的流水線技術(shù)也只能部分處理請(qǐng)求并發(fā),仍然會(huì)存在隊(duì)列頭阻塞問(wèn)題,因此客戶端在需要發(fā)起多次請(qǐng)求時(shí),通常會(huì)采用建立多連接來(lái)減少延遲。
② 單向請(qǐng)求,只能由客戶端發(fā)起。
③ 請(qǐng)求報(bào)文和響應(yīng)報(bào)文首部信息冗余量大。
④ 數(shù)據(jù)未壓縮,導(dǎo)致數(shù)據(jù)的傳輸量大。

4、HTTP 2.0特點(diǎn)
a. 二進(jìn)制傳輸

HTTP 2.0中所有加強(qiáng)性能的核心是二進(jìn)制傳輸,在HTTP 1.x中,我們是通過(guò)文本的方式傳輸數(shù)據(jù),基于文本的方式傳輸數(shù)據(jù)存在很多缺陷,文本的表現(xiàn)形式有多樣性,因此要做到健壯性考慮的場(chǎng)景必然有很多,但是二進(jìn)制則不同,只有0和1的組合,因此選擇了二進(jìn)制傳輸,實(shí)現(xiàn)方便且健壯。
在HTTP 2.0 中引入了新的編碼機(jī)制,所有傳輸?shù)臄?shù)據(jù)都會(huì)被分割,并采用二進(jìn)制格式編碼。


http2.png

為了保證HTTP不受影響,那就需要在應(yīng)用層(HTTP 2.0)和傳輸層(TCP或UDP)之間增加一個(gè)二進(jìn)制分幀層,在二進(jìn)制分幀層上,HTTP 2.0會(huì)將所有傳輸?shù)男畔⒎譃楦〉男畔⒑蛶?,并采用二進(jìn)制格式編碼,其中HTTP 1.x的首部信息會(huì)被封裝在Headers 幀,而Request Body 則封裝在 Data 幀。

b. 多路復(fù)用

在HTTP 1.0 中,我們經(jīng)常會(huì)使用到雪碧圖、使用多個(gè)域名等方式來(lái)優(yōu)化,都是因?yàn)闉g覽器限制了同一個(gè)域名下的請(qǐng)求數(shù)量,當(dāng)頁(yè)面需要請(qǐng)求很多資源時(shí),隊(duì)頭阻塞會(huì)導(dǎo)致在達(dá)到最大請(qǐng)求時(shí),資源需要等待其他資源請(qǐng)求完成后才能繼續(xù)發(fā)送。
而在HTTP 2.0中,有兩個(gè)概念很重要:幀(frame)和流(stream)
幀是最小的數(shù)據(jù)單位,每個(gè)幀會(huì)標(biāo)識(shí)出該幀屬于哪個(gè)流,流是多個(gè)幀組成的數(shù)據(jù)流。
所謂多路復(fù)用,就是在一個(gè)TCP連接中存在多個(gè)流,即可以同時(shí)發(fā)送多個(gè)請(qǐng)求,對(duì)端可以通過(guò)幀中的標(biāo)識(shí)知道該幀屬于哪個(gè)請(qǐng)求。在客戶端,這些幀亂序發(fā)送,到達(dá)對(duì)端后再根據(jù)每個(gè)幀首部的流標(biāo)識(shí)符重新組裝。通過(guò)該技術(shù),可以避免HTTP舊版本的隊(duì)頭阻塞問(wèn)題,極大提高傳輸性。


connect.png
c. Header 壓縮

在HTTP 1.0中,我們使用文本的形式傳輸header,在header中攜帶cookie的話,每次都需要重復(fù)傳輸幾百到幾千的字節(jié),這著實(shí)是一筆不小的開(kāi)銷(xiāo)。
在HTTP 2.0 中,我們使用了HPACK(HTTP2 頭部壓縮算法)壓縮格式對(duì)傳輸?shù)膆eader進(jìn)行編碼,減少了header的大小,并在兩端維護(hù)了索引表,用于記錄出現(xiàn)過(guò)的header,后面在傳輸過(guò)程中就可以傳輸已經(jīng)記錄過(guò)的header的鍵名,對(duì)端收到數(shù)據(jù)后就可以通過(guò)鍵名找到對(duì)應(yīng)的值。
注:SPDY 采用的 DEFLATE頭部壓縮算法。

d. 服務(wù)器Push

在HTTP 2.0 中,服務(wù)端可以在客戶端某個(gè)請(qǐng)求后,主動(dòng)推送其他資源。試想,某些資源客戶端是一定會(huì)請(qǐng)求的,這時(shí)就可以采取服務(wù)器Push的技術(shù),提前給客戶端推送它必要的資源,就可以相對(duì)減少一點(diǎn)延遲時(shí)間,在瀏覽器兼容的情況下也可以使用prefetch。

e. 更安全

HTTP 2.0 使用了TLS的拓展ALPN作為協(xié)議升級(jí),除此之外,HTTP 2.0 對(duì)TLS的安全性做了進(jìn)一步加強(qiáng),通過(guò)黑名單機(jī)制禁用了幾百種不再安全的加密算法。
注:HTTP2.0 支持明文 HTTP 傳輸,而 SPDY 強(qiáng)制使用 HTTPS。

f. 請(qǐng)求優(yōu)先級(jí)(Request prioritization)

多路復(fù)用帶來(lái)一個(gè)問(wèn)題,在連接共享的基礎(chǔ)上有可能會(huì)導(dǎo)致關(guān)鍵請(qǐng)求被阻塞,SPDY允許給每個(gè)request設(shè)置優(yōu)先級(jí),這樣重要的請(qǐng)求就會(huì)優(yōu)先得到響應(yīng)。比如瀏覽器加載首頁(yè),首頁(yè)的HTML內(nèi)容應(yīng)該優(yōu)先展示,之后才是各種靜態(tài)資源文件,腳本文件等加載,這樣能保證用戶能第一時(shí)間看到網(wǎng)頁(yè)內(nèi)容。

注:HTTP請(qǐng)求頭和響應(yīng)頭參考對(duì)照表傳送門(mén)→_→http://tools.jb51.net/table/http_header

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

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

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