Báo Cáo Cuối Kì Lập trình mạng căn bản Đề tài Proxy Sever
Trang 1Báo Cáo Cuối Kì Lập trình mạng căn bản
Đề tài: Proxy Sever Giảng viên hướng dẫn: TS: Trần Bá Nhiệm
Thực hiện: Phạm Đình Thanh Quang – 09520229
Trần Đình Quý - 09520239
Trường Đại học Công Nghệ Thông Tin Đại học Quốc gia Tp Hồ Chính Minh
Năm học: 2011 - 2012
Trang 2Trường Đại học Công Nghệ Thông Tin Đại học Quốc gia Tp Hồ Chí Minh
Báo cáo cuối kì
Môn: Lập trình mạng căn bản
Đề tài: Proxy Sever
Giảng viên hướng dẫn: TS: Trần Bá Nhiệm
Thực hiện: Phạm Đình Thanh Quang – 09520239
Trần Đình Quý – 09520239
Năm học: 2011 - 2012
Trang 3Mục Lục:
Mục Lục: 3
Lời Cảm Ơn: 5
Cơ Sở Lý Thuyết: 6
1 Proxy Sever là gì? 6
2 Chức năng của proxy 6
3 Ý nghĩa của proxy 7
4 Cách sử dụng proxy hiệu quả 7
5 Khuyết điểm 8
Nội dung chương trình: 9
1 Ý Tưởng Chương Trình 9
2 Giao Diện Chương Trình 9
3 Xây Dựng Chương Trình 12
3.1 Class Cache 12
3.2 Class Server 13
3.3 Class frmMain (Class Chương Trình) 18
Hướng Dẫn Sử Dụng 21
Tài Liệu Tham Khảo 24
Trang 5Lời Cảm Ơn:
Chúng em xin gửi lời cảm ơn chân thành tới tập thể các thầy cô trường đại học Công Nghệ Thông Tin – Đại học Quốc Gia Tp Hồ Chí Minh, đặc biệt là thầy Trần Bá Nhiệm, người đã dẫn dắt, chỉ dạy cho chúng em tất cả nội dung của bộ môn này trong suốt học kì qua Đồng thời cũng xin cảm ơn tất cả các bạn sinh viên, các thành viên trên các diễn đàn của trường cũng như của Microsoft đã góp sức giúp nhóm mình hoàn thành bài báo cáo này Xin chân thành cám ơn!
Trang 6Cơ Sở Lý Thuyết:
1 Proxy Sever là gì?
Proxy là một Internet server làm nhiệm vụ chuyển tiếp thông tin và kiểm soát tạo sự an toàn cho việc truy cập Internet của các máy khách, còn gọi là khách hàng sử dụng dịch vụ
internet Trạm cài đặt proxy gọi là proxy server Proxy hay trạm cài đặt proxy có địa chỉ
IP và một cổng truy cập cố định Ví dụ: 123.234.111.222:80 Địa chỉ IP của proxy trong
ví dụ là 123.234.111.222 và cổng truy cập là 80
2 Chức năng của proxy
Một số hãng và công ty sử dụng proxy với mục đích: Giúp nhiều máy tính truy cập Internet thông qua một máy tính với tài khoản truy cập nhất định, máy tính này được gọi
là Proxy server Chỉ duy nhất máy Proxy này cần modem và account truy cập internet, các máy client (các máy trực thuộc) muốn truy cập internet qua máy này chỉ cần nối mạng LAN tới máy Proxy và truy cập địa chỉ yêu cầu Những yêu cầu của người sử dụng
sẽ qua trung gian proxy server thay thế cho server thật sự mà người sử dụng cần giao tiếp, tại điểm trung gian này công ty kiểm soát được mọi giao tiếp từ trong công ty ra ngoài internet và từ internet vào máy của công ty Sử dụng Proxy, công ty có thể cấm nhân viên truy cập những địa chỉ web không cho phép, cải thiện tốc độ truy cập nhờ sự lưu trữ cục bộ các trang web trong bộ nhớ của proxy server và giấu định danh địa chỉ của mạng nội bộ gây khó khăn cho việc thâm nhập từ bên ngoài vào các máy của công ty
Đối với các nhà cung cấp dịch vụ đường truyền internet: Do internet có nhiều lượng thông tin mà theo quan điểm của từng quốc gia, từng chủng tộc hay địa phương mà các nhà cung cấp dịch vụ internet khu vực đó sẽ phối hợp sử dụng proxy với kỹ thuật tường lửa để tạo ra một bộ lọc gọi là firewall proxy nhằm ngăn chặn các thông tin độc hại hoặc trái thuần phong mỹ tục đối với quốc gia, chủng tộc hay địa phương đó Địa chỉ các website mà khách hàng yêu cầu truy cập sẽ được lọc tại bộ lọc này, nếu địa chỉ không bị cấm thì yêu cầu của khách hàng tiếp tục được gửi đi, tới các DNS server của các nhà cung cấp dịch vụ Firewall proxy sẽ lọc tất cả các thông tin từ internet gửi vào máy của khách hàng và ngược lại
Trang 73 Ý nghĩa của proxy
Proxy không chỉ có giá trị bởi nó làm được nhiệm vụ của một bộ lọc thông tin, nó còn tạo
ra được sự an toàn cho các khách hàng của nó, firewal Proxy ngăn chặn hiệu quả sự xâm nhập của các đối tượng không mong muốn vào máy của khách hàng Proxy lưu trữ được các thông tin mà khách hàng cần trong bộ nhớ, do đó làm giảm thời gian truy tìm làm cho việc sử dụng băng thông hiệu quả
Proxy server giống như một vệ sĩ bảo vệ khỏi những rắc rối trên Internet Một Proxy server thường nằm bên trong tường lửa, giữa trình duyệt web và server thật, làm chức năng tạm giữ những yêu cầu Internet của các máy khách để chúng không giao tiếp trực tiếp Internet Người dùng sẽ không truy cập được những trang web không cho phép (bị cấm)
Mọi yêu cầu của máy khách phải qua Proxy server, nếu địa chỉ IP có trên proxy, nghĩa là website này được lưu trữ cục bộ, trang này sẽ được truy cập mà không cần phải kết nối Internet, nếu không có trên Proxy server và trang này không bị cấm, yêu cầu sẽ được chuyển đến server thật, DNS server và ra Internet Proxy server lưu trữ cục bộ các trang web thường truy cập nhất trong bộ đệm để giảm chi phí kết nối, giúp tốc độ duyệt web nhanh hơn
Proxy server bảo vệ mạng nội bộ khỏi bị xác định bởi bên ngoài bằng cách mang lại cho mạng hai định danh: một cho nội bộ, một cho bên ngoài Điều này tạo ra một “bí danh” đối với thế giới bên ngoài và gây khó khăn đối với nếu người dùng “tự tung tự tác” hay các hacker muốn xâm nhập trực tiếp máy tính nào đó
4 Cách sử dụng proxy hiệu quả
Do các proxy có quy mô bộ nhớ khác nhau và số lượng người đang sử dụng proxy
nhiều-ít khác nhau, Proxy server hoạt động quá tải thì tốc độ truy cập internet của khách hàng
có thể bị chậm Mặt khác một số website khách hàng có đầy đủ điều kiện nhân thân để đọc, nghiên cứu nhưng bị tường lửa chặn không truy cập được thì biện pháp đổi proxy để truy cập là điều cần thiết nhằm đảm bảo công việc Do đó người sử dụng có thể chọn proxy server để sử dụng cho riêng mình Có các cách chọn lựa cho người sử dụng Sử dụng proxy mặc định của nhà cung cấp dịch vụ (internet), trường hợp này người sử dụng không cần điền địa chỉ IP của proxy vào cửa sổ internet option của trình duyệt trong máy
Trang 8của mình Sử dụng proxy server khác (phải trả phí hoặc miễn phí) thì phải điền địa chỉ IP của proxy server vào cửa sổ internet option của trình duyệt
Proxy Sever còn làm cho việc sử dụng băng thông hiệu quả hơn Với băng thông hạn chế
mà yêu cầu truy cập Internet lại rất cao, thì Proxy Sever là cách có lợi Giả sử, một cơ quan có hai kết nối: kết nối 56K bit/s với Internet và kết nối Ethernet cục bộ với 50 PC Nếu không có Proxy Sever, mỗi yêu cầu và phản hồi Internet đều truyền trên đường 56K, như vậy có thể xảy ra tình trạng tắt nghẽn nếu có nhiều người dùng truy cập đồng thời Internet Proxy Sever cho phép người dùng truy cập Internet một cách cục bộ qua kết nối Ethernet, nhờ vậy nhiều yêu cầu cho cùng trang Web sẽ không tràn ngập đường kết nối 56K
5 Khuyết điểm
Tuy nhiên, không phải lúc nào Proxy Sever cũng hữu ích, ví dụ như khi gặp phải loại thông tin không cho phép lưu lại trên bộ đệm kiểu như CGI Mặt khác, tốc độ cũng sẽ bị ảnh hưởng vì Proxy Sever kiểm tra từng yêu cầu trước khi phản hồi
Trang 9Nội dung chương trình:
1 Ý Tưởng Chương Trình
Chương trình được xây dựng với mục tiêu: Giao diện đẹp mắt và độ thẫm mĩ cao,
cách trình bày các công cụ trực quan và khoa học hướng tới mục tiêu đơn giản hoá khi
người dùng lần đầu sử dụng chương trình Đồng thời, chương trình cũng hỗ trợ tương tác
với trình duyệt được sử dụng rộng rãi nhất hiện nay: Internet Explorer (Hỗ trợ sẵn một
Web Browser trong chương trình đồng thời có chức năng thay đổi thông số Proxy cho
Internet Explorer cũng như các trình duyệt sử dụng Proxy chung với Internet Explorer
như Chrome, Opera,…) Riêng đối với Mozzila FireFox hay các trình duyệt chạy trên nền
Netscape thì phải tự thay đổi bằng tay
2 Giao Diện Chương Trình
Giao diện chính:
Giao diện công cụ Banned Site (Không cho người dùng vào các trang đã bị chặn)
Trang 10Kiểm tra proxy khi chạy một số website nổi tiếng:
Trang 11Các website không được phép truy cập:
Trang 123 Xây Dựng Chương Trình
Chương trình được xây dựng từ lớp cơ bản:
- Class frmMain: Class xử lí các sự kiện cho các công cụ trên Windows Form khi
được gọi
- Class Server: Tạo proxy server và xử lí các yêu cầu đến từ các máy khách (Client)
- Class Cache: Lưu lại cache của các liên kết sử dụng giao thức là GET
3.1 Class Cache
Như đã nói ở trên, nếu trang web được gọi sử dụng giao thức là GET thì có thể
được lưu cache lại nhằm tối ưu hoá tốc độ lướt web của người sử dụng
- Hàm Boolean CanCache( WebHeaderCollection headers, ref DateTime ? expires): Có hai
tham số truyền vào là WebHeaderCollection và expires Class
System.Net.WebHeaderCollection là một class dùng để chứa HTTP Header do kết quả
từ máy chủ của website gửi về khi có yêu cầu từ Proxy Server Từ Header ta có
thể biết được, website này có cho phép lưu trữ Cache hay không thông qua thuộc
tính Cache-Control, Pragma, Expires Trong Cache-Control có chứa các thuộc
Trang 13tính con là max-age, private, no-cache, no-store, public Max-age chính là thông
số thời gian tối đa cache được phép lưu trữ trên máy tính Nếu max-age bằng 0 thì
có nghĩa là website đó không cho phép Proxy lưu trữ cache Còn nếu trong
Cache-Control có chứa các thuộc tính private, no-cache thì Proxy cũng không được phép
lưu trữ cache Ngược lại, nếu Cache-Control có chứa thuộc tính no-store, public
thì cache sẽ được phép lưu lại trên máy Ngoài ra, Cache cũng sẽ không được sử
dụng nếu trong thuộc tính Pragma có chứa từ khoá no-cache Thuộc tính Expires
chứa thông tin thời gian cache được phép tồn tại trên máy
- Hàm CacheEntry MakeEntry( HttpWebRequest request, HttpWebResponse response,
List < Tuple < String , String >> headers, DateTime ? expires) trả về một đối tượng CacheEntry chứa các thông về về cache sẽ được lưu trữ như AbsoluteUri, UserAgent,
DateStored, ResponseBytes, Headers…
- Hàm CacheEntry GetData( HttpWebRequest request) trả về đối tượng CacheEntry đã được lưu trong bộ nhớ Cache của Proxy Nếu một yêu cầu từ phía máy khách (Client) đã được thực hiện trước đó bởi Proxy thì Proxy sẽ thực hiện lấy thông tin
từ Cache chứ không gửi yêu cầu đến máy chủ của website nữa
3.2 Class Server
Class Server là class chính của chương trình, chứa các hàm khởi tạo Proxy cũng như dừng proxy, tiếp nhận yêu cầu từ máy khách và gửi lên máy chủ và nhận kết quả chuyển về cho máy khách
- Hàm khởi tạo Server( IPAddress IP, int Port): Khởi tạo biến TcpListener Listener
để tiếp nhận và xử lí các yêu cầu gửi lên từ client
- Hàm void Start(): Chạy hàm Listener.Start(), bắt đầu chạy nền thread
Listener_Thread Thread này sẽ chạy nền hàm Listen() có tác dụng xử lí các yêu cầu đến từ client
- Hàm void Stop(): Ngưng tiếp nhận các yêu cầu đến từ client cũng như dừng tất cả các việc đang thực hiện
- Hàm Listen(): Hàm này sử dụng một vòng lặp vô hạn để tiếp nhận yêu cầu đến từ client Khi có một client yêu cầu kết nối, một đối tượng TcpClient client sẽ được tạo ra để quản lí và xử lí các yêu cầu đến từ client này Các yêu cầu đến từ client này sẽ được đưa vào một ThreadPool và sẽ được xử lí ngay khi ThreadPool trong trạng thái sẵn sàng (Đã xử lí hết các công việc trước đó)
- Hàm void ProcessClient( Object obj) tham số truyền vào là một Object có thể ép kiểu thành TcpClient Hàm này sẽ gọi hàm HTTPProcess() với tham số truyền vào
Trang 14chính là obj đã được ép kiểu thành client Sau khi xử lí xong công việc thì client
này sẽ được đóng lại để tiết kiệm tài nguyên
- Hàm List < String > BannedList() trả về một biến kiểu List<String> chứa danh sách các trang web không được phép tải về Các trang này được lưu trong file XML có tên là Banned.XML
- Hàm void HTTPProcess( TcpClient client) là hàm chính của chương trình này Hàm này sẽ được thực hiện các lệnh sau:
o Dùng biến clientStream kiểu Stream để lấy yêu cầu từ client
o Đọc yêu cầu từ client bằng biến StreamReader clientStreamReader
o Đọc dòng đầu tiên của clientStreamReader để có các thông tin: Giao thức
sử dụng, đường dẫn tuyệt đối và phiên bản HTTP đang sử dụng và đưa kết quả vào biến String httpCmd Sau đó đóng clientStream và
clientStreamReader lại
o Khởi tạo các đối tượng HttpWebRequest webReq và HttpWebResponse response
để gửi yêu cầu và nhận kết quả từ Server Kiểm tra xem đường dẫn gửi từ client có nằm trong danh sách cấm hyay không? Nếu không thì xử lí tiếp, nếu có thì trả về null
o Truyền đường dẫn URI, giao thức sử dụng và phiên bản HTTP vào biến
o Kiểm tra xem cacheEntry đã có dữ liệu chưa, nếu chưa thì nghĩa là cache không chứa dữ liệu được yêu cầu, phải tải toàn bộ từ server Ta dùng một biến List < Tuple < String , String >> responseHeaders để chứa HTTP Header phản hồi từ server bằng cách dùng hàm ProcessResponse(response) sẽ được trình bày bên dưới Sử dụng các class đã được cung cấp sẵn là StreamWriter và Stream để trả về kết quả nhận được từ server cho client Nếu cacheEntry đã có dữ liệu thì trả về cache đã được lưu mà không cần phải tải lại
o Đóng các class Reader và Writer lại và kết thúc hàm
Code:
/// <summary>
/// Process HTTP Header to get the web response
Trang 15/// </summary>
/// <param name="client"></param>
private static void HTTPProcess( TcpClient client)
{
Stream clientStream = client.GetStream();
Stream outStream = clientStream;
StreamReader clientStreamReader = new StreamReader (clientStream);
CacheEntry cacheEntry = null ;
MemoryStream cacheStream = null ;
List < String > BannedSites = BannedList();
//break up the line into three components
String [] splitBuffer = httpCmd.Split(spaceSplit, 3);
String method = splitBuffer[0];
String remoteUri = splitBuffer[1];
Version version = new Version (1, 0);
HttpWebRequest webReq;
HttpWebResponse response = null ;
//construct the web request that we are going to issue on behalf of the client.
for ( int i = 0; i < BannedSites.Count(); i++)
//read the request headers from the client and copy them to our request
int contentLen = ReadRequestHeaders(clientStreamReader, webReq);
webReq.Proxy = null ;
webReq.KeepAlive = false ;
webReq.AllowAutoRedirect = false ;
Trang 16webReq.AutomaticDecompression = DecompressionMethods None;
// Using Completed Request From Cache
if (method.ToUpper() == "GET" )
cacheEntry = ProxyCache GetData(webReq);
else if (method.ToUpper() == "POST" )
CacheEntry entry = null ;
Trang 17Boolean canCache = ( ProxyCache CanCache(response.Headers, ref
Trang 18StreamWriter myResponseWriter = new StreamWriter (outStream);
- Hàm List < Tuple < String , String >> ProcessResponse( HttpWebResponse response) : Như
đã nói ở trên, hàm này dùng để lấy HTTP Header trả về từ server Thêm thông tin của chương trình vào Header
3.3 Class frmMain (Class Chương Trình)
Class này có nhiệm vụ chủ yếu là tương tác với người sử dụng, khởi tạo và gọi các hàm trong class Server để bắt đầu và dừng server Đồng thời, class frmMain còn được
sử dụng để thay đổi thông tin của Proxy trong Registry của Windows, hỗ trợ người