女朋友過生日,我花了20分鐘給她寫了一個代理服務器

女朋友說:“看你最近挺辛苦的,我送你一個禮物吧。你看看想要什麼,我來準備。”

我想了半天,從書到鞋子到電子產品最後到生活用品,感覺自己什麼都不缺,然後和她說:“你省省錢吧,我什麼都不需要。”

她堅持要送:“不行,你一定要說一個禮物,我想送你東西了。”

於是,我認真了起來,拿起手機,上淘寶逛了幾分鐘,但還是沒能想出來缺點什麼,最後實在沒辦法了:“這樣吧,如果你實在想送東西,那你就寫一個代理服務器吧”

她什麼也沒說,哈哈大笑了起來,然後寫了這篇博客。

定義

允許一個網絡終端(一般爲客戶端)通過這個服務與另一個網絡終端(一般爲服務器)進行非直接的連接。如圖所示,爲普通 Web 應用通信方式與採用代理服務器的通信方式的對比。
在這裏插入圖片描述

原理

代理服務器在指定端口(例如 8080) 監聽瀏覽器的訪問請求(需要在客戶端瀏覽器進行相應的設置), 接收到瀏覽器對遠程網站的瀏覽請求時,代理服務器開始在代理服務器的緩存中檢索 URL 對應的對象(網頁、圖像等對象),找到對象文件後, 提取該對象文件的最新被修改時間; 代理服務器程序在客戶的請求報文首部插入<If-Modified-Since: 對象文件的最新被修改時間>,並向原 Web 服務器轉發修改後的請求報文。 如果代理服務器沒有該對象的緩存,則會直接向原服務器轉發請求報文, 並將原服務器返回的響應直接轉發給客戶端,同時將對象緩存到代理服務器中。 代理服務器程序會根據緩存的時間、大小和提取記錄等對緩存進行清理。本實驗需實現一個簡單的 HTTP 代理服務器, 可以分爲兩個步驟:(首先請設置瀏覽器開啓本地代理,注意設置代理端口與代理服務器監聽端口保持一致)。

內容

  1. 設計並實現一個基本 HTTP 代理服務器。 要求在指定端口(例如8080) 接收來自客戶的 HTTP 請求並且根據其中的 URL 地址訪問該地址所指向的 HTTP 服務器(原服務器), 接收 HTTP 服務器的響應報文,並將響應報文轉發給對應的客戶進行瀏覽。
  2. 設計並實現一個支持 Cache 功能的 HTTP 代理服務器。 要求能緩存原服務器響應的對象,並能夠通過修改請求報文(添加 if-modified-since頭行),向原服務器確認緩存對象是否是最新版本。(選作內容,加分項目,可以當堂完成或課下完成)
  3. 擴展 HTTP 代理服務器,支持如下功能:
    a) 網站過濾:允許/不允許訪問某些網站;
    b) 用戶過濾:支持/不支持某些用戶訪問外部網站;
    c) 網站引導:將用戶對某個網站的訪問引導至一個模擬網站(釣魚)。

過程

設置瀏覽器代理

以IE瀏覽器設置爲例:打開瀏覽器工具瀏覽器選項——連接——局域網設置——代理服務器。設置地址爲127.0.0.1,端口號爲10240。
在這裏插入圖片描述

實現一個基本的HTTP代理服務器

HTTP代理服務器用於一個網絡終端(一般爲客戶端)通過代理服務與另一個網絡終端(一般爲服務器)進行非直接的連接。設計的流程圖如下:
在這裏插入圖片描述
(1) InitSocket()函數
功能:初始化套接字
(2) ProxyThread()函數
功能:線程執行函數
(3) ParseHttpHead()函數
功能:解析 TCP 報文中的 HTTP 頭部
(4) ConnectToServer()函數
功能:根據主機創建目標服務器套接字,並連接

Cache功能

  1. 客戶端第一次請求服務器中的數據時,代理服務器將該請求返回的響應緩存下來,存到本地的文件下。
  2. 當客戶端第二次訪問該數據時,代理服務器檢查本地是否有該請求的響應,如果沒有,則繼續緩存;如果有,則通過向服務器發送一個請求,對比最後修改時間來判斷緩存是否過期,如果服務器返回狀態碼304,則沒過期;如果服務器返回狀態碼200,則緩存過期,則更新本地緩存
  3. 相應函數
    (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
在這裏插入圖片描述

源碼

github代碼鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章