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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論