計算機網絡實驗1代理服務器-報告_第1頁
計算機網絡實驗1代理服務器-報告_第2頁
計算機網絡實驗1代理服務器-報告_第3頁
計算機網絡實驗1代理服務器-報告_第4頁
計算機網絡實驗1代理服務器-報告_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<<計算機網絡>>實驗報告 哈爾濱工業大學<<計算機網絡>>實驗報告(2016年度春季學期)姓名:呂西亞學號:1130310621學院:計算機科學與技術學院教師:劉曉烽實驗一 HTTP代理服務器的設計與實現一、 實驗目的熟悉并掌握 Socket 網絡編程的過程與技術;深入理解 HTTP 協議,掌握 HTTP 代理服務器的基本工作原理;掌握 HTTP 代理服務器設計與編程實現的基本技能。二、 實驗內容(1) 設計并實現一個基本 HTTP 代理服務器。要求在指定端口接收來自客戶的 HTTP 請求并且根據其中的 URL 地址訪問該地址所指向的 HTTP

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

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

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

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

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

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

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

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

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

11、(ProxyServer, SOMAXCONN)實現了服務器流程中的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)該函數

12、對請求報文的頭部文件進行解析,得到請求報文中的method,url,host和cookie存到一個對應的結構體中,該結構體用于ConnectToServer函數與原服務器建立鏈接。3/* / Method: ConnectToServer / FullName: ConnectToServer / Access: public / Returns: BOOL / Qualifier: 根據主機創建目標服務器套接字,并連接 / 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: 線程執行函數 / Parameter: LPVOID lpParameter /* unsigned int _stdcall ProxyThread(LPVOID lpParameter)該函數是核心函數,其實現了從瀏覽器接收請求報文,向服務器發送請求報文,從服務器接收響應報文,向瀏覽器發送響應報文。基本的代理

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

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

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

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

溫馨提示

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

評論

0/150

提交評論