五分鐘帶你了解 HTTP 代理
"如果你有任何疑問(wèn)和不滿,請(qǐng)和我的代理人去說(shuō)",我們經(jīng)常會(huì)聽(tīng)到某某明星又爆出什么猛料,結(jié)果都是當(dāng)事人不解釋,倒是由代理或者工作室來(lái)解釋一大堆有的沒(méi)的。
他們好像是明星的另一張嘴,替代明星完成他們自己無(wú)法完成或者不愿意完成的工作。
這里的代理是現(xiàn)實(shí)生活中的實(shí)體,是實(shí)實(shí)在在存在的人。
而在互聯(lián)網(wǎng)中,也存在著一種實(shí)體,來(lái)替代網(wǎng)絡(luò)實(shí)體完成它所無(wú)法完成的工作,這種網(wǎng)絡(luò)實(shí)體叫服務(wù)器,不過(guò)它還有一種特殊的叫法:Web 代理(proxy)。
上面的網(wǎng)絡(luò)實(shí)體,其實(shí)就指的是客戶端和服務(wù)器。
代理通常位于服務(wù)器和客戶端之間,扮演一種中間人的角色,在各個(gè)點(diǎn)之間傳遞 HTTP 報(bào)文,如果沒(méi)有代理,HTTP 客戶端就要和 HTTP 服務(wù)器進(jìn)行直接對(duì)話。
那么,為什么 HTTP 客戶端不直接和 HTTP 服務(wù)器進(jìn)行對(duì)話,非要在中間加一層代理呢?它能起到什么作用呢?
首先,我們大家知道,有一些國(guó)外的網(wǎng)站在國(guó)內(nèi)是訪問(wèn)不了的,但是假如我們就想訪問(wèn)某同性交友網(wǎng)站改怎么辦呢?這里就需要使用代理了,它能夠突破自身 IP 限制,訪問(wèn)國(guó)外站點(diǎn)。還有一些涉密公司會(huì)禁止訪問(wèn)外網(wǎng),那要是查資料該怎么辦呢?使用代理。
其次,代理還能夠提升網(wǎng)絡(luò)帶寬,加快訪問(wèn)速度,代理服務(wù)器會(huì)存儲(chǔ)一部分帶寬,而且代理服務(wù)器內(nèi)部會(huì)有一塊大的緩沖區(qū),當(dāng)訪問(wèn)了某些頁(yè)面后,代理服務(wù)器就會(huì)緩存這些頁(yè)面,等下次訪問(wèn)相同頁(yè)面時(shí),代理服務(wù)器會(huì)直接返回緩沖區(qū)緩沖之后的頁(yè)面,這樣代理服務(wù)器就會(huì)把帶寬省下來(lái)的同時(shí)提高訪問(wèn)速度。
代理還會(huì)隱藏你主機(jī)的真實(shí) IP,我們也可以通過(guò)這種方法免受網(wǎng)絡(luò)攻擊。
總的來(lái)說(shuō),代理的功能主要有下面幾點(diǎn)。
私有代理和公共代理
代理服務(wù)器可以為許多客戶端提供代理服務(wù),同時(shí)代理也可以只是某個(gè)客戶端專用的。就像教父中的湯姆軍師只為柯里昂家族服務(wù),而像是律師事務(wù)所的大部分律師是則面向公眾服務(wù)的。所以,依據(jù)職責(zé)的不同,單個(gè)客戶端專用的代理一般被稱為私有代理,而為大多數(shù)客戶端服務(wù)的代理被稱為公共代理。
公共代理
我們見(jiàn)到的大部分代理服務(wù)器都是公共代理,公共代理最大的特點(diǎn)就是共享,但是共享也意味著風(fēng)險(xiǎn),一般不推薦使用這種代理,不過(guò)公共代理卻有他自己獨(dú)有的優(yōu)點(diǎn):
- 大部分公共代理都是免費(fèi)的,這意味著你可以隨意白嫖(果然免費(fèi)的才香)。
- 能夠支持 HTTP 和 SOCKSv5 服務(wù)。
這里我們熟悉 HTTP 協(xié)議,那么 SOCKSv5 是個(gè)什么協(xié)議呢?我們后面會(huì)說(shuō)到。
- 如果你想要從 Internet 上收集數(shù)據(jù),那么公共代理對(duì)某些 SEO 很有用。
私有代理
專用的私有代理比較少見(jiàn),但它們卻是存在,尤其是直接運(yùn)行在客戶端計(jì)算機(jī)上的時(shí)候。私有代理是一個(gè)專用的 IP ,一次只能由一個(gè)客戶端使用。私有代理相比公共代理,也有一些獨(dú)特的優(yōu)勢(shì)。
- 速度快,因?yàn)橹挥袉蝹€(gè)客戶端使用。
- 足夠安全,無(wú)需擔(dān)心隱私被泄漏的風(fēng)險(xiǎn)。
不過(guò),不論是公共代理還是私有代理,它們都有一個(gè)共同的特性,那就是既能扮演客戶端,接受響應(yīng)報(bào)文,返回響應(yīng)報(bào)文;也能扮演服務(wù)器,接受客戶端請(qǐng)求,處理客戶端請(qǐng)求。
所以,代理服務(wù)器分別扮演不同的職責(zé),完全是根據(jù)你選擇的參照物來(lái)說(shuō)明的。
我們大家知道,網(wǎng)關(guān)是一種網(wǎng)絡(luò)硬件設(shè)備或網(wǎng)絡(luò)節(jié)點(diǎn),它是網(wǎng)絡(luò)的入口和出口點(diǎn),因?yàn)樗袛?shù)據(jù)在路由之前都必須通過(guò)網(wǎng)關(guān)或與網(wǎng)關(guān)通信。網(wǎng)關(guān)旨在將兩個(gè)不同的網(wǎng)絡(luò)連接在一起,允許用戶跨多個(gè)網(wǎng)絡(luò)進(jìn)行通信。
上面這段描述中的網(wǎng)關(guān),圈重點(diǎn),其實(shí)就扮演了一個(gè)代理的角色,它行使的功能就是幫助兩個(gè)異構(gòu)的網(wǎng)絡(luò)進(jìn)行通信。
不過(guò),雖然網(wǎng)關(guān)能起到代理的作用,但是網(wǎng)關(guān)和代理服務(wù)器確實(shí)完全不同的東西。
代理和網(wǎng)關(guān)最大的區(qū)別就是網(wǎng)關(guān)不會(huì)進(jìn)行數(shù)據(jù)的過(guò)濾,網(wǎng)關(guān)不能阻止訪問(wèn)某些網(wǎng)站,而代理服務(wù)器的功能卻有很多。
可以這么理解,網(wǎng)關(guān)就是沒(méi)有過(guò)濾功能的代理服務(wù)器。
這里不得不提另外一種網(wǎng)絡(luò)設(shè)備,那就是防火墻,防火墻能夠也能夠過(guò)濾數(shù)據(jù),進(jìn)行安全性檢查。
嚴(yán)格來(lái)說(shuō),代理連接的是兩個(gè)或者多個(gè)使用相同協(xié)議的應(yīng)用程序,依據(jù)不同的協(xié)議,代理可以分為很多種,不過(guò)我們常用的一般就下面三種代理方式。
- HTTP 代理,是我們最常見(jiàn)到的一種代理方式,主要是代理瀏覽器進(jìn)行訪問(wèn)頁(yè)面。
- SOCKS 代理,SOCKS 代理的正是 Socket,它支持多種協(xié)議,支持 HTTP 、FTP 等多種類型請(qǐng)求。它分SOCKS 4 和SOCKS 5兩種類型,SOCKS 4只支持 TCP 協(xié)議而 SOCKS 5支持 TCP/UDP 協(xié)議,還支持各種身份驗(yàn)證機(jī)制等協(xié)議。
- SSL 代理,SSL 代理也叫做 HTTPS 代理,為了保護(hù)敏感數(shù)據(jù)在互聯(lián)網(wǎng)傳送中的安全性,越來(lái)越多的網(wǎng)站都采用 SSL 加密形式發(fā)布。
這時(shí)候可能有讀者會(huì)說(shuō)了,cxuan 你講了這么多東西,那到底網(wǎng)關(guān)能干啥呢?能舉幾個(gè)示例嗎?
來(lái)了來(lái)了。
代理服務(wù)器的作用
下面我通過(guò)幾個(gè)示例來(lái)給你解釋一下代理服務(wù)器都有哪些用途和作用:
網(wǎng)站過(guò)濾
這是我們上面一直在講的,代理服務(wù)器能夠訪問(wèn)一些網(wǎng)站,同時(shí)它也有過(guò)濾功能,禁止一些網(wǎng)站的訪問(wèn)。
文檔訪問(wèn)控制
可以使用代理服務(wù)器在大量的 web 服務(wù)器和 web 資源之間實(shí)現(xiàn)統(tǒng)一的訪問(wèn)控制,通常用在大型企業(yè)或者分布式機(jī)構(gòu)中。比如下面是三種擁有不同訪問(wèn)控制權(quán)限的客戶端。
- 客戶端 A 可以無(wú)限制的訪問(wèn)服務(wù)器 A 中的指定頁(yè)面。
- 客戶端 B 可以無(wú)限制的直接訪問(wèn)互聯(lián)網(wǎng)。
- 客戶端 C 在訪問(wèn)服務(wù)器 C 的加密數(shù)據(jù)之前需要輸入密碼或者憑證。
安全防火墻
代理服務(wù)器也可以充當(dāng)防火墻的角色,用于限制/過(guò)濾數(shù)據(jù)的流入和流出,進(jìn)行安全性檢查等。
Web 緩存
代理緩存能夠維護(hù)常用網(wǎng)站的本地副本,以便減少緩慢而且昂貴的因特網(wǎng)通信開(kāi)銷。
反向代理
代理除了能夠假扮客戶端之外,它還能夠假扮服務(wù)器,這種方式被稱為反向代理。但是對(duì)于客戶端而言,反向代理服務(wù)器就相當(dāng)于目標(biāo)服務(wù)器,這也就是說(shuō)客戶端直接訪問(wèn)代理服務(wù)器就能夠直接獲得目標(biāo)服務(wù)器的資源。
可以使用反向代理來(lái)提高訪問(wèn)龜速 Web 服務(wù)器上公共內(nèi)容時(shí)的性能。在這種配置中,通常將這些反向代理稱為服務(wù)器加速。
轉(zhuǎn)碼器
代理服務(wù)器在將內(nèi)容發(fā)送給客戶端之前,修改內(nèi)容的主體格式,這種對(duì)數(shù)據(jù)格式進(jìn)行修改的方式就被稱為轉(zhuǎn)碼。
轉(zhuǎn)碼代理可以在傳輸 GIF 圖片時(shí),將其轉(zhuǎn)換為 JPEG 圖片,用于減小圖片的傳輸大小,也可以對(duì)其進(jìn)行壓縮等。
匿名者
匿名者顧名思義就是代理服務(wù)器隱藏客戶端特征,匿名者代理會(huì)從 HTTP 報(bào)文中刪除身份特征,比如客戶端的 IP 地址、From 首部、Referer 首部、cookie、URI 的會(huì)話 ID,提高私密性和安全性。
代理其實(shí)也像 DNS 一樣,具有層次結(jié)構(gòu),只不過(guò) DNS 層次結(jié)構(gòu)中上下級(jí)之間都是 DNS 服務(wù)器,而代理層次結(jié)構(gòu)把上下級(jí)都換成了代理服務(wù)器。
代理的層次結(jié)構(gòu)
在代理的層次結(jié)構(gòu)中,會(huì)將報(bào)文在代理之間傳遞,一直傳遞到最終的服務(wù)器,然后再將響應(yīng)報(bào)文通過(guò)代理傳回給客戶端,例如下圖是一個(gè)反向代理的層次結(jié)構(gòu)。
代理層次結(jié)構(gòu)中的代理服務(wù)器被賦予了父和子的關(guān)系,靠近服務(wù)器的被稱為父代理,靠近客戶端的被稱為子代理。
這是一種靜態(tài)的代理層次結(jié)構(gòu),靜態(tài)意味著這個(gè)在這個(gè)層次結(jié)構(gòu)中,代理 1 總是會(huì)將報(bào)文轉(zhuǎn)發(fā)給代理 2 ,而代理 2 總是會(huì)將報(bào)文轉(zhuǎn)發(fā)給代理 3。
但是,代理的層次結(jié)構(gòu)卻不一定非得是靜態(tài)的,這也就是說(shuō),在代理層次結(jié)構(gòu)中,父代理和子代理都是可以改變的,下面是幾個(gè)可以動(dòng)態(tài)選擇代理的方式:
- 負(fù)載均衡:子代理可以根據(jù)當(dāng)前父代理的工作負(fù)載級(jí)別來(lái)選擇父代理。
- 地理位置鄰近選擇:當(dāng)然也可以根據(jù)地理位置的臨近情況來(lái)選擇父代理。
- 根據(jù)協(xié)議和類型來(lái)選擇:子代理會(huì)根據(jù) URI 將報(bào)文轉(zhuǎn)發(fā)到不同的父代理或者原始服務(wù)器上去。
客戶端的代理設(shè)置
客戶端的代理設(shè)置主要有下面四種:
- 手動(dòng)設(shè)置
- 預(yù)先配置瀏覽器代理,瀏覽器廠商會(huì)在客戶端獲取瀏覽器之前預(yù)先對(duì)代理進(jìn)行配置
- 自動(dòng)配置代理,通過(guò)提供一個(gè) URI,指向一個(gè)用 JS 寫(xiě)的代理自動(dòng)配置文件;客戶端會(huì)取回這個(gè) JS 文件,并運(yùn)行它以決定是否應(yīng)該使用代理
- WPAD 代理發(fā)現(xiàn),有些瀏覽器支持 WPAD 代理自動(dòng)發(fā)現(xiàn)協(xié)議,這個(gè)協(xié)議會(huì)自動(dòng)檢測(cè)出瀏覽器可以從哪個(gè)配置服務(wù)器下載到一個(gè)自動(dòng)配置文件。
總結(jié)
這篇文章內(nèi)容不是很多,而且也不是很復(fù)雜,適合當(dāng)?shù)罔F或者飯后讀物,五分鐘大概就能吸收文章中的內(nèi)容。
本文轉(zhuǎn)載自微信公眾號(hào)「程序員cxuan」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員cxuan公眾號(hào)。