今天這篇文章我準(zhǔn)備分兩部分講,一部分是基礎(chǔ)知識(shí)點(diǎn),一部分是總結(jié)面試常問(wèn)到的內(nèi)容,是基礎(chǔ)知識(shí)點(diǎn)是用大綱的形式進(jìn)行展示,細(xì)節(jié)上不會(huì)闡述很多,重點(diǎn)放在面試題上,下面我們就開(kāi)始吧~
在計(jì)算機(jī)剛開(kāi)始流行的時(shí)候,一般都是一人一機(jī),每個(gè)機(jī)器并沒(méi)有通信。WWW(也就是現(xiàn)在的web)為了讓全世界的研究者知識(shí)共享,就提出了三項(xiàng)技術(shù),分別是http,html,url。其中http就是控制客戶端和服務(wù)端之間通信的協(xié)議(協(xié)議就像是我們平時(shí)交流的語(yǔ)言,只有語(yǔ)言相通,才可以交流)
HTTP和TCP/IP協(xié)議的關(guān)系
HTTP協(xié)議的通信過(guò)程簡(jiǎn)單來(lái)說(shuō)就是請(qǐng)求和響應(yīng)的過(guò)程,客戶端發(fā)送請(qǐng)求,服務(wù)端接收請(qǐng)求并作出響應(yīng)。復(fù)雜點(diǎn)兒說(shuō),就是基于TCP/IP協(xié)議進(jìn)行通信,這里需要分清楚TCP/IP協(xié)議與TCP協(xié)議以及IP協(xié)議之間的區(qū)別,乍一看,我們會(huì)誤認(rèn)為
這樣理解有些片面,其實(shí)TCP/IP是一個(gè)協(xié)議族,是互聯(lián)網(wǎng)相關(guān)的各類協(xié)議族的總稱,它包含了我們常見(jiàn)的協(xié)議:HTTP協(xié)議,TCP協(xié)議,IP協(xié)議等。
ps:這個(gè)地方我翻了好幾本書(shū),《圖解HTTP》中說(shuō),兩種理解都可以;但是在《圖解TCP/IP》中和謝希仁的《計(jì)算機(jī)網(wǎng)絡(luò)教程》中都只是說(shuō)TCP/IP協(xié)議是一個(gè)協(xié)議族。
那么HTTP協(xié)議和TCP協(xié)議以及IP協(xié)議有什么關(guān)系呢,看下面這張圖就知道了:
這張圖只是很簡(jiǎn)單的說(shuō)明一下TCP/IP的分層結(jié)構(gòu),我們只需要知道HTTP,TCP,IP分別位于應(yīng)用層,傳輸層和網(wǎng)絡(luò)層,并且信息在發(fā)送和解析的過(guò)程是這樣的:(圖片來(lái)自《圖解HTTP》)
可以理解成發(fā)送的過(guò)程就是不斷的添加首部,也就是設(shè)置信息(后面會(huì)講),而接收解析的過(guò)程就像是剝洋蔥一樣將首部一層一層的去掉,最后得到HTTP數(shù)據(jù)。
TCP三次握手與四次揮手
TCCP的三次握手指的是客戶端和服務(wù)器的連接與斷開(kāi)的過(guò)程,三次握手和四次揮手的簡(jiǎn)單版本如下面這張圖所示:(圖片來(lái)自《圖解TCP/IP》)
在整個(gè)通信的過(guò)程中至少需要來(lái)回發(fā)送7個(gè)包才能完成。
HTTP的特點(diǎn)
前面兩點(diǎn)很好理解,解釋一下后面兩點(diǎn)。無(wú)連接指的是每次連接只處理一個(gè)請(qǐng)求,服務(wù)器在處理完請(qǐng)求并收到應(yīng)答后會(huì)斷開(kāi)連接;無(wú)狀態(tài)是指服務(wù)器對(duì)傳遞的內(nèi)容沒(méi)有記憶
報(bào)文
HTTP報(bào)文分為以下兩種
報(bào)文的具體劃分又是這樣的(很多詳細(xì)內(nèi)容沒(méi)有講,可以去參考別的資料進(jìn)行學(xué)習(xí)):
方法
一般在請(qǐng)求報(bào)文中都會(huì)將請(qǐng)求方法放在請(qǐng)求行的第一個(gè),比較常見(jiàn)的方法有以下幾種:
狀態(tài)碼
http狀態(tài)碼是在響應(yīng)報(bào)文中出現(xiàn)的,表示此次響應(yīng)的狀態(tài),大致可劃分為
持久連接
前面我們?cè)谡f(shuō)HTTP特點(diǎn)的時(shí)候說(shuō)過(guò), HTTP是一種無(wú)連接,無(wú)狀態(tài)的協(xié)議。而TCP是有狀態(tài)的長(zhǎng)連接,為什么HTTP是基于TCP,但HTTP卻是無(wú)連接?
因?yàn)镠TTP每次請(qǐng)求完成后就會(huì)關(guān)閉TCP協(xié)議,但是我們可以通過(guò)編程自己控制TCP的關(guān)閉時(shí)間。由于每次請(qǐng)求都要連接TCP協(xié)議,效率很低,所以從HTTP/1.1過(guò)后,就開(kāi)啟了一個(gè)keep-Alive來(lái)保持連接,但是這個(gè)連接也是有時(shí)間限制的,不同的服務(wù)器有不同的處理,自己也可以設(shè)置。
管線化
以前請(qǐng)求和響應(yīng)模式基本是這樣的:
請(qǐng)求1 -> 響應(yīng)1 -> 請(qǐng)求2 -> 響應(yīng)2 。。。
有了管線化過(guò)后請(qǐng)求和響應(yīng)模式就變成了這樣:
請(qǐng)求1 -> 請(qǐng)求2 -> 響應(yīng)1 -> 響應(yīng)2 。。。
也就是說(shuō),現(xiàn)在可以先一次進(jìn)行很多次請(qǐng)求,而不是像以前那樣,只有上一次的響應(yīng)成功后才可以下一次請(qǐng)求,這樣大大的提高了效率。
之前我們說(shuō)過(guò),HTTP是無(wú)狀態(tài)的,這樣每次跳轉(zhuǎn)到新頁(yè)面時(shí),都需要重新登錄一次,麻煩又浪費(fèi)時(shí)間。所以就誕生了cookie,cookie是進(jìn)行狀態(tài)管理的,里面會(huì)存放之前登錄的信息。實(shí)現(xiàn)原理是客戶端第一次發(fā)送請(qǐng)求后,服務(wù)端響應(yīng)時(shí)會(huì)在響應(yīng)頭中添加一個(gè)set-cookie信息,要求客戶端保存cookie信息,客戶端在下次請(qǐng)求時(shí),會(huì)將這個(gè)cookie信息自動(dòng)發(fā)送給服務(wù)端,服務(wù)端接收后就會(huì)根據(jù)cookie信息進(jìn)行匹配。
隨著WEB信息量越來(lái)越大,HTTP的性能優(yōu)化也變得越來(lái)越重要了,其中AJAX就是為了解決HTTP每次發(fā)送請(qǐng)求都會(huì)更新整個(gè)頁(yè)面的問(wèn)題,有的時(shí)候只是改變了一點(diǎn)點(diǎn),甚至是無(wú)關(guān)緊要的東西時(shí)都會(huì)發(fā)生整個(gè)頁(yè)面的更新,這樣會(huì)造成很大的浪費(fèi)。所以出現(xiàn)了AJAX,AJAX是一個(gè)異步刷新技術(shù),其核心在于XMLHttpRequest,如果不了解AJAX的可以看看我之前的這篇文章。
我們會(huì)發(fā)現(xiàn)無(wú)論怎么改,服務(wù)器都是處于被動(dòng)狀態(tài),只能接受客戶端的請(qǐng)求,這樣客戶端只有通過(guò)經(jīng)常發(fā)送請(qǐng)求來(lái)確認(rèn)是否有數(shù)據(jù)更新,但是大多數(shù)時(shí)候都是沒(méi)有數(shù)據(jù)更新的,這樣會(huì)造成很大的浪費(fèi),所以就產(chǎn)生了webSocket協(xié)議,這個(gè)協(xié)議就是為了改變服務(wù)器的被動(dòng)狀態(tài),使用這個(gè)協(xié)議后,服務(wù)端可以主動(dòng)給客戶端發(fā)送信息,這樣就意味著客戶端只需要一次請(qǐng)求,就可以保證數(shù)據(jù)的實(shí)時(shí)更新,而不是像之前那樣定時(shí)發(fā)送AJAX請(qǐng)求的來(lái)實(shí)現(xiàn)定時(shí)更新,可以看看下圖幫助理解(來(lái)自菜鳥(niǎo)教程):
其實(shí)HTTPS不是一個(gè)新的協(xié)議,只是在HTTP和TCP之間添加了一層SSL協(xié)議,上面誕生的新技術(shù)是為了提高HTTP通信的性能,而HTTPS是為了提高通信過(guò)程中的安全性:
HTTP + 加密 + 認(rèn)證 + 完整性保護(hù) = HTTPS(引自《圖解HTTP》)
這里只是說(shuō)明一下有這個(gè)新技術(shù),具體可以看這篇文章。
由于這篇文章本身就比較長(zhǎng),害怕有些初學(xué)者看到會(huì)直接關(guān)閉,所以我將面試題放在了另外一篇文章,大家請(qǐng)移步這里。
這篇文章還有好多知識(shí)點(diǎn)沒(méi)有總結(jié),只是列了一個(gè)很粗糙的大綱,把經(jīng)常容易問(wèn)到的內(nèi)容詳細(xì)說(shuō)了一下,還是推薦大家看書(shū)來(lái)學(xué)習(xí),如果你是對(duì)HTTP一無(wú)所知,推薦你看《圖解HTTP》,這本書(shū)比較適合初學(xué)者;如果是對(duì)HTTP有一定的了解,想系統(tǒng)的進(jìn)行學(xué)習(xí)的話,推薦你看《HTTP權(quán)威指南》,這本書(shū)講得非常細(xì),而且書(shū)里面結(jié)構(gòu)的分布特別好,強(qiáng)烈推薦!
聯(lián)系客服