HTTP請(qǐng)求的整個(gè)過(guò)程
1. HTTP簡(jiǎn)介
HTTPweb瀏覽器和服務(wù)器之類(lèi)的交互過(guò)程必須遵守的協(xié)議.他是tcp/ip中的一個(gè)應(yīng)用協(xié)議。用來(lái)協(xié)議數(shù)據(jù)交換過(guò)程和數(shù)據(jù)本身的格式,主要的有HTTP/1.0和HTTP1.1.
HTTP/1.0和HTTP/1.1都把TCP作為底層的傳輸協(xié)議。
HTTP客戶首先發(fā)起建立與服務(wù)器TCP連接。一旦建立連接,瀏覽器進(jìn)程和服務(wù)器進(jìn)程就可以通過(guò)各自的套接字來(lái)訪問(wèn)TCP。如前所述,客戶端套接字是客戶進(jìn)程和TCP連接之間的“門(mén)”,服務(wù)器端套接字是服務(wù)器進(jìn)程和同一TCP連接之間的 “門(mén)”。客戶往自己的套接字發(fā)送HTTP請(qǐng)求消息,也從自己的套接字接收HTTP響應(yīng)消息。類(lèi)似地,服務(wù)器從自己的套接字接收HTTP請(qǐng)求消息,也往自己 的套接字發(fā)送HTTP響應(yīng)消息。客戶或服務(wù)器一旦把某個(gè)消息送入各自的套接字,這個(gè)消息就完全落入TCP的控制之中。
TCP給HTTP提供一個(gè)可靠的數(shù)據(jù)傳輸服務(wù);這意味著由客戶發(fā)出的每個(gè)HTTP請(qǐng)求消息最終將無(wú)損地到達(dá)服務(wù)器,由服務(wù)器發(fā)出的每個(gè)HTTP響應(yīng)消息最終也將無(wú)損地到達(dá)客戶。我們可從中看到分層網(wǎng)絡(luò)體系結(jié)構(gòu)的一個(gè)明顯優(yōu)勢(shì)——HTTP不必?fù)?dān)心數(shù)據(jù)會(huì)丟失,也無(wú)需關(guān)心TCP如何從數(shù)據(jù)的丟失和錯(cuò)序中恢復(fù)出來(lái)的細(xì)節(jié)。這些是TCP和協(xié)議棧中更低協(xié)議層的任務(wù)。
TCP還使用一個(gè)擁塞控制機(jī)制。該機(jī)制迫使每個(gè)新的TCP連接一開(kāi)始以相對(duì)緩慢的速率傳輸數(shù)據(jù),然而只要網(wǎng)絡(luò)不擁塞,每個(gè)連接可以迅速上升到相對(duì)較高的速率。這個(gè)慢速傳輸?shù)某跏茧A段稱(chēng)為緩啟動(dòng)(slow start)。
需要注意的是,在向客戶發(fā)送所請(qǐng)求文件的同時(shí),服務(wù)器并沒(méi)有存儲(chǔ)關(guān)于該客戶的任何狀態(tài)信息。即便某個(gè)客戶在幾秒鐘內(nèi)再次請(qǐng)求同一個(gè)對(duì)象,服務(wù)器也不會(huì)響應(yīng)說(shuō):自己剛剛給它發(fā)送了這個(gè)對(duì)象。相反,服務(wù)器重新發(fā)送這個(gè)對(duì)象,因?yàn)樗呀?jīng)徹底忘記早先做過(guò)什么。既然HTTP服務(wù)器不維護(hù)客戶的狀態(tài)信息,我們于是 說(shuō)HTTP是一個(gè)無(wú)狀態(tài)的協(xié)議(stateless protocol)。
2. 一個(gè)完整的HTTP請(qǐng)求過(guò)程
HTTP事務(wù)=請(qǐng)求命令+響應(yīng)結(jié)果
一次完整的請(qǐng)求過(guò)程:
(1)域名解析
(2)建立TCP連接,三次握手
(3)Web瀏覽器向Web服務(wù)端發(fā)送HTTP請(qǐng)求報(bào)文
(4)服務(wù)器響應(yīng)HTTP請(qǐng)求
(5)瀏覽器解析HTML代碼,并請(qǐng)求HTML代碼中的資源(JS,CSS,圖片)(這是自動(dòng)向服務(wù)器請(qǐng)求下載的)
(6)瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給客戶
(7)斷開(kāi)TCP連接