女朋友說:“看你最近挺辛苦的喷户,我送你一個禮物吧唾那。你看看想要什么,我來準備∧只瘢”
我想了半天期犬,從書到鞋子到電子產品最后到生活用品,感覺自己什么都不缺避诽,然后和她說:“你省省錢吧龟虎,我什么都不需要∩陈”
她堅持要送:“不行鲤妥,你一定要說一個禮物,我想送你東西了拱雏∶薨玻”
于是,我認真了起來铸抑,拿起手機贡耽,上淘寶逛了幾分鐘,但還是沒能想出來缺點什么鹊汛,最后實在沒辦法了:“這樣吧蒲赂,如果你實在想送東西,那你就寫一個代理服務器吧”
她什么也沒說刁憋,哈哈大笑了起來滥嘴,然后寫了這篇博客。
定義
允許一個網(wǎng)絡終端(一般為客戶端)通過這個服務與另一個網(wǎng)絡終端(一般為服務器)進行非直接的連接职祷。如圖所示氏涩,為普通 Web 應用通信方式與采用代理服務器的通信方式的對比。
原理
代理服務器在指定端口(例如 8080) 監(jiān)聽瀏覽器的訪問請求(需要在客戶端瀏覽器進行相應的設置)有梆, 接收到瀏覽器對遠程網(wǎng)站的瀏覽請求時是尖,代理服務器開始在代理服務器的緩存中檢索 URL 對應的對象(網(wǎng)頁、圖像等對象)泥耀,找到對象文件后饺汹, 提取該對象文件的最新被修改時間; 代理服務器程序在客戶的請求報文首部插入<If-Modified-Since: 對象文件的最新被修改時間>痰催,并向原 Web 服務器轉發(fā)修改后的請求報文兜辞。 如果代理服務器沒有該對象的緩存,則會直接向原服務器轉發(fā)請求報文夸溶, 并將原服務器返回的響應直接轉發(fā)給客戶端逸吵,同時將對象緩存到代理服務器中。 代理服務器程序會根據(jù)緩存的時間缝裁、大小和提取記錄等對緩存進行清理扫皱。本實驗需實現(xiàn)一個簡單的 HTTP 代理服務器, 可以分為兩個步驟:(首先請設置瀏覽器開啟本地代理,注意設置代理端口與代理服務器監(jiān)聽端口保持一致)韩脑。
內容
- 設計并實現(xiàn)一個基本 HTTP 代理服務器氢妈。 要求在指定端口(例如8080) 接收來自客戶的 HTTP 請求并且根據(jù)其中的 URL 地址訪問該地址所指向的 HTTP 服務器(原服務器), 接收 HTTP 服務器的響應報文段多,并將響應報文轉發(fā)給對應的客戶進行瀏覽首量。
- 設計并實現(xiàn)一個支持 Cache 功能的 HTTP 代理服務器。 要求能緩存原服務器響應的對象进苍,并能夠通過修改請求報文(添加 if-modified-since頭行)加缘,向原服務器確認緩存對象是否是最新版本。(選作內容琅捏,加分項目生百,可以當堂完成或課下完成)
- 擴展 HTTP 代理服務器,支持如下功能:
a) 網(wǎng)站過濾:允許/不允許訪問某些網(wǎng)站柄延;
b) 用戶過濾:支持/不支持某些用戶訪問外部網(wǎng)站蚀浆;
c) 網(wǎng)站引導:將用戶對某個網(wǎng)站的訪問引導至一個模擬網(wǎng)站(釣魚)。
過程
設置瀏覽器代理
以IE瀏覽器設置為例:打開瀏覽器工具瀏覽器選項——連接——局域網(wǎng)設置——代理服務器搜吧。設置地址為127.0.0.1市俊,端口號為10240。
實現(xiàn)一個基本的HTTP代理服務器
HTTP代理服務器用于一個網(wǎng)絡終端(一般為客戶端)通過代理服務與另一個網(wǎng)絡終端(一般為服務器)進行非直接的連接滤奈。設計的流程圖如下:
(1) InitSocket()函數(shù)
功能:初始化套接字
(2) ProxyThread()函數(shù)
功能:線程執(zhí)行函數(shù)
(3) ParseHttpHead()函數(shù)
功能:解析 TCP 報文中的 HTTP 頭部
(4) ConnectToServer()函數(shù)
功能:根據(jù)主機創(chuàng)建目標服務器套接字摆昧,并連接
Cache功能
- 客戶端第一次請求服務器中的數(shù)據(jù)時,代理服務器將該請求返回的響應緩存下來蜒程,存到本地的文件下绅你。
- 當客戶端第二次訪問該數(shù)據(jù)時,代理服務器檢查本地是否有該請求的響應昭躺,如果沒有忌锯,則繼續(xù)緩存;如果有领炫,則通過向服務器發(fā)送一個請求偶垮,對比最后修改時間來判斷緩存是否過期,如果服務器返回狀態(tài)碼304帝洪,則沒過期似舵;如果服務器返回狀態(tài)碼200,則緩存過期葱峡,則更新本地緩存砚哗。
- 相應函數(shù)
(1)getfileDate()函數(shù)
功能:訪問本地文件,獲取本地緩存中的日期
(2)sendnewHTTP()函數(shù)
功能:修改請求報文砰奕,添加 if-modified-since頭行
先查看請求報文格式:
(3)checkfileCache()函數(shù)
功能:檢測主機返回的狀態(tài)碼频祝,如果是304則從本地獲取緩存進行轉發(fā)泌参,否則需要更新緩存
(4)storefileCache()函數(shù)
功能:檢測主機返回的狀態(tài)碼脆淹,如果是200則本地獲取緩存
實現(xiàn)擴展功能
網(wǎng)站過濾
首先設置不允許訪問網(wǎng)站的url
在處理客戶端請求時常空,檢查請求消息中的url是否被允許訪問,如果不允許訪問盖溺,則拒絕
用戶過濾
將代理服務器的網(wǎng)絡通信IP地址從INADDR_ANY更改為特定的某個IP地址漓糙,從而只有該IP地址能通過
代理服務器訪問外部網(wǎng)站,其他IP均不能
網(wǎng)站引導
首先設置目標網(wǎng)站和相應的釣魚網(wǎng)站和主機名
在處理客戶端請求時烘嘱,將請求消息中的url和host替換成事先設置好的模擬網(wǎng)站的url和host