現(xiàn)在接著《HTTP權(quán)威指南》學(xué)習(xí)總結(jié)(上)繼續(xù)介紹HTTP相關(guān)的知識(shí)
連接管理
TCP連接
之前一直在介紹HTTP的報(bào)文結(jié)構(gòu)。但是在通信的過(guò)程中,只有建立了連接才能互相傳送信息。因此,如何建立連接、維護(hù)連接、終止連接同樣非常重要。如果連接出現(xiàn)了問(wèn)題,那就有可能出現(xiàn)報(bào)文丟失從而破壞了信息的完整性。同樣,如果連接出現(xiàn)了問(wèn)題,那么報(bào)文的有序性也無(wú)法保證。HTTP通信其實(shí)是由 TCP/IP 來(lái)承載的。TCP/IP 是全球計(jì)算機(jī)及網(wǎng)絡(luò)設(shè)備都在使用的一種常用的分組交換網(wǎng)絡(luò)分層協(xié)議集。
因?yàn)檫@兩篇文章主要是介紹HTTP協(xié)議,所以不會(huì)深究 TCP/IP 協(xié)議集。筆者以后會(huì)另開(kāi)博客介紹TCP/IP,這里只提及其在用戶使用HTTP協(xié)議時(shí)起到的作用。
注:文章中出現(xiàn)的部分示例圖來(lái)自《HTTP權(quán)威指南》PDF版本的截圖
TCP是可靠的數(shù)據(jù)傳輸管道
HTTP連接實(shí)際上就是TCP連接以及一些使用連接的規(guī)則。TCP為HTTP提供了一條可靠的比特傳輸管道。從TCP連接一端輸入的字節(jié)信息能夠從另一端以原有的順序、正確地傳送出來(lái),也就是我們通常所說(shuō)的可以報(bào)文的完整性和有序性。
那么TCP是如何幫助客戶端和服務(wù)器端建立連接的呢?
換句話說(shuō),客戶端如何根據(jù)一個(gè)URL就能和服務(wù)端建立連接并獲取所需的資源?
其實(shí)TCP流是分段的,由IP分組進(jìn)行傳送。在TCP/IP模型中,HTTP位于應(yīng)用層,TCP位于傳輸層,IP位于網(wǎng)絡(luò)層。HTTPS其實(shí)就是在應(yīng)用層和傳輸層之間加了一個(gè)安全層(通常是TLS和SSL)。
一條TCP連接由<源地址,源端口號(hào),目標(biāo)地址,目標(biāo)端口號(hào)>4個(gè)值組成。兩條不同的TCP連接不允許擁有4個(gè)相同的地址組件。
TCP的性能
HTTP事務(wù)的時(shí)延
我們?cè)谇懊嫣岬竭^(guò),一個(gè)HTTP事務(wù)是由一條完整的請(qǐng)求報(bào)文和一條完整的響應(yīng)報(bào)文組成。看起來(lái)十分簡(jiǎn)單,但是這個(gè)過(guò)程中存在很多可能會(huì)增加時(shí)延的地方。
- 客戶端根據(jù)URL地址確定服務(wù)器的IP地址和服務(wù)端口號(hào)可能會(huì)耗費(fèi)比較多的時(shí)間(主要用于DNS域名解析等)
- 獲取到服務(wù)器IP地址等信息之后TCP向服務(wù)器發(fā)送建立連接的請(qǐng)求,并等待服務(wù)器回送同意建立連接的應(yīng)答并建立連接。這里如果有較多的HTTP事務(wù)的話,耗費(fèi)的時(shí)間將大大增加
- 連接建立起來(lái)之后,客戶端通過(guò)建立的TCP管道向服務(wù)器發(fā)送請(qǐng)求報(bào)文,并等到服務(wù)器回送響應(yīng)報(bào)文,可能會(huì)耗費(fèi)些許時(shí)間
TCP可能會(huì)導(dǎo)致哪些時(shí)延
- TCP的三次握手
- TCP慢啟動(dòng)擁塞機(jī)制
- TCP延遲確認(rèn)算法
- 端口耗盡和TIME_WATE時(shí)延
如何減少時(shí)延
- 并行連接:通過(guò)多條TCP連接發(fā)起并發(fā)的HTTP請(qǐng)求
- 持久連接:重用TCP連接以消除連接和關(guān)閉時(shí)延
- 管道化連接:多條HTTP請(qǐng)求共享TCP管道
- 復(fù)用的連接:交替?zhèn)魉驼?qǐng)求和響應(yīng)報(bào)文(與持久連接有所區(qū)別)
代理
什么是代理
Web代理服務(wù)器是網(wǎng)絡(luò)的中間實(shí)體。代理位于客戶端和服務(wù)器之間,扮演的角色有點(diǎn)類似于"中間人",在各個(gè)端點(diǎn)之間傳送HTTP報(bào)文。如果沒(méi)有Web代理,那么HTTP客戶端就要和HTTP服務(wù)器直接進(jìn)行對(duì)話。有了Web代理,客戶端和服務(wù)器之間的通信就要經(jīng)過(guò)代理了。其實(shí)對(duì)于客戶端和服務(wù)器來(lái)說(shuō),信息發(fā)送方是透明的。因?yàn)樗鼈冊(cè)诮邮請(qǐng)?bào)文的時(shí)候,分不清到底是直接從客戶端發(fā)過(guò)來(lái)的還是經(jīng)過(guò)了代理。
所以Web代理服務(wù)器既是客戶端,也是服務(wù)器端。
公共代理和私有代理
其實(shí)大部分代理都是公共代理,比如說(shuō)高速緩存代理服務(wù)器,會(huì)利用用戶間共同的請(qǐng)求。這樣的話,匯入同一個(gè)代理服務(wù)器的請(qǐng)求越多,就越有用。還有一部分是私有代理。搭建私有代理的費(fèi)用比較昂貴,常見(jiàn)的有某些用戶用于翻墻的梯子,有可能是自行搭建的代理服務(wù)。
代理的使用途徑
- 資源訪問(wèn)控制器:只允許授權(quán)用戶請(qǐng)求某些資源
- Web防火墻:限制非授權(quán)用戶進(jìn)入軍事區(qū)
- Web緩存代理:代理緩存維護(hù)了常用的文檔的本地副本,當(dāng)用戶請(qǐng)求對(duì)應(yīng)資源時(shí)直接從代理返回而不用請(qǐng)求遠(yuǎn)程服務(wù)器,避免了寬帶資源的浪費(fèi)
- 反向代理(在后面介紹Nginx的時(shí)候會(huì)著重講講反向代理)
- 正向代理:主要用于為局域網(wǎng)用戶訪問(wèn)Internet提供便利
其實(shí)代理和網(wǎng)關(guān)的作用有些類似。只要記住一點(diǎn):代理和通信雙方使用的都是同一種協(xié)議,例如在幫助客戶端同服務(wù)器進(jìn)行通信時(shí),它和客戶端以及服務(wù)器之間都是使用HTTP協(xié)議。而網(wǎng)關(guān)不一樣,網(wǎng)關(guān)可以進(jìn)行協(xié)議的轉(zhuǎn)換。比如說(shuō)客戶端打算通過(guò)FTP協(xié)議訪問(wèn)遠(yuǎn)端服務(wù)器,網(wǎng)關(guān)可能在和服務(wù)器進(jìn)行通信時(shí)是用的是HTTP協(xié)議,完成了協(xié)議的轉(zhuǎn)換。
緩存
緩存這部分的知識(shí)比較多,但是都比較簡(jiǎn)單、易于理解。
主要的作用代理緩存服務(wù)器就是將常用并且不經(jīng)常的資源緩存下來(lái),在用戶向遠(yuǎn)端服務(wù)器請(qǐng)求該資源時(shí)將本地緩存的資源提供出去。在此同時(shí),緩存服務(wù)器會(huì)不定時(shí)對(duì)本地資源向遠(yuǎn)程服務(wù)器進(jìn)行新鮮度驗(yàn)證等操作。遠(yuǎn)程服務(wù)器還可以通過(guò)某些HTTP首部,例如no-store、no-cache、Expires(使用的實(shí)際過(guò)期日期,可能由于時(shí)間不一致導(dǎo)致某些錯(cuò)誤)或者是max-age(服務(wù)器告訴緩存資源緩存最大秒數(shù),為零就是不緩存)等告訴緩存某些資源的過(guò)期時(shí)間或者是給用戶提供該資源之前應(yīng)該進(jìn)行什么操作---比如新鮮度驗(yàn)證、過(guò)期時(shí)間預(yù)警等。緩存有效地減少了冗余數(shù)據(jù)的傳輸、緩解了網(wǎng)絡(luò)瓶頸的問(wèn)題、降低了距離時(shí)延,同時(shí)也降低了對(duì)原始服務(wù)器的要求。對(duì)于緩存來(lái)說(shuō),命中率是一個(gè)比較重要的評(píng)價(jià)緩存性能的指標(biāo)。
cookie機(jī)制與客戶端識(shí)別
cookie主要用于客戶端向服務(wù)器端提供身份說(shuō)明。例如,客戶端和服務(wù)器端說(shuō):“Hi ! My name is EakonZhao, please give me my shopping list。”那么服務(wù)器就會(huì)給用戶EakonZhao提供其購(gòu)物清單。cookie可分為會(huì)話cookie以及持久cookie。會(huì)話cookie在用戶退出瀏覽器的時(shí)候就會(huì)被清除,而持久cookie則會(huì)存在硬盤之中。由于cookie屬于比較私密的信息,我們一定要保管好cookie,若是被別人竊取了,可能會(huì)對(duì)我們的財(cái)產(chǎn)或者是信息安全造成威脅。
認(rèn)證
認(rèn)證的作用就是確認(rèn)通信雙方身份的真實(shí)性。比如說(shuō)服務(wù)器會(huì)在客戶端請(qǐng)求訪問(wèn)某些訪問(wèn)控制資源的時(shí)候要求其提供合法的口令。但是認(rèn)證機(jī)制也存在一些缺陷,例如基本認(rèn)證簡(jiǎn)單便捷,但并不安全。因?yàn)榛菊J(rèn)證機(jī)制會(huì)通過(guò)網(wǎng)絡(luò)發(fā)送用戶名和密碼,雖然用戶名和密碼經(jīng)過(guò)了某種編碼(例如Base-64編碼),但實(shí)際上很容易就可以解碼。
HTTPS 安全的HTTP
HTTPS和HTTP并不是兩種完全分離的協(xié)議。HTTPS就是在HTTP外層加了一個(gè)保護(hù)殼(通常是TLS/SSL),使得外界看不到HTTP傳輸?shù)男畔ⅰF渲袝?huì)涉及到許多加密技術(shù)。例如對(duì)稱加密、非對(duì)稱加密、公開(kāi)密鑰技術(shù)、數(shù)字簽名或者是數(shù)字證書(shū)等等。其中各種加密技術(shù)主要用于防止信息傳輸過(guò)程中第三方竊取的行為,而數(shù)字簽名和數(shù)字證書(shū)等技術(shù)用于對(duì)通信雙方身份的認(rèn)證,防止和偽造的客戶端或者是服務(wù)器進(jìn)行通信。SSL和TLS協(xié)議其實(shí)十分類似,TLS協(xié)議是前者改進(jìn)之后的版本。TLS也會(huì)涉及握手的過(guò)程,其中的行為主要是用于約定加密方法、協(xié)商各種安全參數(shù),并且對(duì)客戶端和服務(wù)器端進(jìn)行證書(shū)的交換以驗(yàn)明身份等等。總之,HTTPS可以安全地傳輸信息,不用擔(dān)心被竊聽(tīng)。(HTTPS涉及了大量的加密算法、密碼學(xué)以及網(wǎng)絡(luò)安全相關(guān)的知識(shí),這里只做非常簡(jiǎn)要的介紹)