標籤:http io ar os on 檔案 資料 問題 cti
HTTP Proxy 伺服器在Windows下的實現
摘要:本文介紹了Proxy 伺服器的優點,HTTP Proxy 伺服器在Windows 下的實現,最後
簡單討論實現Proxy 伺服器的意義。
關鍵字:
Proxy 伺服器(proxy)、HTTP、Windows、線程
普通的網際網路訪問是一個典型的客戶機/伺服器(Client/Server)結構:使用者本機電腦
上的用戶端程式如瀏覽器發生請求,遠端WWW 服務器程式響應請求並提供相應的資料。
而代理(Proxy)處於客戶機和伺服器之間,對於伺服器來說,Proxy是客戶機,提出請求;
對於客戶機來說,Proxy是伺服器,它接受請求並提供資料。
Proxy 伺服器模型
Proxy 伺服器具有以下幾個的優點:
(一)安全屏障
Proxy 是建立在應用程式層的軟體,它的最主要功能是作為firewall 的重要組成部分,為它保
護的主機起到了安全屏障的作用。Proxy起到流量控制,包過濾,存取控制,和作業系統用
戶整合等作用,所以Proxy可以成為簡單網路管理軟體的核心部分,同時它也是中小型企業
INTERNER訪問解決方案的重要組成部分。
(二)提高網路效能
當Internet的使用者以指數函數增長時,網路的擁擠是網路管理的一個重要問題。Proxy Server
就好像一個大儲藏庫, 它有很大的Cache空間。如果通過該Proxy有人去過了某個網站,傳
輸了某些內容,那麼Proxy 會將相關的資料 (包含文字、圖型、多媒體……)備份一份在Proxy
Server 中。當使用者再要通過該Proxy訪問相同地址時,可直接從Cache中獲得資料。一個有
效的Proxy伺服器將可能將90%的用量控制在Proxy 伺服器之下。所以不僅使用者的訪問速度
將會提高,網路的擁擠狀況也將會大大改觀。
(三)多機共用一個IP地址
當一個區域網路只有一個IP時,就可以在伺服器上安裝Proxy,整個區域網路的使用者就可通過一
個IP訪問Internet了,這樣將會給區域網路使用者節省大量申請IP的費用。
WWW Proxy 伺服器包括主要代理gopher,http,ftp,Telnet等幾種服務,各種代理服務
的基本工作原理是相同的。HTTP Proxy 伺服器是WWW Proxy 伺服器的一個最重要的組成部
分,同時HTTP 的Proxy 伺服器的實現比較簡單,因此在這裡以它為樣本介紹Windows 下的
Proxy 伺服器的實現方法。本文只介紹的Proxy 伺服器資料包轉寄的實現方法,由於Cache的處
理比較複雜,所以本文不對其進行討論。
1、Brower 通過proxy訪問Web Server 標頭檔的資料格式
由於不可能在此解釋HTTP協議,所以只給出最簡單的資料格式的例子:
動作:Brower 獲得http://202.196.48.9/index.htm
Brower 發送到proxy的資料:
Brower Proxy Server
Get http://202.196.48.9/index.htm HTTP/1.0
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01;Windows 95)
Host: 202.196.48.9
Proxy-Connection: Keep-Alive
Server 返回proxy的資料頭
HTTP/1.0 200 OK
Server: Microsoft-IIS/2.0
Date: Thu, 02 Sep 1999 09:45:42 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Wed, 25 Aug 1999 00:10:35 GMT
Content-Length: 26402
2、HTTPProxy 伺服器的建立過程:
1)Proxy啟動監聽Brower 的串連申請
2)Proxy接受Brower 的申請,Brower 向Proxy發資料
3)Proxy解析Brower 發的資料,確定服務類型(HTTP),伺服器位址和服務連接埠號碼
4)Proxy串連伺服器
5)Proxy啟動B_P_S(brower to proxy to server)線程,該線程負責Brower 把資料傳到
Proxy,再由Proxy傳到Server
6)B_P_S啟動S_P_B(Server to Proxy to Brower)線程,該線程負責Server 把資料傳到
Proxy,再由Proxy傳到Client
7)傳輸完畢結束B_P_S線程和S_P_B線程
8)迴圈啟動線程,直到所有傳輸完成
Brower Proxy Server
1.監聽
2.串連上,發資料
3.解析
資料
4.串連伺服器5.啟動線程
初始化
B_P_S線程
S_P_B 線程
資料
資料
Proxy_Server Socket
Brower_Proxy Socket
Brower_Proxy Socket
Brower_Proxy Socket
Proxy_Server Socket
Proxy_Server Socket
接收
發送 接收
發送
HTTPProxy 伺服器的建立過程
3、程式架構結構
HTTP協議是各部分單獨串連傳送的,Web頁面中的每個文本,圖片都是作為獨立單元
傳送的,為了提高Proxy的效率防止主程式阻塞,特意啟動三級線程。
各線程之間的關係
主線程在Proxy連接埠監聽Brower 的申請,然後啟動B_P_S線程;B_P_S線程負責接受
每個Brower 的申請(每個B_P_S都是獨立的),在完成Brower 到Server 單向資料傳送的同
時啟動S_P_B 線程,然後由S_P_S 線程完成Server 到Brower 的單向資料傳送。由於篇幅
所限,本文將簡要介紹B發給P的資料分析函數、B_P_S線程函數和S_P_B線程函數
(I) B發給P的資料分析
這部分的主要功能是分析B發給P的資料,確定服務類型和伺服器相關資訊。
客戶機向伺服器申請接受HTTP 資料,它發出的HTTP 命令格式第一行一般是:命令
---URL---協議,例如上文提到的:
Get(命令) http://202.196.48.9/index.htm(URL) HTTP/1.0(協議)
Proxy程式需要通過尋找“URL”中的“http://”串確定是否是HTTP服務,從URL部分中
解析到Web伺服器的地址,作為Proxy串連的目的地址。同時將“http://伺服器位址”部分
從URL部分剔除,這樣可以避免某些Web伺服器重新導向URL。
int GetAddressAndPort( char * str, char *address, int * port)
{
//讀出“Get”、“http://202.196.48.9/index.htm”和“HTTP1.0” 分別存入s_Cmd,s_Server,
s_Pro
//在s_Pro中尋找“http://”如果沒有找到,則表示非HTTP服務,返回-1
//*port=80 HTTP預設連接埠
//從s_Server 中解析地址“202.196.48.9”存入*str
//把*str 中的伺服器位址去掉,即“Get http://202.196.48.9/index.htm HTTP1.0”è“Get
/index.htm HTTP1.0”,返回1
}
(II) B_P_S線程
這部分的功能是:Brower 把資料傳到Proxy,再由Proxy把資料傳到Server。
B_P_S 線程由主線程啟動,在整個Proxy 程式中負責協調該線程啟動並同步S_P_B 線
程。該線程在Accept Brower 以後,複製自己,因為Accept 函數是阻塞的,在沒有收到Brower
的串連申請時會阻塞,所以同時最多隻有一個空閑(處於Accept阻塞狀態)的線程。
UINT B_P_S(LPVOID pParm)
主線程
1 建立監聽socket
2 監聽Brower 的申請
3 啟動B_P_S線程
B_P_S線程
Accpet Brower
複製自己
啟動 S_P_B線程
S_P_B線程
{
//Accept Brower 的串連申請
// AfxBeginThread(B_P_S) 重新啟動一個B_P_S線程
//收到一塊Brower 發送的資料
// GetAddressAndPort分析資料並去掉資料中的伺服器位址
//啟動S_P_B線程
//等待60 秒或S_P_B線程串連上伺服器
// Brower 把資料傳到Proxy,再由Proxy傳到Server,迴圈直到資料轉送完畢
//等待S_P_B線程結束。因為B_P_S是線程S_P_B的父線程,所以在S_P_B結束以前B_P_S
不能提前結束
}
(III) S_P_B
這部分的主要功能是:Server 把資料傳到Proxy,再由Proxy傳到Client
S_P_B 線程由B_P_S 線程啟動,是B_P_S 的子線程。不把S_P_B 線程合入B_P_S 線
程的原因是,S_P_B線程有一個阻塞的串連遠端伺服器的connect動作,當網路傳輸條件較
差時,該動作會佔用很多時間,甚至使程式無法控制,於是在B_P_S 中加入時間控制以保
證程式正常運行。S_P_B相對簡單一些,但是由於它與遠端伺服器串連,所以一定要注意錯
誤與例外的處理,本文僅介紹程式流程,錯誤與例外的處理請參考相關資料。
UINT S_P_B(LPVOID pParm)
{
//解析伺服器的網域名稱
//建立socket並串連到伺服器
// Server 把資料傳到Proxy,再由Proxy傳到Brower,迴圈直到資料轉送完畢
// 返回
}
從以上的程式可以看出,Proxy是Brower 訪問Server 的中介,它可以監控Brower 發出的所
有的HTTP資料包,對這些資料包進行阻塞,轉寄和流量記錄。同時,它也可以監控Server
發出的所有的HTTP資料包,對這些資料包進行阻塞,轉寄和流量記錄。
對 Browser 而言,在HTTP服務上是連通的,但是在IP層卻不通;然而對Server 而言,它
看到的只是一個IP節點。在Internet環境看,這是一個單向的資料轉送模式。
所有這些特點,使Proxy成為網路接入管理的核心部分,對Proxy簡單擴充,就可以完成許
多功能。如果對資料包進行過濾,就構成了一個Fierwall;如果對流量進行記錄,就構成了
一個計費系統。
4、實現Proxy 伺服器的意義
HTTP Proxy 伺服器是中小型企業Web 存取解決方案的重要組成部分,對它的功能進行
簡單的擴充,就可以構成訪問計費系統和管理系統,因此擁有Proxy 伺服器的核心對企業管理
和程式員都是很有意義的。
周翬 侯濱
(鄭州資訊工程大學電腦通訊教研室)
HTTPProxy 伺服器在windows下的實現