一個(gè)實(shí)用的HTTP代理程序設(shè)計(jì)與實(shí)現(xiàn).doc_第1頁
一個(gè)實(shí)用的HTTP代理程序設(shè)計(jì)與實(shí)現(xiàn).doc_第2頁
一個(gè)實(shí)用的HTTP代理程序設(shè)計(jì)與實(shí)現(xiàn).doc_第3頁
一個(gè)實(shí)用的HTTP代理程序設(shè)計(jì)與實(shí)現(xiàn).doc_第4頁
一個(gè)實(shí)用的HTTP代理程序設(shè)計(jì)與實(shí)現(xiàn).doc_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系網(wǎng)站刪除一個(gè)實(shí)用的HTTP代理程序設(shè)計(jì)與實(shí)現(xiàn)摘要:本文介紹了HTTP代理服務(wù)器基本工作原理、代理服務(wù)器的總體設(shè)計(jì)框架和其中采用的用以提高性能的關(guān)健技術(shù)、進(jìn)程池技術(shù)和緩存機(jī)制以及核心模塊的具體實(shí)現(xiàn)流程,最后提出了一種實(shí)用的HTTP代理服務(wù)器的設(shè)計(jì)方案。關(guān)鍵詞:代理服務(wù)器; 進(jìn)程池; 緩存機(jī)制Abstract:The design and implementation of HTTP proxy server with high performance are described. First, the basic mechanism of HTTP proxy server is introduced and then, the whole framework of proxy server and the key techniques process pool and cache technique are presented which are adopted to improve performance. Finally, the implementations of core modules are given.Key words: proxy server; process pool; cache mechanism目錄第一章 前言2第二章 HTTP原理與代理模型的設(shè)計(jì)32.1 HTTP協(xié)議32.2 HTTP代理模型42.3 模型的實(shí)現(xiàn)42.4 優(yōu)化的代理技術(shù)72.4.1 身份認(rèn)證72.4.2 Cache技術(shù)8第三章 總體設(shè)計(jì)103.1框架結(jié)構(gòu)103.2關(guān)鍵技術(shù)113.2.1進(jìn)程池管理113.2.2緩存管理12第四章 核心模塊的實(shí)現(xiàn)144.1主守護(hù)進(jìn)程的實(shí)現(xiàn)144.2代理服務(wù)模塊的實(shí)現(xiàn)154.3緩存管理進(jìn)程的實(shí)現(xiàn)17結(jié)語18參考文獻(xiàn):18第一章 前言隨著Internet與Intranet的飛速發(fā)展,作為連接Internet與Intranet的的橋梁,代理服務(wù)器在實(shí)際應(yīng)用中發(fā)揮著極其重要的作用。代理服務(wù)器(Proxy)是網(wǎng)絡(luò)信息的中轉(zhuǎn)站。一般情況下,使用網(wǎng)絡(luò)瀏覽器直接去鏈接其它Internet站點(diǎn)并取得網(wǎng)絡(luò)信息時(shí),須送出請(qǐng)求信寫來得到應(yīng)答,然后對(duì)方再把信息傳送回來。代理服務(wù)器是介于瀏覽器和Web服務(wù)器之間的一臺(tái)服務(wù)器,有了它之后,瀏覽器不是直接到Web服務(wù)器去取回網(wǎng)頁而是向代理服務(wù)器發(fā)出請(qǐng)求,請(qǐng)求信寫會(huì)先送到代理服務(wù)器,由代理服務(wù)器來取回瀏覽器所需要的信息并傳送給你的瀏覽器。而且,大部分代理服務(wù)器都具有緩沖的功能,就好像一個(gè)大的Cache,它不斷將新取得數(shù)據(jù)包存到它本機(jī)的存儲(chǔ)器上,如果瀏覽器所請(qǐng)求的數(shù)據(jù)在它本機(jī)的存儲(chǔ)器上己經(jīng)存在而且是最新的,那么它就不重新從Web服務(wù)器取數(shù)據(jù),而直接將存儲(chǔ)器上的數(shù)據(jù)傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。代理服務(wù)器不僅可以實(shí)現(xiàn)提高瀏覽速度和效率的功能,它還可以實(shí)現(xiàn)網(wǎng)絡(luò)的安全過濾、流量控制(減少Internet使用費(fèi)用)、用戶管理等功能,因此它既是一種網(wǎng)絡(luò)防火墻技術(shù),同時(shí)也可以解決許多單位連接Internet引起IP地址不足的問題。將代理服務(wù)器的這些功能應(yīng)用在多媒體教室中,可以方便地實(shí)現(xiàn)教師機(jī)對(duì)學(xué)生機(jī)的管理,下面就介紹一下該代理模型的設(shè)計(jì)與實(shí)現(xiàn)。第二章 HTTP原理與代理模型的設(shè)計(jì)2.1 HTTP協(xié)議HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡(jiǎn)捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。當(dāng)客戶端請(qǐng)求一個(gè)Web頁面時(shí),它首先與服務(wù)器建立連接,連接成功后,它要將所請(qǐng)求的頁面,所用的協(xié)議及版木,語言及版木,所能接受的MIME類型,編碼類型以及連接狀況等一些本地信息參數(shù)等交給服務(wù)器,Web服務(wù)器收到請(qǐng)求后,發(fā)回所交送頁面的的信息的響應(yīng)頭信息,然后再發(fā)送頁面內(nèi)容信息,最后,雙方斷開連接。HTTP的早期版木為HTTP/0.9,1982年,Tim Berners-Lee提出了HTTP/1.0, 1997年形成HTTP/ 1.1,也就是現(xiàn)在普遍使用的協(xié)議。HTTP/ 1.1在持續(xù)連接操作機(jī)制中實(shí)現(xiàn)流水方式,即客戶端需要對(duì)同一服務(wù)器發(fā)出多個(gè)請(qǐng)求時(shí),其請(qǐng)求的多數(shù)的Web頁面都是由多部分組成(比如多張圖片,聲音),可用流水線方式加快速度。流水機(jī)制就是指在客戶機(jī)請(qǐng)求到Web頁面時(shí),搜索其中的圖像鏈接和聲音鏈接,然后再請(qǐng)求這些頁面,即連續(xù)發(fā)出多個(gè)請(qǐng)求并等到這些請(qǐng)求發(fā)送完畢,再等待響應(yīng)。這樣就大大節(jié)省了單獨(dú)請(qǐng)求對(duì)響應(yīng)的等待時(shí)間,使人們得到更快速的瀏覽。而且HTTP-NG (Next Generation of HTTP)的建議己經(jīng)提出。2.2 HTTP代理模型根據(jù)HTTP協(xié)議規(guī)定,當(dāng)客戶端使用代理模式時(shí),發(fā)送的請(qǐng)求命令格式如下: method http: /hostname/path/filename 例如:GET http: /.cm/。當(dāng)客戶端同網(wǎng)絡(luò)代理服務(wù)系統(tǒng)建立連接后,代理服務(wù)器將收到請(qǐng)求命令,這時(shí)代理服務(wù)器應(yīng)該截取主機(jī)名部分進(jìn)行域名解析,并同該主機(jī)建立連接,將去掉主機(jī)名部分的請(qǐng)求命令轉(zhuǎn)發(fā)給它,等待它做出響應(yīng),然后將得到的響應(yīng)轉(zhuǎn)發(fā)給客戶端,最后斷開連接。其模型如圖2-1所示。圖2-1 帶有Cache數(shù)據(jù)庫的HTTP協(xié)議代理模型 注:客戶連接代理服務(wù)器,并發(fā)出客戶請(qǐng)求: 在本地 Cache中無此資源時(shí),連接到Internet; 從Internet上獲得所請(qǐng)求的資源: 將客戶所請(qǐng)求的資源發(fā)送給客戶: *代理服務(wù)系統(tǒng)檢索 Cache 數(shù)據(jù)庫: *如果客戶請(qǐng)求的資源在數(shù)據(jù)庫中,這直接將請(qǐng)求的資源發(fā)給代理服務(wù)器:2.3 模型的實(shí)現(xiàn) 由于HTTP代理是典型的C/S模式,所以至少需要兩個(gè)Socket(套接字)來實(shí)現(xiàn)客戶與Web服務(wù)器的連接。結(jié)合在多媒體教室巾的應(yīng)用,具體過程如下: (1)代理服務(wù)器監(jiān)聽客戶端的連接請(qǐng)求; (2)客戶端連接到代理服務(wù)器,發(fā)送請(qǐng)求信息; (3)代理服務(wù)器解析客戶端的發(fā)送過來的數(shù)據(jù),確定服務(wù)類型(HTTP),服務(wù)器地址和端口號(hào),確定是否是合法的IP和URL,確定是否在木地Cache庫巾,是,則重定向,不是,則執(zhí)行(4); (4)代理服務(wù)器連接遠(yuǎn)程Web服務(wù)器; (5)循環(huán)啟動(dòng)線程Server,該線程負(fù)責(zé)客戶端,代理服務(wù)器和遠(yuǎn)程Web服務(wù)器之間數(shù)據(jù)的交互,交互完畢結(jié)束線程; (6)關(guān)閉server field Socket(服務(wù)器端套接字),斷開代理與web服務(wù)器的連接; (7)關(guān)閉client_ field Socket(客戶端套接字),斷開客戶端與代理服務(wù)器的連接;其實(shí)現(xiàn)系統(tǒng)流程圖如2所示。圖2-2 HTTP代理服務(wù)器系統(tǒng)實(shí)現(xiàn)流程圖在系統(tǒng)設(shè)計(jì)中,為客戶端和服務(wù)器各建一個(gè)Socket套接字client_ field和server_ field以來實(shí)現(xiàn)客戶和Web服務(wù)器的連接。由于在該代理系統(tǒng)操作中是要求用戶主機(jī)和遠(yuǎn)端主機(jī)雙向通信的,這樣就要求對(duì)兩個(gè)套接字描述符既能夠讀也能夠?qū)憽H绻捎玫氖亲枞鸌/0的話,很有可能長(zhǎng)時(shí)間阻塞在一個(gè)描述符上。因此設(shè)計(jì)時(shí)在處理這個(gè)問題的時(shí)候調(diào)用了select()函數(shù),這個(gè)函數(shù)允許執(zhí)行I/O多路轉(zhuǎn)接。其具體含義就是select()函數(shù)可以構(gòu)造一個(gè)表,在這個(gè)表中包含了所有要用到的文件描述符。然后可以調(diào)用一個(gè)函數(shù),這個(gè)函數(shù)可以檢測(cè)這些文件描述符的狀態(tài),當(dāng)某個(gè)指定的)文件描述符準(zhǔn)各好進(jìn)行I/O操作時(shí),此函數(shù)就返回,告知進(jìn)程哪個(gè)文件描述符己經(jīng)可以執(zhí)行I/O操作了。這樣就避免了長(zhǎng)時(shí)間的阻塞。 在調(diào)用select()函數(shù)實(shí)現(xiàn)多路I/O轉(zhuǎn)接時(shí),首先要聲明一個(gè)新的文件描述符集: Fd - set rdfdset; 然后調(diào)用FD- ZERO ()清空此文件描述符集的所有位,以免下面檢測(cè)描述符位的時(shí)候返回錯(cuò)誤結(jié)果: FD_ ZERO ( &rdfdset); 然后調(diào)用FD_ SET( )在文件描述符集中設(shè)置所關(guān)心的位。在該系統(tǒng)中,關(guān)心的就是分別與用戶主機(jī)和遠(yuǎn)端主機(jī)連接的兩個(gè)套接字描述符,所以執(zhí)行這樣的語句: FD_ SET (client_ field , &rdfdset) ; FD_SET (server_ f ield ,&rdfdset) ; 然后調(diào)用select()返回描述符狀態(tài),此時(shí)描述符狀態(tài)被存儲(chǔ)進(jìn)描述符集,也就是fd _ set數(shù)據(jù)結(jié)構(gòu)中。 在該系統(tǒng)中,只關(guān)心兩個(gè)套接字描述符是否可讀,因此執(zhí)行這樣的select ()函數(shù): Select (FD_ SETSIZE, &rdfdset, NULL, NULL ,NULL) 那么在select ()返回后調(diào)用函數(shù)FD_ ISSET ()如果對(duì)應(yīng)文件描述符的狀態(tài)為“己準(zhǔn)備好”(即描述符位為“1),則FD IS-SET 0返回1,否則返回0。 下面一段代碼就實(shí)現(xiàn)從套接字client_ field用戶主機(jī))到套接字server_ field (遠(yuǎn)端主機(jī))的無阻塞傳輸。 Char buf 1024: int iolcn -0: if (FD_ ISSET( client_ field. &rdfdset) if ( Iolen =read (client_ field, buff ,sizeof (buf)=0) break : /長(zhǎng)度為0意味著連接中斷 write 9Server_ field. buf. iolen ): /緩沖區(qū)的內(nèi)容發(fā)送至服務(wù)器端 而這一段代碼則實(shí)現(xiàn)了反方向的無阻塞傳輸:if (FD_ ISSET( Server _field, &rdfdset) if (iolen =read( Server_ field, buf, sizeof buf ) ) )=0) break;write( client field, buf, iolen );/緩沖區(qū)內(nèi)容發(fā)送至客戶端 這樣就通過代理服務(wù)器實(shí)現(xiàn)了用戶主機(jī)與遠(yuǎn)端主機(jī)之間的通信。將該代理系統(tǒng)應(yīng)用到多媒體教室中,學(xué)生機(jī)就相當(dāng)于一個(gè)個(gè)客戶機(jī),教師機(jī)就相當(dāng)于代理服務(wù)器。當(dāng)學(xué)生機(jī)發(fā)送請(qǐng)求時(shí),教師機(jī)首先看其IP地址是否有權(quán)限訪問Internet(學(xué)生機(jī)的IP權(quán)限可事先由教師設(shè)定),然后再看其請(qǐng)求的URL是否合法(不合法的URL事先存儲(chǔ)在數(shù)據(jù)庫中),如果是,再看其請(qǐng)求的URL是否在Cache庫中,若在并且沒有到達(dá)更新期限,則從硬盤中讀出并顯示在客戶端;否則,連接到遠(yuǎn)程Web服務(wù)器并緩存相應(yīng)的數(shù)據(jù)或更新Cache庫。這樣,不僅提高了學(xué)生上網(wǎng)的速度,節(jié)約了帶寬,而且,也提高了系統(tǒng)的安全性,方便了教師對(duì)學(xué)生的管理。2.4 優(yōu)化的代理技術(shù)為了提高WWW的訪問的速度,也同時(shí)加強(qiáng)代理服務(wù)器的用戶管理,在系統(tǒng)設(shè)計(jì)過程中,采用了Proxy Cache緩沖技術(shù)和用戶身份認(rèn)證技術(shù),提高系統(tǒng)訪問及管理的有效性和高效性 身份認(rèn)證為了簡(jiǎn)化客戶端的應(yīng)用軟件,本系統(tǒng)在不增加客戶端任何軟件或?qū)ζ湎到y(tǒng)進(jìn)行改變的情況下,對(duì)客戶的身份進(jìn)行認(rèn)證.即采用主機(jī)名/IP地址識(shí)別法來確認(rèn)用戶的有效性。利用TCP/IP協(xié)議進(jìn)行通訊時(shí),無論是何種應(yīng)用協(xié)議,在傳輸層都轉(zhuǎn)化成SOCKET進(jìn)行聯(lián)接,兩個(gè)SOCKET之間利用五元組來實(shí)現(xiàn)聯(lián)接和通訊。SOCKET五元組標(biāo)識(shí)如下:協(xié)議 源IP地址 源端口號(hào) 目的地址 目的端口號(hào)在代理服務(wù)程序進(jìn)入監(jiān)聽狀態(tài)后,在Listen()等待客戶的聯(lián)接請(qǐng)求,一旦有請(qǐng)求,則觸發(fā)FD-ACCEPT事件,在OnAccept事件處理函數(shù)中即可驗(yàn)證客戶信息.實(shí)現(xiàn)主要過程如下:SOCKET socket;sockaddr-in m-ClientSocket;socket.SockId=accept(ListenSocket, (struct socketaddr-in)&socket.addr, &sizeof(m-ClientSocket)if(socket.SockId=INAVLID-SOCKET)return false;CString IpAddr = inet-ntoa(socket.addr.sin-addr);將網(wǎng)絡(luò)IP轉(zhuǎn)化為點(diǎn)分格式串if(IpAddr不滿足條件)判斷IP地址是否滿足條件return false;2.4.2 Cache技術(shù) Cache技術(shù)對(duì)于提高WWW的訪問速度,減少請(qǐng)求的響應(yīng)時(shí)間和服務(wù)器的負(fù)載,有著很重要的意義。 隨著WWW的普及程度越來越高,訪問Internet的用戶也越來越多,由此而導(dǎo)致Internet的阻塞,這對(duì)HTTP請(qǐng)求的阻塞尤為明顯。近來的研究數(shù)據(jù)表明,在所有導(dǎo)致Internet阻塞的原因中,由于HTTP請(qǐng)求引起的占了75-80% 。 HTTP代理緩沖的目的就在于減少網(wǎng)絡(luò)傳輸開銷和提高傳輸速度。另外,也可以節(jié)省上網(wǎng)費(fèi)用。 代理服務(wù)器的Cache通過保存代理的URL摘要(key)來減少請(qǐng)求次數(shù)。當(dāng)有新的請(qǐng)求時(shí),首先檢查本身的緩存摘要,如果其摘要里有文檔信息,則向代理緩存器請(qǐng)求己取得文檔,如果沒有,則直接向Web服務(wù)器發(fā)送請(qǐng)求。摘要必需周期的刷新。當(dāng)客戶與代理服務(wù)器連接后,所提交的請(qǐng)求主要有4種:GET,HEAD,PUT,POST。其中,GET和HEAD請(qǐng)求是最多的也是最頻繁的,大約占90%以上。PUT和POST請(qǐng)求要向遠(yuǎn)程服務(wù)器提交數(shù)據(jù),而且POST請(qǐng)求還要啟動(dòng)CGI應(yīng)用程序,因此利用緩沖區(qū)的意義不大。在該系統(tǒng)中,只對(duì)GET請(qǐng)求作緩沖處理,其他的請(qǐng)求則直接由代理服務(wù)器發(fā)送給遠(yuǎn)程服務(wù)器。用于代理服務(wù)器的Cache一般比較龐大。在一個(gè)過大的Cache文件表中,查找某一個(gè)文件,將消耗系統(tǒng)資源,降低系統(tǒng)性能。所以,如何合適的存儲(chǔ)和檢索摘要己達(dá)到快速的定位文件,以提高系統(tǒng)的性能,是Cache技術(shù)的核心。對(duì)此,國內(nèi)外有好多相關(guān)的算法來實(shí)現(xiàn)該項(xiàng)技術(shù)。在該系統(tǒng)中,采用文本緩沖的存儲(chǔ)方式。代理服務(wù)器利用緩沖區(qū)頭數(shù)據(jù)結(jié)構(gòu)來管理存在硬盤上的Web頁面。緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)如下:Struct buffer- Webint index;/ 請(qǐng)求的索引值int num;/訪問的次數(shù)char* url ; /請(qǐng)求的url值char szPath MAX_ PATH;/存儲(chǔ)在硬盤上的路徑char szExpire 20:;/請(qǐng)求文檔過期日期串SYSTEMTIME szTime; /存入硬盤上的時(shí)間struct Buffer Web* pNext; /指向下一個(gè)節(jié)點(diǎn)*lpbuffer_ Web, buffer _ Web;結(jié)構(gòu)buffer_Web標(biāo)識(shí)了一個(gè)Web頁面在本地緩沖區(qū)的物理地址,文檔的失效口期串以及存入緩沖區(qū)的時(shí)間等。為了提高系統(tǒng)的效率,采用HASH散列算法散列客戶請(qǐng)求的URL,不同的索引值對(duì)應(yīng)不同的HASH鏈表,代理服務(wù)器維護(hù)著由這個(gè)結(jié)構(gòu)組成的多個(gè)HASH鏈表,并不斷更新這些鏈表。szExpire只是在HTTP進(jìn)行請(qǐng)求Web遠(yuǎn)程服務(wù)器后,作為響應(yīng)傳回來的。當(dāng)表中的szExpire超出規(guī)定范圍時(shí),代理服務(wù)器刪除此buffer_ Web節(jié)點(diǎn)。在代理服務(wù)器接收到一個(gè)GET請(qǐng)求后,解析出服務(wù)器名與路徑和文件,通過服務(wù)器名求出索引,然后在該索引值所對(duì)應(yīng)的鏈表中查詢是否有此URL如果有,則通過buffer_ Web結(jié)構(gòu)中的元素szPath去定位文件。如果請(qǐng)求得網(wǎng)頁己過期或不存在,則需要重新向遠(yuǎn)程的Web服務(wù)器請(qǐng)求后交給客戶端并更新本地緩沖區(qū)。代理服務(wù)器的緩沖區(qū)是不斷更新的。當(dāng)客戶端所請(qǐng)求的在代理緩沖區(qū)的頁面己經(jīng)過期時(shí),代理服務(wù)器必須向Web服務(wù)器請(qǐng)求相關(guān)的新的信息。而且,在將新的信息送到客戶端的同時(shí),刷新緩沖區(qū),并刷新相應(yīng)的參數(shù)(szTime,szExpire),確保保存的頁面是最新的。由LRU算法可知,對(duì)于一些更新周期很慢的頁面以SZTime和num作為衡量標(biāo)準(zhǔn)),說明該頁面訪問次數(shù)較少,因此需要進(jìn)行清理。緩沖區(qū)不是無限大的,因此,在代理服務(wù)器啟動(dòng)、退出、定時(shí)或空閑時(shí)的時(shí)間內(nèi),代理服務(wù)器要對(duì)緩沖區(qū)進(jìn)行清理,去掉一些失效的頁面。第三章 總體設(shè)計(jì)3.1框架結(jié)構(gòu)整個(gè)代理服務(wù)系統(tǒng)主要由3個(gè)模塊組成:主守護(hù)進(jìn)程模塊、代理服務(wù)模塊和緩存管理模塊。主守護(hù)進(jìn)程模塊:負(fù)責(zé)代理服務(wù)器的初始化,監(jiān)聽提供HTTP代理服務(wù)的端口,啟動(dòng)一定數(shù)量的代理服務(wù)子進(jìn)程并對(duì)進(jìn)程池進(jìn)行管理;代理服務(wù)模塊:負(fù)責(zé)處理客戶端的請(qǐng)求,提供代理服務(wù);緩存管理模塊:負(fù)責(zé)提供對(duì)緩存的快速查詢、添加和刪除等維護(hù)操作。如圖3-1所示。圖3-1 框架結(jié)構(gòu)在這個(gè)設(shè)計(jì)框架中,采用了進(jìn)程池技術(shù)和緩存機(jī)制兩個(gè)關(guān)鍵技術(shù),下面將詳細(xì)闡述。3.2關(guān)鍵技術(shù)3.2.1進(jìn)程池管理普通的代理服務(wù)器是這樣工作的:主進(jìn)程在某個(gè)綁定的端口上監(jiān)聽,一旦有客戶請(qǐng)求到達(dá),就通過fork ()系統(tǒng)調(diào)用創(chuàng)建一個(gè)子進(jìn)程,而主進(jìn)程則繼續(xù)監(jiān)聽,由該子進(jìn)程完成對(duì)客戶請(qǐng)求的代理服務(wù),服務(wù)完成后子進(jìn)程自動(dòng)終止。這種代理服務(wù)器有一個(gè)明顯的缺點(diǎn),由于fork()系統(tǒng)誦用需花費(fèi)較多的cpu時(shí)間,這樣當(dāng)客戶比較多時(shí),主進(jìn)程就疲于創(chuàng)建子進(jìn)程,代理服務(wù)器對(duì)客戶的響應(yīng)速度就會(huì)相慢。為了盡可能加快連接的響應(yīng)速度,采用了預(yù)先派生子進(jìn)程的方法。主守護(hù)進(jìn)程啟動(dòng)后,先創(chuàng)建監(jiān)聽套接字,并對(duì)該套接字調(diào)用listen(),然后派生一組子進(jìn)程,形成進(jìn)程池。各個(gè)子進(jìn)程會(huì)復(fù)制主進(jìn)程的描述符字。子進(jìn)程啟動(dòng)后對(duì)從主進(jìn)程繼承而來的套接字描述符調(diào)用accepts,沒有客戶請(qǐng)求時(shí),所有子進(jìn)程都進(jìn)入睡眠,當(dāng)一個(gè)客戶請(qǐng)求來到時(shí),所有子.進(jìn)程被內(nèi)核同時(shí)喚醒,但只有最先被調(diào)度的子進(jìn)程才能獲得與客戶的連接,而其它的子進(jìn)程再次進(jìn)入睡眠。 因?yàn)橐粋€(gè)請(qǐng)求的到來喚醒了所有的子進(jìn)程,而最后只有一個(gè)子進(jìn)程被調(diào)用,這種現(xiàn)象叫做驚群現(xiàn)象(thundering herd),雖然這樣工作可行,但對(duì)系統(tǒng)性能的影響是顯著的。由于同時(shí)醒來的進(jìn)程過多,內(nèi)核在進(jìn)程調(diào)度上會(huì)花費(fèi)更多的時(shí)間。解決的辦法是在調(diào)用accept前后設(shè)置某種形式的鎖,如信號(hào)量鎖或文件鎖,這樣就只有一個(gè)accept阻塞在套接字描述符上了。對(duì)進(jìn)程池中進(jìn)程的數(shù)量也需要管理,如果進(jìn)程池中空閑進(jìn)程太多,則浪費(fèi)系統(tǒng)資源;空閑進(jìn)程太少,就會(huì)因?yàn)榭蛻暨B接的突發(fā)增加而使池中的子進(jìn)程耗盡需要?jiǎng)?chuàng)建子進(jìn)程,從而影響響應(yīng)速度。主守護(hù)進(jìn)程除了負(fù)責(zé)創(chuàng)建進(jìn)程池,還負(fù)責(zé)對(duì)進(jìn)程池的管理。它定時(shí)檢查進(jìn)程池中空閑進(jìn)程數(shù),當(dāng)空閑進(jìn)程數(shù)低于某一閩值時(shí),則派生額外的子進(jìn)程;當(dāng)空閑進(jìn)程數(shù)大于某一閩值時(shí),則終止部分派生的子進(jìn)程。主守護(hù)進(jìn)程與進(jìn)程池的通訊可采用共享內(nèi)存方式。在共享內(nèi)存中存入一個(gè)數(shù)組,數(shù)組的每一項(xiàng)對(duì)應(yīng)進(jìn)程池中一個(gè)子進(jìn)程,記錄該子進(jìn)程的狀態(tài)。每個(gè)子進(jìn)程有3個(gè)狀態(tài)(EMPTY、IDL、BUSY) 。EMPTY表示該位的子進(jìn)程沒有創(chuàng)建,IDL表示該位的子進(jìn)程處于空閑,BUSY表示該位的子進(jìn)程正在處理客戶請(qǐng)求。進(jìn)程池中的子進(jìn)程向共享內(nèi)存?zhèn)鬟f自己的狀態(tài)信息(EMPTY。IDL。BUSY),主守護(hù)進(jìn)程便可通過共享內(nèi)存檢測(cè)到各個(gè)進(jìn)程的狀態(tài)。對(duì)共享內(nèi)存的操作要加鎖(可采用文件鎖)。另外,在處理客戶請(qǐng)求過程中涉及到許多內(nèi)存申請(qǐng)釋放操作。為避免內(nèi)存泄漏問題,子進(jìn)程每處理一定數(shù)量的連接,就自殺掉。3.2.2緩存管理緩存是代理服務(wù)器用于保存遠(yuǎn)端服務(wù)器的網(wǎng)頁,以便客戶端能夠直接從緩存中讀取,加快響應(yīng)速度。如果緩存中的網(wǎng)頁過期或不存在,則由代理服務(wù)器重新下載,再轉(zhuǎn)發(fā)給客戶端。采用緩存機(jī)制能夠有效地降低Internet的信息流量,提高用戶的訪問速率。緩存中的網(wǎng)頁是以文件的形式存儲(chǔ)的,筆者首先定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)記錄每個(gè)文件的信息。該結(jié)構(gòu)定義如下:對(duì)應(yīng)每個(gè)URL存儲(chǔ)了映射的文件名、網(wǎng)頁的過期時(shí)間、最近訪問時(shí)間、最后修改時(shí)間以及文件大小等信息。記錄最近訪問時(shí)間是為了對(duì)緩存實(shí)行LRU (least-recently-used)替換策略,即當(dāng)緩存的剩余空間小于一定闡值時(shí),要替換掉一部分最近一直沒有被訪問的文件。為了快速定位與某個(gè)URL對(duì)應(yīng)的文件、高效地查詢文件的相關(guān)信息以及方便地實(shí)行緩存替換策略,筆者設(shè)計(jì)了HASH鏈表結(jié)構(gòu)和按時(shí)間排序的雙向鏈表結(jié)構(gòu)。設(shè)計(jì)HASH鏈表結(jié)構(gòu)是為了快速查詢與URL對(duì)應(yīng)的文件的信息,具體實(shí)現(xiàn)是定義一個(gè)數(shù)組,數(shù)組的每一項(xiàng)指向上面定義的文件信息結(jié)構(gòu)struct webfile_digest。當(dāng)查詢網(wǎng)頁文件時(shí),先將URL做HASH處理,HASH的結(jié)果即為數(shù)組的下標(biāo),然后查找該項(xiàng)數(shù)組指向的鏈表,查找是否有與URL匹配的結(jié)構(gòu)。設(shè)計(jì)時(shí)間雙向鏈表結(jié)構(gòu)是為了方便實(shí)現(xiàn)LRU的緩存替換策略。該鏈表是以文件的最近訪問時(shí)間排序,采用雙向鏈表是為了便于快速插入和刪除。具體結(jié)構(gòu)即上面定義的文件信息結(jié)構(gòu)struct webfile_digest。也就是說,HASH鏈表結(jié)構(gòu)與時(shí)間雙向鏈表結(jié)構(gòu)共享同一數(shù)據(jù)結(jié)構(gòu)。HASH鏈表結(jié)構(gòu)和時(shí)間雙向鏈表結(jié)構(gòu)以及緩存替換策略由緩存管理進(jìn)程實(shí)現(xiàn)和維護(hù)。代理服務(wù)進(jìn)程要與緩存管理進(jìn)程通訊,進(jìn)行緩存的查詢和更新等操作。通訊方式可采用消息隊(duì)列機(jī)制。第四章 核心模塊的實(shí)現(xiàn)4.1主守護(hù)進(jìn)程的實(shí)現(xiàn)主守護(hù)進(jìn)程負(fù)責(zé)代理服務(wù)器的初始化、監(jiān)聽端口、啟動(dòng)一定數(shù)量的代理服務(wù)子進(jìn)程并對(duì)進(jìn)程池進(jìn)行管理,實(shí)現(xiàn)流程如下:首先將進(jìn)程初始化為守護(hù)進(jìn)程,守互進(jìn)程的特點(diǎn)是,在后臺(tái)運(yùn)行,沒有與之相關(guān)聯(lián)的終端;建立socket套接字,綁定ip地址和端口,并監(jiān)聽代理服務(wù)端口;建立共享內(nèi)存和文件鎖,申請(qǐng)一塊共享內(nèi)存,大小為最大進(jìn)程數(shù),每個(gè)字節(jié)代表相應(yīng)進(jìn)程的狀態(tài),將共享內(nèi)存中每個(gè)狀態(tài)初始化為EMPTY;啟動(dòng)進(jìn)程池,啟動(dòng)一定數(shù)量的子進(jìn)程,并在共享內(nèi)存中對(duì)應(yīng)位置存入IDLE狀態(tài);定時(shí)檢查進(jìn)程池中空閑進(jìn)程數(shù),當(dāng)空閑進(jìn)程數(shù)低于某一閡值時(shí),則派生額外的子進(jìn)程;當(dāng)空閑進(jìn)程數(shù)大于某一閩值時(shí),則終止部分派生的子進(jìn)程。4.2代理服務(wù)模塊的實(shí)現(xiàn)代理服務(wù)模塊負(fù)責(zé)處理客戶端的請(qǐng)求,提供代理服務(wù)。每個(gè)代理服務(wù)子進(jìn)程的流程如下:初始化連接數(shù)cone=0:進(jìn)入循環(huán)體;調(diào)用accept ()接收連接,要對(duì)系統(tǒng)調(diào)用accept()加鎖,解決驚群?jiǎn)栴};向共享內(nèi)存對(duì)應(yīng)位置傳遞BUSY狀態(tài):讀取客戶請(qǐng)求,解析請(qǐng)求并進(jìn)行相應(yīng)處理(具體處理細(xì)節(jié)如圖2所示);將連接數(shù)遞增conn+,檢查處理的連接數(shù)是否到達(dá)最大數(shù)。如果已經(jīng)到達(dá),則向共享內(nèi)存對(duì)應(yīng)位置傳遞EMPTY狀態(tài)并退出程序;否則向共享內(nèi)存對(duì)應(yīng)位置傳遞IDLE狀態(tài),再進(jìn)入。對(duì)客戶請(qǐng)求的解析處理,采用流程圖的形式表示,如圖4-所示。圖4- 客戶請(qǐng)求處理流程圖代理服務(wù)子進(jìn)程在接收到客戶的請(qǐng)求后,首先判斷該請(qǐng)求是否可從緩存讀取,判斷的根據(jù)是如果請(qǐng)求的類型是GET,且請(qǐng)求頭中不含用來表示不可緩存的Cache-Control:no-cache或pragma: no-cache字段,則可以從緩存讀取;否則直接連接遠(yuǎn)端服務(wù)器,獲取響應(yīng)后直接轉(zhuǎn)發(fā)給客戶端。如果可以從緩存讀取,則開始查詢緩存文件。根據(jù)查詢結(jié)果做不同的處理。查詢結(jié)果分為兩種情況。一種情況是查到該緩存文件且文件沒有過期,此時(shí)判斷客戶的請(qǐng)求是否是條件請(qǐng)求,即客戶端詢問客戶機(jī)器上保存的文件是否己經(jīng)修改,如果是條件請(qǐng)求,則判斷文件的有效性,如果有效,則返回給客戶端304響應(yīng),告訴客戶端客戶機(jī)器上保存文件依舊有效:若無效則讀取緩存文件返回給客戶;如果客戶請(qǐng)求不是條件請(qǐng)求,則可以直接讀取緩存文件返回給客戶端。另一種情況是沒有查到該緩存文件或查到的緩存文件已經(jīng)過期,此時(shí)也要判斷是否是條件請(qǐng)求,如果是條件請(qǐng)求,則連接遠(yuǎn)端服務(wù)器,轉(zhuǎn)發(fā)該請(qǐng)求,獲取響應(yīng)后,判斷該響應(yīng)是否是已更新的網(wǎng)頁,如果是,則判斷該網(wǎng)頁是否可以緩存(判斷依據(jù)是,如果響應(yīng)為200,且請(qǐng)求頭中不包含用來表示不可緩存的Cache-Control:no-cache或pragma:no-cache字段,則可以緩存,否則不可以),可以緩存則更新緩存并將結(jié)果返回給客戶端,不可以緩存則直接將結(jié)果返回給客戶端;如果獲得的響應(yīng)是其它結(jié)果則直接轉(zhuǎn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論