接著了解HTTP的一些基本知識(shí)奔缠。
什么是HTTP
如果說(shuō)TCP/IP是一套約定計(jì)算機(jī)如何交流通信的規(guī)則的話嘱么,HTTP起初設(shè)計(jì)的初衷則是約定客戶端(Client,也就是瀏覽器)和主機(jī)(Host孵班,也就是服務(wù)器)之間的通信規(guī)則鄙漏,當(dāng)然,現(xiàn)在腹鹉,它不止是這個(gè)功能咯藏畅!
那么,如何給HTTP下一個(gè)定義呢功咒?HTTP,全稱是HyperText Transfer Protocol愉阎,翻譯過(guò)來(lái)就是超文本傳輸協(xié)議绞蹦,它是一種在client-server之間,用于傳輸超媒體文檔的榜旦、無(wú)狀態(tài) 的應(yīng)用層協(xié)議坦辟。所謂的超媒體文檔,指的就是HTML等超文本文件以及Web中的文本章办、圖片锉走、視頻、腳本和樣式等藕届。而無(wú)狀態(tài)挪蹭,則意味著它不能夠保存數(shù)據(jù),這在電商網(wǎng)站的購(gòu)物車功能中表現(xiàn)最明顯休偶,如果我們從一個(gè)頁(yè)面向購(gòu)物車添加了一件商品梁厉,在換一個(gè)頁(yè)面后,這件商品并不會(huì)實(shí)時(shí)更新踏兜,這個(gè)問(wèn)題如何解決呢词顾?——解決辦法當(dāng)然是有的,就是通過(guò)HTTP cookies碱妆,把商品信息添加cookies到HTTP頭部肉盹,創(chuàng)建一個(gè)會(huì)話共享這個(gè)信息。HTTP請(qǐng)求(request)從client端(瀏覽器)發(fā)出疹尾,到server端(服務(wù)器)的指定端口(默認(rèn)80端口)上忍,服務(wù)器端接受到請(qǐng)求后,根據(jù)請(qǐng)求頭部信息纳本,做出響應(yīng)(response)窍蓝,返回一個(gè)響應(yīng)狀態(tài)和對(duì)應(yīng)的請(qǐng)求資源(文件、錯(cuò)誤信息之類的)繁成。HTTP位于七層協(xié)議的最上層應(yīng)用層吓笙。當(dāng)然,這整個(gè)過(guò)程并不只是客戶端和服務(wù)器兩個(gè)點(diǎn)的事情巾腕,期間還有路由器面睛、調(diào)節(jié)器等許多實(shí)體節(jié)點(diǎn)。
Http與Https
我們一直談到http祠墅,但是侮穿,當(dāng)你在瀏覽器中看到的URL中歌径,經(jīng)常會(huì)看到前面的協(xié)議名是https毁嗦,那么,http和https有什么關(guān)系呢回铛?(我想絕不是java和javascript的關(guān)系滴)狗准。
在查閱了一些資料之后克锣,我知道后面多余的s指的是secure,也就是說(shuō)后者是前者的安全版本腔长,那么為什么https會(huì)更安全呢袭祟?原來(lái),開(kāi)發(fā)https的主要目的是為了在網(wǎng)絡(luò)傳輸數(shù)據(jù)的過(guò)程中捞附,保證數(shù)據(jù)的隱私和完整性巾乳。它的主要設(shè)計(jì)思想是,通過(guò)在公開(kāi)的網(wǎng)絡(luò)通道上建立一條安全通道鸟召,并且通過(guò)使用一些安全證書(shū)和加密包的方式胆绊,對(duì)數(shù)據(jù)提供保護(hù)。所以欧募,會(huì)有一些專門(mén)的機(jī)構(gòu)(如VeriSign以及Microsoft等)負(fù)責(zé)頒發(fā)信任證書(shū)給網(wǎng)站压状,并且將這些信任協(xié)議預(yù)先安裝在瀏覽器中,所以說(shuō)跟继,這兩個(gè)機(jī)構(gòu)相當(dāng)于德高望重的值得被信賴的人种冬。我們進(jìn)入一個(gè)網(wǎng)站時(shí),在瀏覽器地址欄的一側(cè)舔糖,經(jīng)常會(huì)有一個(gè)鎖子娱两,這個(gè)鎖子就代表網(wǎng)站的是否安全,例如我們?cè)贑hrome中輸入百度的網(wǎng)址金吗,會(huì)看到左側(cè)綠色的鎖子和安全兩個(gè)字谷婆。在Firefox還可以看到它的安全證書(shū),長(zhǎng)這樣:
可以看到證書(shū)的頒發(fā)機(jī)構(gòu)是Global Sign.
Https是通過(guò)叫做SSL/TLS技術(shù)來(lái)加密數(shù)據(jù)包辽聊,TLS纪挎,叫做傳輸層安全協(xié)議(Transport Layer Security),它的前身是SSL跟匆,叫做安全套接層(Secure Sockets Layer)异袄,其實(shí),Https歷史淵源很久了玛臂,這是1994年網(wǎng)景推出第一代瀏覽器網(wǎng)景導(dǎo)航者時(shí)提出的烤蜕,當(dāng)時(shí),它們就用SSL加密迹冤,后來(lái)IETF將這項(xiàng)技術(shù)標(biāo)準(zhǔn)化讽营,于1999年推出TLS。所以說(shuō)泡徙,Https的安全保障是建立在SSL/TLS的基礎(chǔ)上的橱鹏。
另外,Http和Https的一個(gè)區(qū)別是,前者使用80端口傳輸莉兰,而后者使用443端口挑围。
下面的內(nèi)容是在一次完整的HTTP請(qǐng)求中的過(guò)程以及相關(guān)概念。
- 請(qǐng)求信息(報(bào)文)
- 回應(yīng)信息(報(bào)文)
- 請(qǐng)求方法(動(dòng)作)
- 狀態(tài)碼(status code)
請(qǐng)求信息(報(bào)文)
請(qǐng)求信息是包含了一個(gè)HTTP請(qǐng)求的基本信息的報(bào)文糖荒,其一般包括請(qǐng)求方法(下面詳述)杉辙,資源路徑(一般指URL地址),HTTP協(xié)議版本號(hào)捶朵,Headers(主機(jī)名和一些告訴服務(wù)器處理信息的參數(shù)蜘矢,例如接收的語(yǔ)言之類的),在POST等請(qǐng)求方法中可以出現(xiàn)的Body信息综看,也就是發(fā)過(guò)去的資源硼端。可以在Chrome的開(kāi)發(fā)者工具的Network面板左側(cè)的Name子面板下點(diǎn)擊網(wǎng)址寓搬,然后在右側(cè)的Headers選項(xiàng)卡下查看請(qǐng)求信息珍昨。例如google.com的請(qǐng)求信息如下圖。
回應(yīng)信息(報(bào)文)
回應(yīng)信息是指server端接受到請(qǐng)求信息后句喷,經(jīng)過(guò)處理而返回的響應(yīng)信息镣典,和請(qǐng)求信息一樣,它同樣通過(guò)一個(gè)報(bào)文來(lái)實(shí)現(xiàn)唾琼,其主要內(nèi)容是:HTTP協(xié)議版本號(hào)兄春,狀態(tài)信息姚糊,Headers倘要,比請(qǐng)求更常見(jiàn)的返回內(nèi)容Body以及狀態(tài)碼,回應(yīng)信息與請(qǐng)求信息的最大不同是倦青,它會(huì)返回一個(gè)狀態(tài)碼和狀態(tài)信息祭饭,其它的差不多意思~其實(shí)狀態(tài)碼和狀態(tài)信息芜茵,是比較常見(jiàn)的。
狀態(tài)碼(Status Code)
HTTP狀態(tài)碼(英語(yǔ):HTTP Status Code)是用以表示網(wǎng)頁(yè)服務(wù)器HTTP響應(yīng)狀態(tài)的3位數(shù)字代碼倡蝙。它由 RFC 2616 規(guī)范定義的九串,并得到 RFC 2518、RFC 2817寺鸥、RFC 2295猪钮、RFC 2774 與 RFC 4918 等規(guī)范擴(kuò)展。 所有狀態(tài)碼的第一個(gè)數(shù)字代表了響應(yīng)的五種狀態(tài)之一胆建】镜停——來(lái)自維基百科.
那么,我們不禁要問(wèn)了笆载,這五個(gè)數(shù)字和它所對(duì)應(yīng)的五種狀態(tài)到底是什么呢扑馁?打個(gè)比方好了涯呻,這就像戀愛(ài)中的表白,假如一位男士寫(xiě)了一封極其浪漫的告白信向一個(gè)姑娘表白檐蚜,那么這封信就是HTTP請(qǐng)求了魄懂,而回信則是回應(yīng)信息沿侈,其中的內(nèi)容則是狀態(tài)碼了闯第,接下來(lái),我們來(lái)模擬一下缀拭,這位女士回復(fù)以下幾種數(shù)字打頭的信息咳短,對(duì)應(yīng)表白的成功與否。
1XX蛛淋,以1打頭的狀態(tài)碼表示服務(wù)器已經(jīng)接受到請(qǐng)求咙好,需要繼續(xù)處理,這是一種臨時(shí)響應(yīng)狀態(tài)褐荷,這種狀態(tài)碼是不會(huì)發(fā)送到客戶端來(lái)的~也就是說(shuō)勾效,女方收到了信,她還沒(méi)看呢叛甫,她總不會(huì)回一封信說(shuō):你的信我收到了层宫,還沒(méi)拆!
2XX其监,以2打頭的狀態(tài)碼代表請(qǐng)求已經(jīng)被接收萌腿,并且完全懂了什么意思并且接受了請(qǐng)求。也就是說(shuō)抖苦,如果男士收到的回信內(nèi)容是以2打頭的毁菱,那么恭喜,告白成功了锌历!
3XX贮庞,以3打頭的狀態(tài)碼表示需要客戶端需要進(jìn)一步的操作才能完成請(qǐng)求也就是說(shuō),這位姑娘的意思是究西,你必須要在北京有一套房才能答應(yīng)你呢
4XX贸伐,以4打頭的狀態(tài)碼表示客戶端發(fā)生錯(cuò)誤,妨礙了服務(wù)器的處理怔揩。這就糟糕了捉邢,你的表白信估計(jì)寫(xiě)的不大好,寫(xiě)了一大堆表?yè)P(yáng)另外一位姑娘的話商膊,所以伏伐,告白失敗晕拆!
5XX藐翎,以5打頭的狀態(tài)表示服務(wù)器在處理的過(guò)程中由于某些原因發(fā)生了錯(cuò)誤材蹬,導(dǎo)致請(qǐng)求失敗。這回就是姑娘的問(wèn)題吝镣,這位姑娘大概已經(jīng)名花有主了堤器,所以,告白失斈┘帧闸溃!
一共有以上五大類狀態(tài)碼,其中我們最常見(jiàn)的狀態(tài)碼是200(請(qǐng)求成功拱撵,數(shù)據(jù)也將會(huì)返回)辉川,301(Moved permanently,資源被永久移動(dòng)到新位置了)拴测,401(當(dāng)前請(qǐng)求需要用戶驗(yàn)證)乓旗,404(請(qǐng)求失敗,所需的資源在服務(wù)器上沒(méi)找到)集索。
而狀態(tài)信息(State message)屿愚,則指的是服務(wù)器端根據(jù)狀態(tài)碼做出的描述性信息,這是可以自定義的务荆,例如我們常見(jiàn)的“404妆距,糟糕,你要找的頁(yè)面走丟了”之類的~
請(qǐng)求方法(動(dòng)作)
請(qǐng)求方法蛹含,也叫請(qǐng)求動(dòng)作毅厚,就是客戶端向服務(wù)器發(fā)送請(qǐng)求時(shí)所用的對(duì)話方式,因?yàn)榉椒ǖ牟煌窒洌懿扇〉牟僮饕泊蟠蟛煌ⅲ琀TTP請(qǐng)求方法一共有8種。
GET.獲取相關(guān)資源酷窥,這是最常見(jiàn)的方法之一咽安,它只要求URL中包含請(qǐng)求資源的位置和服務(wù)器返回資源的必要信息。
POST.向服務(wù)器提交數(shù)據(jù)蓬推,可能是添加新資源或修改已存在資源妆棒,要添加的信息包含在請(qǐng)求信息Headers中,這類方法常見(jiàn)情景有提交表單沸伏,上傳文件等糕珊。
PUT.更新指定資源,上傳其最新版本毅糟,上傳的數(shù)據(jù)仍然會(huì)包含在請(qǐng)求信息Headers中红选。
DELETE.刪除一個(gè)已存在的資源。
HEAD.與PUT類似姆另,只不過(guò)它不會(huì)添加信息到請(qǐng)求信息中喇肋,所以經(jīng)常用于一些資源的檢驗(yàn)與驗(yàn)證工作坟乾。
TRACE.經(jīng)常用于診斷工作。
OPTIONS.這個(gè)方法可使服務(wù)器傳回該資源所支持的所有HTTP請(qǐng)求方法蝶防。
其中甚侣,前四種比較常用。
總結(jié)
本文通過(guò)了解HTTP的基本概念:一個(gè)在客戶端和服務(wù)器端交換超文本文件(當(dāng)然還有其他功能)的應(yīng)用層協(xié)議间学;
然后接著了解了在一次HTTP請(qǐng)求中會(huì)發(fā)生什么:客戶端發(fā)送一個(gè)請(qǐng)求信息(可能包括請(qǐng)求方法殷费,資源路徑,協(xié)議版本號(hào)菱鸥,Headers宗兼,請(qǐng)求Body等)躏鱼,請(qǐng)求信息通過(guò)路由器等中間層的幾微秒的漫長(zhǎng)旅程氮采,到達(dá)服務(wù)器(也可能到不了,301之類的你懂的)染苛,服務(wù)器接受到請(qǐng)求后鹊漠,會(huì)根據(jù)請(qǐng)求Headers以及Body的內(nèi)容進(jìn)行相關(guān)操作(數(shù)據(jù)添加,更新茶行,刪除等)躯概,然后同樣返回一個(gè)響應(yīng)消息回去,這個(gè)響應(yīng)消息里包含了客戶端需要的信息畔师,主要是Body(可能是一個(gè)HTML頁(yè)面)娶靡,當(dāng)然還有狀態(tài)碼,狀態(tài)信息看锉,Headers等姿锭,這樣,一次完整的HTTP請(qǐng)求就完成了伯铣。
我們會(huì)發(fā)現(xiàn)呻此,如果昨天我們了解了從URL輸入地址欄開(kāi)始,瀏覽器如何與DNS服務(wù)器配合腔寡,完成URL到IP的匹配過(guò)程焚鲜,從而定位到服務(wù)器的位置,那么今天放前,我們了解的東西忿磅,則是在知道服務(wù)器的位置之后,瀏覽器是如何在HTTP協(xié)議的約定下凭语,去完成發(fā)送與取得數(shù)據(jù)的過(guò)程葱她。也就是說(shuō),昨天我們研究了路線叽粹,今天我們研究了在路上的故事览效。
我們的學(xué)習(xí)過(guò)程却舀,也將是這樣一個(gè)循序漸進(jìn)的過(guò)程,希望我可以踏踏實(shí)實(shí)走好每一步路锤灿。