瀏覽器工作原理(HTTP)

HTTP 協(xié)議簡(jiǎn)介

瀏覽器工作的第一步是通過(guò)HTTP請(qǐng)求,根據(jù)URL 訪問(wèn)服務(wù)器獲取數(shù)據(jù)(建立http請(qǐng)求之前還需要 DNS 查詢(xún))。

HTTP是一種應(yīng)用層的協(xié)議,是一個(gè)純文本的協(xié)議,規(guī)定了必須是基于 TCP 協(xié)議(傳輸層)的,TCP 協(xié)議是一條雙向的通訊通道,HTTP 在 TCP 的基礎(chǔ)上,規(guī)定了 Request-Response 的模式。這個(gè)模式?jīng)Q定了通訊必定是由瀏覽器端首先發(fā)起的。

HTTP是一種無(wú)狀態(tài)的協(xié)議,無(wú)狀態(tài)是指Web瀏覽器和Web服務(wù)器之間不需要建立持久的連接,這意味著當(dāng)一個(gè)客戶(hù)端向服務(wù)器端發(fā)出請(qǐng)求,然后Web服務(wù)器返回響應(yīng)(response),連接就被關(guān)閉了,在服務(wù)器端不保留連接的有關(guān)信息。



HTTP請(qǐng)求過(guò)程

HTTP通信機(jī)制是在一次完整的HTTP通信過(guò)程中,Web瀏覽器與Web服務(wù)器之間將完成下列7個(gè)步驟:

(1)建立TCP連接

在HTTP工作開(kāi)始之前,Web瀏覽器首先要通過(guò)網(wǎng)絡(luò)與Web服務(wù)器建立連接,該連接是通過(guò)TCP來(lái)完成的,該協(xié)議與IP協(xié)議共同構(gòu)建Internet,即著名的TCP/IP協(xié)議族,因此Internet又被稱(chēng)作是TCP/IP網(wǎng)絡(luò)。HTTP是比TCP更高層次的應(yīng)用層協(xié)議,根據(jù)規(guī)則,只有低層協(xié)議建立之后才能,才能進(jìn)行更層協(xié)議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號(hào)是80

(2)Web瀏覽器向Web服務(wù)器發(fā)送請(qǐng)求命令

一旦建立了TCP連接,Web瀏覽器就會(huì)向Web服務(wù)器發(fā)送請(qǐng)求命令

例如:GET/sample/hello.jsp HTTP/1.1

(3)Web瀏覽器發(fā)送請(qǐng)求頭信息

瀏覽器發(fā)送其請(qǐng)求命令之后,還要以頭信息的形式向Web服務(wù)器發(fā)送一些別的信息,之后瀏覽器發(fā)送了一空白行來(lái)通知服務(wù)器,它已經(jīng)結(jié)束了該頭信息的發(fā)送。

(4)Web服務(wù)器應(yīng)答

客戶(hù)機(jī)向服務(wù)器發(fā)出請(qǐng)求后,服務(wù)器會(huì)客戶(hù)機(jī)回送應(yīng)答,

HTTP/1.1 200 OK

應(yīng)答的第一部分是協(xié)議的版本號(hào)和應(yīng)答狀態(tài)碼

(5)Web服務(wù)器發(fā)送應(yīng)答頭信息

正如客戶(hù)端會(huì)隨同請(qǐng)求發(fā)送關(guān)于自身的信息一樣,服務(wù)器也會(huì)隨同應(yīng)答向用戶(hù)發(fā)送關(guān)于它自己的數(shù)據(jù)及被請(qǐng)求的文檔。

(6)Web服務(wù)器向?yàn)g覽器發(fā)送數(shù)據(jù)

Web服務(wù)器向?yàn)g覽器發(fā)送頭信息后,它會(huì)發(fā)送一個(gè)空白行來(lái)表示頭信息的發(fā)送到此為結(jié)束,接著,它就以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶(hù)所請(qǐng)求的實(shí)際數(shù)據(jù)

(7)Web服務(wù)器關(guān)閉TCP連接

一般情況下,一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請(qǐng)求數(shù)據(jù),它就要關(guān)閉TCP連接,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼

Connection:keep-alive

TCP連接在發(fā)送后將仍然保持打開(kāi)狀態(tài),于是,瀏覽器可以繼續(xù)通過(guò)相同的連接發(fā)送請(qǐng)求。保持連接節(jié)省了為每個(gè)請(qǐng)求建立新連接所需的時(shí)間,還節(jié)約了網(wǎng)絡(luò)帶寬。



HTTP 協(xié)議格式

圖片發(fā)自簡(jiǎn)書(shū)App

一,HTTP請(qǐng)求

下面是一個(gè)HTTP請(qǐng)求的例子:

GET /sample.jsp HTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate? ? ? ? ? ? ? ? ? ? ? ? ?
username=jinqiao&password=1234

1.request line

第一行被稱(chēng)作 request line,它分為三個(gè)部分,請(qǐng)求的“方法”、請(qǐng)求的路徑、請(qǐng)求的協(xié)議和版本。

request line 里面的方法跟我們編程中的方法意義類(lèi)似,表示我們此次 HTTP 請(qǐng)求希望執(zhí)行的操作類(lèi)型。方法有以下幾種定義:

GET,POST,HEAD,PUT,DELETE,CONNECT,OPTIONS,TRACE

瀏覽器通過(guò)地址欄訪問(wèn)頁(yè)面都是 GET 方法。表單提交產(chǎn)生 POST 方法。

HEAD 則是跟 GET 類(lèi)似,只返回請(qǐng)求頭,多數(shù)由 JavaScript 發(fā)起

PUT 和 DELETE 分別表示添加資源和刪除資源,但是實(shí)際上這只是語(yǔ)義上的一種約定,并沒(méi)有強(qiáng)約束。

CONNECT 現(xiàn)在多用于 HTTPS 和 WebSocket。

OPTIONS 和 TRACE 一般用于調(diào)試,多數(shù)線(xiàn)上服務(wù)都不支持。

GET方法 VS POST方法

GET方法是默認(rèn)的HTTP請(qǐng)求方法,我們?nèi)粘S肎ET方法來(lái)提交表單數(shù)據(jù),然而用GET方法提交的表單數(shù)據(jù)只經(jīng)過(guò)了簡(jiǎn)單的編碼,同時(shí)它將作為URL的一部分向Web服務(wù)器發(fā)送,因此,如果使用GET方法來(lái)提交表單數(shù)據(jù)就存在著安全隱患上。例如

Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB

從上面的URL請(qǐng)求中,很容易就可以辯認(rèn)出表單提交的內(nèi)容。(?之后的內(nèi)容)另外由于GET方法提交的數(shù)據(jù)是作為URL請(qǐng)求的一部分,所以提交的數(shù)據(jù)量不能太大。

POST方法是GET方法的一個(gè)替代方法,它主要是向Web服務(wù)器提交表單數(shù)據(jù),尤其是大批量的數(shù)據(jù)。POST方法克服了GET方法的一些缺點(diǎn)。通過(guò)POST方法提交表單數(shù)據(jù)時(shí),數(shù)據(jù)不是作為URL請(qǐng)求的一部分而是作為標(biāo)準(zhǔn)數(shù)據(jù)傳送給Web服務(wù)器,這就克服了GET方法中的信息無(wú)法保密和數(shù)據(jù)量太小的缺點(diǎn)。因此,出于安全的考慮以及對(duì)用戶(hù)隱私的尊重,通常表單提交時(shí)采用POST方法。

2.Request Header (HTTP 頭)

request line后面是請(qǐng)求頭。由若干行組成,每行是用冒號(hào)分隔的名稱(chēng)和值。是鍵值對(duì)的格式。

圖片發(fā)自簡(jiǎn)書(shū)App

3.HTTP Request Body(正文)

請(qǐng)求頭和請(qǐng)求正文之間是一個(gè)空行,這個(gè)行非常重要,它表示請(qǐng)求頭已經(jīng)結(jié)束。

接下來(lái)的是請(qǐng)求正文。請(qǐng)求正文中可以包含客戶(hù)提交的查詢(xún)字符串,文件或者表單數(shù)據(jù)。

一些常見(jiàn)的 body 格式是:

application/json

application/x-www-form-urlencoded

multipart/form-data

text/xml

我們使用 html 的 form 標(biāo)簽提交產(chǎn)生的 html 請(qǐng)求,默認(rèn)會(huì)產(chǎn)生 application/x-www-form-urlencoded 的數(shù)據(jù)格式,當(dāng)有文件上傳時(shí),則會(huì)使用 multipart/form-data。


二,HTTP響應(yīng)

HTTP響應(yīng)與HTTP請(qǐng)求相似,HTTP響應(yīng)也由3個(gè)部分構(gòu)成。

下面是一個(gè)HTTP響應(yīng)的例子:

HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112


<html>
<head>
<title>HTTP響應(yīng)示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>


1.response line

第一行被稱(chēng)作 response line,它也分為三個(gè)部分,協(xié)議和版本、狀態(tài)碼和狀態(tài)文本。

常見(jiàn)的狀態(tài)碼有以下幾種。

1xx:臨時(shí)回應(yīng),表示客戶(hù)端請(qǐng)繼續(xù)。

2xx:請(qǐng)求成功。

200:請(qǐng)求成功。


3xx: 表示請(qǐng)求的目標(biāo)有變化,希望客戶(hù)端進(jìn)一步處理。

301&302:永久性與臨時(shí)性跳轉(zhuǎn)。

304:跟客戶(hù)端緩存沒(méi)有更新。


4xx:客戶(hù)端請(qǐng)求錯(cuò)誤。

403:無(wú)權(quán)限。

404:表示請(qǐng)求的頁(yè)面不存在。


5xx:服務(wù)端請(qǐng)求錯(cuò)誤。

500:服務(wù)端錯(cuò)誤。

503:服務(wù)端暫時(shí)性錯(cuò)誤,可以一會(huì)再試。


2.Response Header

緊隨在 response line 之后,是響應(yīng)頭,每行是用冒號(hào)分隔的名稱(chēng)和值。

圖片發(fā)自簡(jiǎn)書(shū)App

3.HTTP Response Body

在頭之后,以一個(gè)空行為分隔,是 /響應(yīng)體,內(nèi)容是 html 代碼。



HTTPS

在 HTTP 協(xié)議的基礎(chǔ)上,HTTPS 和 HTTP2 規(guī)定了更復(fù)雜的內(nèi)容,但是它基本保持了 HTTP 的設(shè)計(jì)思想,即:使用上的 Request-Response 模式。

HTTPS 有兩個(gè)作用,一是確定請(qǐng)求的目標(biāo)服務(wù)端身份,二是保證傳輸?shù)臄?shù)據(jù)不會(huì)被網(wǎng)絡(luò)中間節(jié)點(diǎn)竊聽(tīng)或者篡改。

HTTPS 是使用加密通道來(lái)傳輸 HTTP 的內(nèi)容。但是 HTTPS 首先與服務(wù)端建立一條 TLS 加密通道。TLS 構(gòu)建于 TCP 協(xié)議之上,它實(shí)際上是對(duì)傳輸?shù)膬?nèi)容做一次加密,所以從傳輸內(nèi)容上看,HTTPS 跟 HTTP 沒(méi)有任何區(qū)別。



HTTP 2

HTTP 2 是 HTTP 1.1 的升級(jí)版本。

HTTP 2.0 最大的改進(jìn)有兩點(diǎn),一是支持服務(wù)端推送,二是支持 TCP 連接復(fù)用。

服務(wù)端推送能夠在客戶(hù)端發(fā)送第一個(gè)請(qǐng)求到服務(wù)端時(shí),提前把一部分內(nèi)容推送給客戶(hù)端,放入緩存當(dāng)中,這可以避免客戶(hù)端請(qǐng)求順序帶來(lái)的并行度不高,從而導(dǎo)致的性能問(wèn)題。

TCP 連接復(fù)用,則使用同一個(gè) TCP 連接來(lái)傳輸多個(gè) HTTP 請(qǐng)求,避免了 TCP 連接建立時(shí)的三次握手開(kāi)銷(xiāo),和初建 TCP 連接時(shí)傳輸窗口小的問(wèn)題。

最后編輯于
?著作權(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)容