女朋友說:“看你最近挺辛苦的,我送你一個禮物吧。你看看想要什麼,我來準備。”
我想了半天,從書到鞋子到電子產品最後到生活用品,感覺自己什麼都不缺,然後和她說:“你省省錢吧,我什麼都不需要。”
她堅持要送:“不行,你一定要說一個禮物,我想送你東西了。”
於是,我認真了起來,拿起手機,上淘寶逛了幾分鐘,但還是沒能想出來缺點什麼,最後實在沒辦法了:“這樣吧,如果你實在想送東西,那你就寫一個代理服務器吧”
她什麼也沒說,哈哈大笑了起來,然後寫了這篇博客。
定義
允許一個網絡終端(一般爲客戶端)通過這個服務與另一個網絡終端(一般爲服務器)進行非直接的連接。如圖所示,爲普通 Web 應用通信方式與採用代理服務器的通信方式的對比。
原理
代理服務器在指定端口(例如 8080) 監聽瀏覽器的訪問請求(需要在客戶端瀏覽器進行相應的設置), 接收到瀏覽器對遠程網站的瀏覽請求時,代理服務器開始在代理服務器的緩存中檢索 URL 對應的對象(網頁、圖像等對象),找到對象文件後, 提取該對象文件的最新被修改時間; 代理服務器程序在客戶的請求報文首部插入<If-Modified-Since: 對象文件的最新被修改時間>,並向原 Web 服務器轉發修改後的請求報文。 如果代理服務器沒有該對象的緩存,則會直接向原服務器轉發請求報文, 並將原服務器返回的響應直接轉發給客戶端,同時將對象緩存到代理服務器中。 代理服務器程序會根據緩存的時間、大小和提取記錄等對緩存進行清理。本實驗需實現一個簡單的 HTTP 代理服務器, 可以分爲兩個步驟:(首先請設置瀏覽器開啓本地代理,注意設置代理端口與代理服務器監聽端口保持一致)。
內容
- 設計並實現一個基本 HTTP 代理服務器。 要求在指定端口(例如8080) 接收來自客戶的 HTTP 請求並且根據其中的 URL 地址訪問該地址所指向的 HTTP 服務器(原服務器), 接收 HTTP 服務器的響應報文,並將響應報文轉發給對應的客戶進行瀏覽。
- 設計並實現一個支持 Cache 功能的 HTTP 代理服務器。 要求能緩存原服務器響應的對象,並能夠通過修改請求報文(添加 if-modified-since頭行),向原服務器確認緩存對象是否是最新版本。(選作內容,加分項目,可以當堂完成或課下完成)
- 擴展 HTTP 代理服務器,支持如下功能:
a) 網站過濾:允許/不允許訪問某些網站;
b) 用戶過濾:支持/不支持某些用戶訪問外部網站;
c) 網站引導:將用戶對某個網站的訪問引導至一個模擬網站(釣魚)。
過程
設置瀏覽器代理
以IE瀏覽器設置爲例:打開瀏覽器工具瀏覽器選項——連接——局域網設置——代理服務器。設置地址爲127.0.0.1,端口號爲10240。
實現一個基本的HTTP代理服務器
HTTP代理服務器用於一個網絡終端(一般爲客戶端)通過代理服務與另一個網絡終端(一般爲服務器)進行非直接的連接。設計的流程圖如下:
(1) InitSocket()函數
功能:初始化套接字
(2) ProxyThread()函數
功能:線程執行函數
(3) ParseHttpHead()函數
功能:解析 TCP 報文中的 HTTP 頭部
(4) ConnectToServer()函數
功能:根據主機創建目標服務器套接字,並連接
Cache功能
- 客戶端第一次請求服務器中的數據時,代理服務器將該請求返回的響應緩存下來,存到本地的文件下。
- 當客戶端第二次訪問該數據時,代理服務器檢查本地是否有該請求的響應,如果沒有,則繼續緩存;如果有,則通過向服務器發送一個請求,對比最後修改時間來判斷緩存是否過期,如果服務器返回狀態碼304,則沒過期;如果服務器返回狀態碼200,則緩存過期,則更新本地緩存。
- 相應函數
(1)getfileDate()函數
功能:訪問本地文件,獲取本地緩存中的日期
(2)sendnewHTTP()函數
功能:修改請求報文,添加 if-modified-since頭行
先查看請求報文格式:
(3)checkfileCache()函數
功能:檢測主機返回的狀態碼,如果是304則從本地獲取緩存進行轉發,否則需要更新緩存
(4)storefileCache()函數
功能:檢測主機返回的狀態碼,如果是200則本地獲取緩存
實現擴展功能
網站過濾
首先設置不允許訪問網站的url
在處理客戶端請求時,檢查請求消息中的url是否被允許訪問,如果不允許訪問,則拒絕
用戶過濾
將代理服務器的網絡通信IP地址從INADDR_ANY更改爲特定的某個IP地址,從而只有該IP地址能通過
代理服務器訪問外部網站,其他IP均不能
網站引導
首先設置目標網站和相應的釣魚網站和主機名
在處理客戶端請求時,將請求消息中的url和host替換成事先設置好的模擬網站的url和host