{eval=Array;=+count(Array);}
謝邀~
我們打開(kāi)瀏覽器,在地址欄輸入www.wukong.com,幾秒后瀏覽器打開(kāi)悟空問(wèn)答的頁(yè)面,那么這幾秒鐘內(nèi)發(fā)生了哪些事情,我就帶大家一起看看完整的流程:
瀏覽器首先會(huì)對(duì)輸入的URL進(jìn)行驗(yàn)證,如果不合法的時(shí)候,那么會(huì)把輸入的文字傳給默認(rèn)的搜索引擎,比如你只在地址欄輸入“悟空問(wèn)答”幾個(gè)字。
如果URL通過(guò)驗(yàn)證,那么可以解析得到協(xié)議(http或者h(yuǎn)ttps)、域名(wukong)、資源(首頁(yè))等信息。
瀏覽器會(huì)先檢查域名信息是否在緩存中。
再檢查域名是否在本地的Hosts文件中。
如果還不在,那么瀏覽器會(huì)向DNS服務(wù)器發(fā)送一個(gè)查詢請(qǐng)求,獲得目標(biāo)服務(wù)器的IP地址。
這時(shí)候?yàn)g覽器獲得了目標(biāo)服務(wù)器的IP(DNS返回)、端口(URL中包含,沒(méi)有就使用默認(rèn)),瀏覽器會(huì)調(diào)用庫(kù)函數(shù)socket,生成一個(gè)TCP流套接字,也就是完成了TCP的封包。
TCP封包完成之后,就可以傳輸了,在完成“你瞅啥”,“瞅你咋地”,“來(lái),過(guò)來(lái)嘮嘮”一系列操作之后,瀏覽器和服務(wù)器就完成了TCP的三次握手,建立了連接,后面就可以請(qǐng)求服務(wù)器資源了。
HTTP有很多請(qǐng)求方法,比如:GET/POST/PUT/DELETE等等,我們?yōu)g覽器輸入U(xiǎn)RL這種,是GET方法。
服務(wù)器接收到GET請(qǐng)求,服務(wù)器根據(jù)請(qǐng)求信息,獲得相應(yīng)的相應(yīng)內(nèi)容。例如我們輸入的是:www.wukong.com,那么意味著訪問(wèn)首頁(yè)文件。
瀏覽器從服務(wù)器拿到了想要訪問(wèn)的資源,大多數(shù)時(shí)候,這個(gè)資源就是HTML頁(yè)面,當(dāng)然也可能是一個(gè)其他類(lèi)型的文件。
瀏覽器先對(duì)HTML文檔進(jìn)行解析,生成解析樹(shù)(以DOM元素為節(jié)點(diǎn)的樹(shù))。
加載頁(yè)面的外部資源,比如JS、CSS、圖片。
遍歷DOM樹(shù),并計(jì)算每個(gè)節(jié)點(diǎn)的樣式,最終完成渲染,變成我們看到的頁(yè)面。
這次請(qǐng)求響應(yīng)之后,會(huì)斷開(kāi)連接,就這樣,完成了一次HTTP的請(qǐng)求。
“我是喲喲吼說(shuō)科技,專注于數(shù)據(jù)網(wǎng)絡(luò)的回答,歡迎大家與我交流數(shù)據(jù)網(wǎng)絡(luò)的問(wèn)題”
如題,一個(gè)完整的HTTP過(guò)程是怎樣的?
一個(gè)完整的HTTP過(guò)程包括建立連接、數(shù)據(jù)傳輸、斷開(kāi)連接等七個(gè)步驟。
下面喲喲來(lái)詳細(xì)介紹一下每一步:
HTTP協(xié)議是基于TCP協(xié)議來(lái)實(shí)現(xiàn)的,因此首先就是要通過(guò)TCP三次握手與服務(wù)器端建立連接,一般HTTP默認(rèn)的端口號(hào)為80;
在與服務(wù)器建立連接后,Web瀏覽器會(huì)想服務(wù)器發(fā)送請(qǐng)求命令
在瀏覽器發(fā)送請(qǐng)求命令后,還會(huì)發(fā)送一些其它信息,最后以一行空白內(nèi)容告知服務(wù)器已經(jīng)完成頭信息的發(fā)送;
在收到瀏覽器發(fā)送的請(qǐng)求后,服務(wù)器會(huì)對(duì)其進(jìn)行回應(yīng),應(yīng)答的第一部分是協(xié)議的版本號(hào)和應(yīng)答狀態(tài)碼;
與瀏覽器端同理,服務(wù)器端也會(huì)將自身的信息發(fā)送一份至瀏覽器;
在完成所有應(yīng)答后,會(huì)以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所需求的數(shù)據(jù)信息;
在完成此次數(shù)據(jù)通信后,服務(wù)器會(huì)通過(guò)TCP四次揮手主動(dòng)斷開(kāi)連接。但若此次連接為長(zhǎng)連接,那么瀏覽器或服務(wù)器的頭信息會(huì)加入keep-alive的信息,會(huì)保持此連接狀態(tài),在有其它數(shù)據(jù)發(fā)送時(shí),可以節(jié)省建立連接的時(shí)間;
歡迎大家多多關(guān)注我,在下方評(píng)論區(qū)說(shuō)出自己的見(jiàn)解。
前言
今天我們來(lái)徹底聊聊,什么是TCP/IP、http、socket、長(zhǎng)連接、短連接
TCP/IP是協(xié)議組,分為三個(gè)層次:
在網(wǎng)絡(luò)層有:
在傳輸層中有:
在應(yīng)用層有:
TCP包括:
UDP包括:
流程:連接->傳輸數(shù)據(jù)->關(guān)閉連接
HTTP是無(wú)狀態(tài)的,瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連接。
也可以這樣說(shuō):短連接是指SOCKET連接后發(fā)送后接收完數(shù)據(jù)后馬上斷開(kāi)連接。
流程:連接 -> 傳輸數(shù)據(jù) -> 保持連接 -> 傳輸數(shù)據(jù) -> 。。。-> 關(guān)閉連接。
長(zhǎng)連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。
HTTP也可以建立長(zhǎng)連接的,使用Connection:keep-alive,HTTP 1.1默認(rèn)進(jìn)行長(zhǎng)連接。
HTTP1.1 和 HTTP1.0 相比較而言,最大的區(qū)別就是增加了長(zhǎng)連接支持(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無(wú)狀態(tài)的,或者說(shuō)是不可以信任的。
長(zhǎng)連接多用于操作頻繁,點(diǎn)對(duì)點(diǎn)的通訊,而且連接數(shù)不能太多情況。
每個(gè)TCP連接都需要三步握手,這需要時(shí)間,如果每個(gè)操作都是先連接,再操作的話那么處理速度會(huì)降低很多。
所以每個(gè)操作完后都不斷開(kāi),次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。
例如:數(shù)據(jù)庫(kù)的連接用長(zhǎng)連接, 如果用短連接頻繁的通信會(huì)造成socket錯(cuò)誤,而且頻繁的socket 創(chuàng)建也是對(duì)資源的浪費(fèi)。
而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因?yàn)殚L(zhǎng)連接對(duì)于服務(wù)端來(lái)說(shuō)會(huì)耗費(fèi)一定的資源。
而像WEB網(wǎng)站成千上萬(wàn)甚至上億客戶端的頻繁連接,用短連接會(huì)更省一些資源,如果用長(zhǎng)連接,而且同時(shí)有成千上萬(wàn)的用戶,如果每個(gè)用戶都占用一個(gè)連接的話,那可想而知吧。
所以并發(fā)量大,但每個(gè)用戶無(wú)需頻繁操作情況下需用短連好。
總之,長(zhǎng)連接和短連接的選擇要視情況而定。
異步
報(bào)文發(fā)送和接收是分開(kāi)的,相互獨(dú)立的,互不影響。這種方式又分兩種情況:
同步
報(bào)文發(fā)送和接收是同步進(jìn)行,既報(bào)文發(fā)送后等待接收返回報(bào)文。
同步方式一般需要考慮超時(shí)問(wèn)題,即報(bào)文發(fā)出去后不能無(wú)限等待,需要設(shè)定超時(shí)時(shí)間,超過(guò)該時(shí)間發(fā)送方不再等待讀返回報(bào)文,直接通知超時(shí)返回。
在長(zhǎng)連接中一般是沒(méi)有條件能夠判斷讀寫(xiě)什么時(shí)候結(jié)束,所以必須要加長(zhǎng)度報(bào)文頭。讀函數(shù)先是讀取報(bào)文頭的長(zhǎng)度,再根據(jù)這個(gè)長(zhǎng)度去讀相應(yīng)長(zhǎng)度的報(bào)文。
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口(TCP/IP是協(xié)議,Socket是他們的具體實(shí)現(xiàn)和對(duì)外api)。
在設(shè)計(jì)模式中,Socket其實(shí)就是一個(gè)門(mén)面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面。
對(duì)用戶來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
Socket 通信示例
主機(jī) A 的應(yīng)用程序要能和主機(jī) B 的應(yīng)用程序通信,必須通過(guò) Socket 建立連接,而建立 Socket 連接必須需要底層 TCP/IP 協(xié)議來(lái)建立 TCP 連接。
建立 TCP 連接需要底層 IP 協(xié)議來(lái)尋址網(wǎng)絡(luò)中的主機(jī)。
我們知道網(wǎng)絡(luò)層使用的 IP 協(xié)議可以幫助我們根據(jù) IP 地址來(lái)找到目標(biāo)主機(jī),但是一臺(tái)主機(jī)上可能運(yùn)行著多個(gè)應(yīng)用程序,如何才能與指定的應(yīng)用程序通信就要通過(guò) TCP 或 UPD 的地址也就是端口號(hào)來(lái)指定。
這樣就可以通過(guò)一個(gè) Socket 實(shí)例唯一代表一個(gè)主機(jī)上的一個(gè)應(yīng)用程序的通信鏈路了。
當(dāng)客戶端要與服務(wù)端通信,客戶端首先要?jiǎng)?chuàng)建一個(gè) Socket 實(shí)例,操作系統(tǒng)將為這個(gè) Socket 實(shí)例分配一個(gè)沒(méi)有被使用的本地端口號(hào),并創(chuàng)建一個(gè)包含本地和遠(yuǎn)程地址和端口號(hào)的套接字?jǐn)?shù)據(jù)結(jié)構(gòu)。
這個(gè)數(shù)據(jù)結(jié)構(gòu)將一直保存在系統(tǒng)中直到這個(gè)連接關(guān)閉。在創(chuàng)建 Socket 實(shí)例的構(gòu)造函數(shù)正確返回之前,將要進(jìn)行 TCP 的三次握手協(xié)議,TCP 握手協(xié)議完成后,Socket 實(shí)例對(duì)象將創(chuàng)建完成,否則將拋出 IOException 錯(cuò)誤。
與之對(duì)應(yīng)的服務(wù)端將創(chuàng)建一個(gè) ServerSocket 實(shí)例,ServerSocket 創(chuàng)建比較簡(jiǎn)單只要指定的端口號(hào)沒(méi)有被占用,一般實(shí)例創(chuàng)建都會(huì)成功,同時(shí)操作系統(tǒng)也會(huì)為 ServerSocket 實(shí)例創(chuàng)建一個(gè)底層數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)中包含指定監(jiān)聽(tīng)的端口號(hào)和包含監(jiān)聽(tīng)地址的通配符,通常情況下都是“*”即監(jiān)聽(tīng)所有地址。
之后當(dāng)調(diào)用 accept() 方法時(shí),將進(jìn)入阻塞狀態(tài),等待客戶端的請(qǐng)求。當(dāng)一個(gè)新的請(qǐng)求到來(lái)時(shí),將為這個(gè)連接創(chuàng)建一個(gè)新的套接字?jǐn)?shù)據(jù)結(jié)構(gòu),該套接字?jǐn)?shù)據(jù)的信息包含的地址和端口信息正是請(qǐng)求源地址和端口。
這個(gè)新創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)將會(huì)關(guān)聯(lián)到 ServerSocket 實(shí)例的一個(gè)未完成的連接數(shù)據(jù)結(jié)構(gòu)列表中,注意這時(shí)服務(wù)端與之對(duì)應(yīng)的 Socket 實(shí)例并沒(méi)有完成創(chuàng)建,而要等到與客戶端的三次握手完成后,這個(gè)服務(wù)端的 Socket 實(shí)例才會(huì)返回,并將這個(gè) Socket 實(shí)例對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)從未完成列表中移到已完成列表中。所以 ServerSocket 所關(guān)聯(lián)的列表中每個(gè)數(shù)據(jù)結(jié)構(gòu),都代表與一個(gè)客戶端的建立的 TCP 連接。
Http請(qǐng)求的一次詳解:
客戶端輸入U(xiǎn)RL
有緩存且較新,客戶端直接讀取本地緩存進(jìn)行資源展示;
有緩存但是不新,準(zhǔn)備http請(qǐng)求包,發(fā)送至服務(wù)端進(jìn)行緩存校驗(yàn);
備注:http1.0中Expire、http1.1中是Cache-Control根據(jù)發(fā)起http請(qǐng)求:
請(qǐng)求報(bào)文包含:
a) 請(qǐng)求行
用來(lái)說(shuō)明請(qǐng)求類(lèi)型(getpostdelete等)、要訪問(wèn)的資源(URI)以及使用的HTTP版本(1.0還是1.1)
b) 首部(header)
HOST將指出請(qǐng)求的目的地;
User-Agent由瀏覽器來(lái)定義,自動(dòng)發(fā)送;
Connection:通常設(shè)置為keep-Alive, 長(zhǎng)連接;
其他首部包括等。
c) 空行
d) 請(qǐng)求實(shí)體
3. 提取請(qǐng)求首部HOST通過(guò)DNS域名解析獲取服務(wù)IP(DNS緩存遞歸等)
4. 通過(guò)IP與默認(rèn)端口創(chuàng)建TCP連接,進(jìn)行http請(qǐng)求報(bào)文數(shù)據(jù)發(fā)送,其中重點(diǎn)就三次握手進(jìn)行描述:
客戶端向服務(wù)端發(fā)送syn=1,seq=client請(qǐng)求的ID;
服務(wù)端向客戶端發(fā)送syn=1,seq=服務(wù)端請(qǐng)求的ID,ack=客戶端請(qǐng)求的ID+1;
客戶端向服務(wù)端發(fā)送syn=0,seq=客戶端請(qǐng)求的ID+1,ack=服務(wù)端請(qǐng)求的ID+1,datadata…
5. 服務(wù)端程序接受請(qǐng)求,定向到請(qǐng)求路徑處理請(qǐng)求:
服務(wù)器對(duì)請(qǐng)求報(bào)文進(jìn)行解析,并獲取請(qǐng)求的資源及請(qǐng)求方法等相關(guān)信息,根據(jù)方法,資源,首部和可選的主體部分對(duì)請(qǐng)求進(jìn)行處理
元數(shù)據(jù):請(qǐng)求報(bào)文首部
<method> <URL> <VERSION>
HEADERS格式name:value
<request body>
示例:
Host: www.chuyuni.cn 請(qǐng)求的主機(jī)名稱
Server: Apache/2.4.7
HTTP常用請(qǐng)求方式:MethodGET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
6.訪問(wèn)資源:
服務(wù)器獲取請(qǐng)求報(bào)文中請(qǐng)求的資源web服務(wù)器,即存放了web資源的服務(wù)器,負(fù)責(zé)向請(qǐng)求者提供對(duì)方請(qǐng)求的靜態(tài)資源,或動(dòng)態(tài)運(yùn)行后生成的資源
資源放置于本地文件系統(tǒng)特定的路徑:DocRoot
DocRoot → /var/www/html
/var/www/html/images/logo.jpg
http://www.magedu.com/images/logo.jpg
web服務(wù)器資源路徑映射方式:
(a) docroot (b) alias
(c) 虛擬主機(jī)docroot(d) 用戶家目錄docroot
7. 返回處理結(jié)果,準(zhǔn)備http響應(yīng):
響應(yīng)報(bào)文包含:
a) 狀態(tài)行:http版本(1.1或者1.0),狀態(tài)碼
200:請(qǐng)求正常處理
304:返回上次請(qǐng)求資源未作改動(dòng),驗(yàn)證瀏覽器的緩存機(jī)制
400:請(qǐng)求參數(shù)錯(cuò)誤
401:客戶端無(wú)權(quán)訪問(wèn),要去輸入用戶名密碼之類(lèi)的授權(quán)信息
403:禁止訪問(wèn)(讀寫(xiě)權(quán)限等影響)
404:請(qǐng)求的資源不存在
500:服務(wù)內(nèi)部錯(cuò)誤
502:網(wǎng)關(guān)錯(cuò)誤
503:臨時(shí)過(guò)載或者維護(hù),導(dǎo)致服務(wù)端無(wú)法正常處理請(qǐng)求
b) 首部
報(bào)文支持的語(yǔ)言編碼格式等,注意If-Modified-Since:只有當(dāng)所請(qǐng)求的內(nèi)容在指定的日期之后又經(jīng)過(guò)修改才返回它,否則返回304“Not Modified”應(yīng)答,用于服務(wù)端緩存校驗(yàn)
c) 空行
d) 響應(yīng)報(bào)文實(shí)體
8. 通過(guò)建立的tcp連接來(lái)返回相關(guān)的http響應(yīng)報(bào)文及http狀態(tài)信息,然后根據(jù)實(shí)際情況看是否關(guān)閉連接(Connection的keep-alive)
9. TCP連接關(guān)閉經(jīng)歷4次握手
客戶端主動(dòng)關(guān)閉連接放發(fā)送FIN進(jìn)入FIN_WAIT1狀態(tài)
服務(wù)端發(fā)最后的data和ack客戶端接收進(jìn)入CLOSEWAIT狀態(tài),客戶端進(jìn)入接受ACK進(jìn)入FINWAIT2狀態(tài)
服務(wù)端主動(dòng)發(fā)FIN,客戶端接受FIN并發(fā)送ack進(jìn)入TIMEWAIT狀態(tài)
服務(wù)器端正式關(guān)閉連接進(jìn)入close狀態(tài)
10. 客戶端拿到http響應(yīng)的報(bào)文信息,經(jīng)過(guò)一系列前端處理過(guò)程最終將請(qǐng)求的資源進(jìn)行展示。
作者:夕陽(yáng)雨晴,歡迎關(guān)注我的我們:偶爾美文,主流Java,為你講述不一樣的碼農(nóng)生活。
專業(yè)問(wèn)題我來(lái)回答,
所謂三次握手(Three-way Handshake),是在建立通信過(guò)程中,服務(wù)端和客戶端總共發(fā)送三次數(shù)據(jù)包。三次握手的目的是:建立TCP通信,和對(duì)方同步序列號(hào)和確認(rèn)號(hào),交換通信窗口的大小等。
1.建立TCP連接:只有當(dāng)TCP建立完成后才能進(jìn)行通信。
2.客戶端向服務(wù)端發(fā)起請(qǐng)求:該階段應(yīng)用層通過(guò)HTTP協(xié)議組裝請(qǐng)求包通過(guò)傳輸層網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層到達(dá)服務(wù)器。
3.客戶端向服務(wù)端發(fā)送請(qǐng)求頭信息:在這一步客戶端將請(qǐng)求頭信息組裝在各類(lèi)頭部字段中,進(jìn)行發(fā)送。
4.服務(wù)端向客戶端發(fā)送響應(yīng):服務(wù)端接收到客戶端的請(qǐng)求信息后,做出響應(yīng)來(lái)客戶端。
5.服務(wù)端向客戶端發(fā)送響應(yīng)報(bào)文的頭部字段:將響應(yīng)數(shù)據(jù)包的頭部字段發(fā)送給客戶端。
6.服務(wù)端向客戶端發(fā)送響應(yīng)數(shù)據(jù):通過(guò)Body將響應(yīng)數(shù)據(jù)給客戶單,而這些數(shù)據(jù)才是客戶端要獲取的。
7.關(guān)閉通信線路:數(shù)據(jù)發(fā)送完畢后,如果是短連接將馬上關(guān)閉通信線路,如果是長(zhǎng)連接,服務(wù)端會(huì)通過(guò)同步信息Connection:keep-alive來(lái)告訴客戶端。
以上,就是一個(gè)完整HTTP請(qǐng)求的流程,其主要在于TCP建聯(lián),后續(xù)都是應(yīng)用層之間的交互來(lái)通信。
感覺(jué)我的回答對(duì)你有幫助,麻煩點(diǎn)贊關(guān)注哈,你的關(guān)注是我繼續(xù)下去的動(dòng)力對(duì)網(wǎng)絡(luò)有興趣的可以留言交流,有疑問(wèn)的也可以私信,大家一起成長(zhǎng),一起交流,謝謝大家
謝謝邀請(qǐng)。
一次完整的HTTP請(qǐng)求過(guò)程是怎么樣的?事實(shí)上,題主的這個(gè)問(wèn)題,最開(kāi)始我也是抱著試一試的心態(tài)進(jìn)來(lái)的,后來(lái)發(fā)現(xiàn)整個(gè)回答區(qū)基本上都是學(xué)術(shù)回答,講的通俗一點(diǎn),都是專業(yè)人士在那邊玩,但是……沒(méi)幾個(gè)民眾能看得懂。就好像評(píng)論區(qū)那邊有一個(gè)回答的評(píng)論是,“在我們發(fā)計(jì)算機(jī)學(xué)術(shù)信息好像怪怪的。”
我大致把這個(gè)問(wèn)題查了個(gè)遍,寫(xiě)個(gè)最通俗的版本給大家看看吧。
其實(shí)HTTP請(qǐng)求過(guò)程,就是發(fā)送請(qǐng)求—響應(yīng)的過(guò)程。
今天你想起來(lái),有事,需要找隔壁老王要個(gè)小視頻。于是,你打開(kāi)了“TCP協(xié)議牌”機(jī)器,這是一臺(tái)高清組裝的移動(dòng)電話機(jī)。
①TCP告訴你,電話線路連接通道正在接通……
電話接通了,在視頻上出現(xiàn)了隔壁老王那張猥瑣的笑臉。
你開(kāi)始說(shuō)話。
- ①你:喂,你能聽(tīng)到我說(shuō)話嗎?(第一次握手)
- ②隔壁老王:能能能,我能聽(tīng)到,那你能聽(tīng)到我的說(shuō)話嗎?(第二次握手)
- ③你:哈哈,我也能聽(tīng)到!那咱們開(kāi)始吧!(第三次握手)
接下來(lái),就要開(kāi)始做正事了。
哎呀老王呀,我這邊需要一個(gè)小電影,你能給我發(fā)過(guò)來(lái)嗎?(客戶端發(fā)送請(qǐng)求信息)
2.接著,沒(méi)等老王說(shuō)話,你就把需要的小電影名字、大小、我這網(wǎng)速等等信息給他發(fā)了過(guò)去(客戶端發(fā)送頭部信息),末尾還加上了一長(zhǎng)串省略空格(以空格做結(jié)尾)。
老王皺皺眉頭。
“行吧!”(服務(wù)器端回應(yīng)請(qǐng)求信息)
“你是要這個(gè)小電影《XXX》,番號(hào)XXX,1GB大小,某度網(wǎng)盤(pán)是吧?行!”(服務(wù)器端回應(yīng)頭部信息)
老王動(dòng)了動(dòng)手指,查找了一下儲(chǔ)存卡目錄,翻出小電影。
“我給你發(fā)過(guò)去了!”(服務(wù)器端發(fā)送請(qǐng)求數(shù)據(jù))
你:哎呀哎呀,收到了!謝謝老王哈!下次請(qǐng)你吃飯!那我就先關(guān)閉了!(第一次揮手)
老王:最后跟你說(shuō)一句,少看小電影!(第二次揮手)
老王:那我就先關(guān)閉了?(第三次揮手)
你:行,那你關(guān)閉吧!(第四次揮手)
視頻聊天結(jié)束。你隨即打開(kāi)收到的抖音小視頻,美滋滋的看起成都小甜甜姐姐起來(lái)。
這件事告訴我們:
域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請(qǐng)求 --> 服務(wù)器響應(yīng)http請(qǐng)求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請(qǐng)求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶
一,在瀏覽器地址欄輸入網(wǎng)址
二,解析域名,找到主機(jī)的ip地址
三,瀏覽器與主機(jī)建立TCP連接
四,瀏覽器向主機(jī)發(fā)起GET請(qǐng)求
五,服務(wù)器響應(yīng)請(qǐng)求,返回html頁(yè)面
六,瀏覽器開(kāi)始顯示服務(wù)器返回的頁(yè)面,并且在顯示html頁(yè)面的時(shí)候,如果遇見(jiàn)css文件,js文件,圖片,就又會(huì)再次給相應(yīng)地址服務(wù)器發(fā)起請(qǐng)求。
一次完整的http請(qǐng)求過(guò)程是怎樣的?
一次完整的http請(qǐng)求可以說(shuō)相當(dāng)迷人:
從你輸入網(wǎng)址點(diǎn)擊回車(chē)的那一刻開(kāi)始,一切就開(kāi)始發(fā)生:
1、首先瀏覽器會(huì)解析你輸入的這一串字符;主要是解析協(xié)議(HTTP(s)、ftp:)、域名(www.qq.com)等;如果是合法的網(wǎng)址就繼續(xù)進(jìn)行;
2、接下啦就是要根據(jù)第一步解析到的域名找到域名指向的IP我們稱之為DNS查詢。當(dāng)然這也是一個(gè)相對(duì)有趣的過(guò)程,但不是問(wèn)題重點(diǎn),此處簡(jiǎn)略;
3、找到服務(wù)器的IP地址后寫(xiě)下來(lái)就是http請(qǐng)求的開(kāi)始:
三次握手建立連接:
客戶端:“在嗎?”;
服務(wù)端:“在啊”;
客服端 :“那我開(kāi)始連你啦”;開(kāi)始發(fā)起http請(qǐng)求
建立連接后發(fā)生Http請(qǐng)求,請(qǐng)求內(nèi)容有:
請(qǐng)求行:uri和協(xié)議的版本 (如:GET /index.php HTTP/1.1 )
請(qǐng)求頭部:關(guān)客戶端信息及請(qǐng)求正文信息(長(zhǎng)度、編碼格式等)
請(qǐng)求數(shù)據(jù):如:u=admin&pwd=123456 (可為空)
服務(wù)端在收到這些信息后作出相應(yīng)的回答:
狀態(tài):協(xié)議版本+狀態(tài)碼+簡(jiǎn)要描述(如:HTTP/1.1 200 OK)
響應(yīng)頭部:Content-Type(必須有:比如Content-Type: text/html), 其他可選:Date 、server 等
響應(yīng)數(shù)據(jù):即服務(wù)器回應(yīng)客戶端的內(nèi)容
打開(kāi)瀏覽器=》F12 訪問(wèn)一下百度看一下這個(gè)完美的過(guò)程吧!
當(dāng)然其中涉及的到東西遠(yuǎn)不止這些,比如瀏覽器靜態(tài)文件的緩存;各個(gè)狀態(tài)碼含義;單次請(qǐng)求最大返回資源數(shù);請(qǐng)求字節(jié)長(zhǎng)度限制等等。
此處班門(mén)弄斧,如有錯(cuò)誤請(qǐng)批評(píng)指正。
9
回答0
回答9
回答9
回答0
回答0
回答0
回答0
回答0
回答0
回答