計算機(jī)網(wǎng)絡(luò)實驗1代理服務(wù)器-報告_第1頁
計算機(jī)網(wǎng)絡(luò)實驗1代理服務(wù)器-報告_第2頁
計算機(jī)網(wǎng)絡(luò)實驗1代理服務(wù)器-報告_第3頁
計算機(jī)網(wǎng)絡(luò)實驗1代理服務(wù)器-報告_第4頁
計算機(jī)網(wǎng)絡(luò)實驗1代理服務(wù)器-報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<<計算機(jī)網(wǎng)絡(luò)>>實驗報告 哈爾濱工業(yè)大學(xué)<<計算機(jī)網(wǎng)絡(luò)>>實驗報告(2016年度春季學(xué)期)姓名:呂西亞學(xué)號:1130310621學(xué)院:計算機(jī)科學(xué)與技術(shù)學(xué)院教師:劉曉烽實驗一 HTTP代理服務(wù)器的設(shè)計與實現(xiàn)一、 實驗?zāi)康氖煜げ⒄莆?Socket 網(wǎng)絡(luò)編程的過程與技術(shù);深入理解 HTTP 協(xié)議,掌握 HTTP 代理服務(wù)器的基本工作原理;掌握 HTTP 代理服務(wù)器設(shè)計與編程實現(xiàn)的基本技能。二、 實驗內(nèi)容(1) 設(shè)計并實現(xiàn)一個基本 HTTP 代理服務(wù)器。要求在指定端口接收來自客戶的 HTTP 請求并且根據(jù)其中的 URL 地址訪問該地址所指向的 HTTP

2、 服務(wù)器(原服務(wù)器),接收 HTTP 服務(wù)器的響應(yīng)報文,并將響應(yīng)報文轉(zhuǎn)發(fā)給對應(yīng)的客戶進(jìn)行瀏覽。 (2) 設(shè)計并實現(xiàn)一個支持 Cache 功能的 HTTP 代理服務(wù)器。要求能緩存原服務(wù)器響應(yīng)的對象,并能夠通過修改請求報文(添加 if-modified-since頭行),向原服務(wù)器確認(rèn)緩存對象是否是最新版本。(3) 擴(kuò)展 HTTP 代理服務(wù)器,支持如下功能: a) 網(wǎng)站過濾:允許/不允許訪問某些網(wǎng)站; b) 用戶過濾:支持/不支持某些用戶訪問外部網(wǎng)站; c) 網(wǎng)站引導(dǎo):將用戶對某個網(wǎng)站的訪問引導(dǎo)至一個模擬網(wǎng)站(釣魚網(wǎng)站)三、實驗過程及結(jié)果1、實驗原理(1) Socket 編程的客戶端和服務(wù)器端主要

3、步驟在TCP/IP網(wǎng)絡(luò)應(yīng)用中,通信的兩個進(jìn)程之間相互作用的主要模式是客戶/服務(wù)器(C/S或B/S)模式,即客戶向服務(wù)器發(fā)出請求,服務(wù)器接受到請求后,提供相應(yīng)的服務(wù)。兩者的工作步驟可以通過下面流程圖直觀地看到:服務(wù)器端:其過程是首先服務(wù)器方要先啟動,并根據(jù)請求提供相應(yīng)服務(wù):(1)打開一通信通道并告知本地主機(jī),它愿意在某一公認(rèn)地址上的某端口接收客戶請求;對應(yīng)的操作是申請一個socket,這時的socket稱為“歡迎套接字”,然后綁定(bind)本地地址信息和歡迎套接字,然后開放監(jiān)聽(listen)。(2)等待客戶請求到達(dá)該端口;(3)接收到客戶端的服務(wù)請求時,處理該請求并發(fā)送應(yīng)答信號。在TCP實現(xiàn)

4、過程中進(jìn)行了三次握手操作,但是實際編寫過程中通過accept函數(shù)即可實現(xiàn)上述操作,并建立連接,注意這個時候才真正建立起了與客戶機(jī)傳輸數(shù)據(jù)的套接字。接收到并發(fā)服務(wù)請求,要激活一新進(jìn)程來處理這個客戶請求。新進(jìn)程處理此客戶請求,并不需要對其它請求作出應(yīng)答。服務(wù)完成后,關(guān)閉此新進(jìn)程與客戶的通信鏈路,并終止。(4)返回第(2)步,等待另一客戶請求。(5)關(guān)閉服務(wù)器,對應(yīng)的也就是關(guān)閉服務(wù)器的歡迎套接字。客戶端:(1)打開一通信通道,即建立起要與服務(wù)器傳輸數(shù)據(jù)的套接字socket,通過connect連接到服務(wù)器所在主機(jī)的特定端口;(2)向服務(wù)器發(fā)服務(wù)請求報文,等待并接收應(yīng)答;繼續(xù)提出請求.(3)請求結(jié)束后關(guān)

5、閉通信通道并終止。從上面所描述過程可知:(1)客戶與服務(wù)器進(jìn)程的作用是非對稱的,因此代碼不同。(2)服務(wù)器進(jìn)程一般是先啟動的。只要系統(tǒng)運行,該服務(wù)進(jìn)程一直存在,直到正常或強(qiáng)迫終止。(2) HTTP 代理服務(wù)器的基本原理與流程圖代理服務(wù)器,俗稱“翻墻軟件”,允許一個網(wǎng)絡(luò)終端(一般為客戶端),通過這個服務(wù)與另一個網(wǎng)絡(luò)終端(一般為服務(wù)器)進(jìn)行非直接的連接。如圖 1-1 所示,為普通 Web 應(yīng)用通信方式與采用代理服務(wù)器的通信方式的對比。圖1-1代理服務(wù)器可以認(rèn)為是TCP/IP網(wǎng)絡(luò)應(yīng)用的客戶端和服務(wù)器端的結(jié)合。一方面,它是瀏覽器客戶端的服務(wù)器端,另一方面,它也是目標(biāo)服務(wù)器的客戶端。瀏覽器將請求報文發(fā)送

6、給代理服務(wù)器,代理服務(wù)器經(jīng)過一些處理或者不經(jīng)過處理,將請求報文轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器;目標(biāo)服務(wù)器相應(yīng)請求報文發(fā)出響應(yīng)報文,代理服務(wù)器接受到響應(yīng)報文之后直接將響應(yīng)報文轉(zhuǎn)發(fā)給瀏覽器客戶端。代理服務(wù)器在指定端口(例如 10240)監(jiān)聽瀏覽器的訪問請求(需要在客戶端瀏覽器進(jìn)行相應(yīng)的設(shè)置),接收到瀏覽器對遠(yuǎn)程網(wǎng)站的瀏覽請求時,首先查看瀏覽器來源的ip地址,如果屬于被限制的用戶,則認(rèn)為沒有接受到訪問請求。否則,查看其請求的host主機(jī),如果屬于不允許訪問的主機(jī),則默認(rèn)不向目標(biāo)服務(wù)器發(fā)送請求;如果屬于被引導(dǎo)的網(wǎng)站,則對該網(wǎng)站的請求報文中的host主機(jī)地址和url進(jìn)行更改,代理服務(wù)器開始在代理服務(wù)器的緩存中檢索 U

7、RL 對應(yīng)的對象(網(wǎng)頁、圖像等對象),找到對象文件后,提取該對象文件的最新被修改時間;代理服務(wù)器程序在客戶的請求報文首部插入<If-Modified-Since: 對象文件的最新被修改時間>,并向原 Web 服務(wù)器轉(zhuǎn)發(fā)修改后的請求報文。如果代理服務(wù)器沒有該對象的緩存,則會直接向原服務(wù)器轉(zhuǎn)發(fā)請求報文,并將原服務(wù)器返回的響應(yīng)直接轉(zhuǎn)發(fā)給客戶端,同時將對象緩存到代理服務(wù)器中。代理服務(wù)器程序會根據(jù)緩存的時間、大小和提取記錄等對緩存進(jìn)行清理。請求報文建立連接關(guān)閉連接原服務(wù)器請求報文建立連接響應(yīng)報文Proxysocket()Bind()Listen()Accept()Recvfrom()/從客戶

8、端Serversocket()Sento()/到服務(wù)器close()/關(guān)閉所有的Connect()Recvfrom()/從服務(wù)器Sento()/到客戶端代理服務(wù)器瀏覽器響應(yīng)報文關(guān)閉連接流程圖:(3) HTTP 代理服務(wù)器實驗驗證過程以及實驗結(jié)果1設(shè)置IE瀏覽器的代理服務(wù)器2運行程序3在IE瀏覽器輸入,在程序運行窗口發(fā)現(xiàn)了請求報文,并在瀏覽器端接收到了網(wǎng)頁的數(shù)據(jù),說明代理服務(wù)器基本功能實現(xiàn)。4(拓展功能1-支持Cache功能)我們在加入緩沖區(qū)的代碼中設(shè)置一個斷點,如圖:圖中309行的Buffer2是在緩沖區(qū)找到原網(wǎng)頁,并且在原請求報文上加上了If-Modified-Since: 段的請求報文,刷

9、新網(wǎng)頁,查看Buffer2:單步運行,查看原服務(wù)器返回的響應(yīng)報文:發(fā)現(xiàn)響應(yīng)報文中有HTTP/1.1 304 Not Modified,表示沒有更新,直接將緩存中的數(shù)據(jù)發(fā)送給瀏覽器,此時查看瀏覽器:成功!5(拓展功能2-a-網(wǎng)站過濾)在程序中設(shè)置了一個數(shù)組以下四個網(wǎng)站主機(jī)被禁,接下來我們在瀏覽器輸入被禁網(wǎng)站之一我們發(fā)現(xiàn)網(wǎng)站受限。接著我們查看源代碼中,在代碼設(shè)置斷點查看:Find表示在禁用網(wǎng)站中發(fā)現(xiàn)被禁用了,直接進(jìn)入error.6(拓展功能2-b-用戶過濾)首先我限制只能用戶來訪問-即本機(jī)在之前我們看到成功了,現(xiàn)在我進(jìn)行限制本機(jī)訪問:成功!7(拓展功能2-c-網(wǎng)站引導(dǎo))我們將網(wǎng)站成功引導(dǎo)(4)實現(xiàn)

10、 HTTP 代理服務(wù)器的關(guān)鍵技術(shù)及解決方案簡單代理服務(wù)器通過以下幾個函數(shù)實現(xiàn):1/* / Method: InitSocket / FullName: InitSocket / Access: public / Returns: BOOL / Qualifier: 初始化套接字/* BOOL InitSocket()該函數(shù)首先加載套接字庫,這一步是必須的;然后分別使用C的庫函數(shù)里的socket(AF_INET, SOCK_STREAM, 0); bind(ProxyServer, (SOCKADDR*)&ProxyServerAddr, sizeof(SOCKADDR);和listen

11、(ProxyServer, SOMAXCONN)實現(xiàn)了服務(wù)器流程中的socket和bind和listen;2/* / Method: ParseHttpHead / FullName: ParseHttpHead / Access: public / Returns: void / Qualifier: 解析 TCP 報文中的 HTTP 頭部 / Parameter: char * buffer / Parameter: HttpHeader * httpHeader /* BOOL ParseHttpHead(char *buffer, HttpHeader * httpHeader)該函數(shù)

12、對請求報文的頭部文件進(jìn)行解析,得到請求報文中的method,url,host和cookie存到一個對應(yīng)的結(jié)構(gòu)體中,該結(jié)構(gòu)體用于ConnectToServer函數(shù)與原服務(wù)器建立鏈接。3/* / Method: ConnectToServer / FullName: ConnectToServer / Access: public / Returns: BOOL / Qualifier: 根據(jù)主機(jī)創(chuàng)建目標(biāo)服務(wù)器套接字,并連接 / Parameter: SOCKET * serverSocket / Parameter: char * host /* BOOL ConnectToServer(SOC

13、KET *serverSocket, char *host)4/* / Method: ProxyThread / FullName: ProxyThread / Access: public / Returns: unsigned int _stdcall / Qualifier: 線程執(zhí)行函數(shù) / Parameter: LPVOID lpParameter /* unsigned int _stdcall ProxyThread(LPVOID lpParameter)該函數(shù)是核心函數(shù),其實現(xiàn)了從瀏覽器接收請求報文,向服務(wù)器發(fā)送請求報文,從服務(wù)器接收響應(yīng)報文,向瀏覽器發(fā)送響應(yīng)報文?;镜拇?/p>

14、服務(wù)器中沒有緩沖,處理方式中僅對請求報文頭部進(jìn)行解析,通過ParseHttpHead函數(shù),然后將得到的頭部文件作為ConnectToServer函數(shù)與原服務(wù)器建立鏈接。連接成功后,便將請求報文發(fā)送過去,接收收到響應(yīng)報文,然后發(fā)送響應(yīng)報文給瀏覽器即可。5代理服務(wù)器設(shè)置cahce實現(xiàn)方式首先設(shè)置一個結(jié)構(gòu)體,為存儲在cache中的數(shù)據(jù)格式:struct _CACHEcache_HttpHeader htphed;char bufferMAXSIZE;char dateDATELENGTH;/存儲的更新時間;htphed用于在緩沖區(qū)中找存儲的請求報文的頭部,buffer是該請求報文在服務(wù)器端返回的響應(yīng)

15、報文,date指該響應(yīng)報文最后一次更新的時間,即該響應(yīng)報文中的last-modifited。在該程序中,我在內(nèi)存中申請了100個該結(jié)構(gòu)體的內(nèi)存,即一個大小為100的數(shù)組,用以作為CACHE。然后在ProxyThread函數(shù)中,當(dāng)收到請求報文時,在對報文頭部處理之后,首先在cache中尋找該請求,如果找到了,在請求報文之中-第三行加入if-modified-since: date,發(fā)送給服務(wù)器,接收到服務(wù)器返回的響應(yīng)報文,對響應(yīng)報文進(jìn)行處理,看其頭部是否為304 not modified,如果是,直接將cache中的響應(yīng)報文返回給瀏覽器,如果不是,首先將該響應(yīng)報文存入cache中,即對cache

16、進(jìn)行更新仍存儲在之前的那個位置上,然后將響應(yīng)報文返回給瀏覽器。如果在cache中沒有找到該請求,將處理后的請求報文頭部存入Cache,得到響應(yīng)報文之后,對響應(yīng)報文進(jìn)行解析,得到date,然后將響應(yīng)報文和date存入cache。如果cache的100個區(qū)域滿了,會再次從0開始覆蓋原來的cache中的數(shù)據(jù)。6. 網(wǎng)站過濾設(shè)置了一個全局?jǐn)?shù)組,里面存放的是被禁止訪問的網(wǎng)站的主機(jī)。在ProxyThread函數(shù)中解析出請求報文頭部之后,將請求報文頭部中的host與全局?jǐn)?shù)組中的數(shù)據(jù)進(jìn)行比較,如果出現(xiàn)相同的表示訪問的網(wǎng)站被禁止訪問,直接跳轉(zhuǎn)到結(jié)束位置。實現(xiàn)代碼如下:7. 用戶過濾在主函數(shù)中,當(dāng)建立起瀏覽器和代

17、理服務(wù)器的鏈接時,得到瀏覽器的地址信息,也就得到瀏覽器端的ip地址,與被禁用戶ip比較,如果相同,認(rèn)為鏈接沒有建立,代理服務(wù)器等待下一次訪問請求。8網(wǎng)站引導(dǎo)類似于網(wǎng)站過濾,在ProxyThread函數(shù)中解析出請求報文頭部之后,將請求報文頭部中的url與被引導(dǎo)的網(wǎng)站比較,如果相同,將請求報文中的url改為引導(dǎo)向的網(wǎng)站的url,host也變?yōu)橐龑?dǎo)向的網(wǎng)站的host即可。四、實驗心得經(jīng)過此次實驗,在實踐過程中很清晰地學(xué)到了TCP協(xié)議在傳輸數(shù)據(jù)的流程和方式;熟悉了Socket 網(wǎng)絡(luò)編程的過程與技術(shù);同時也更清晰地掌握了HTTP 代理服務(wù)器的基本工作原理;掌握了 HTTP 代理服務(wù)器設(shè)計與編程實現(xiàn)的基本技能。并且也在這基礎(chǔ)

溫馨提示

  • 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

提交評論