计算机网络实验1代理服务器-报告.doc
哈尔滨工业大学实验报告2016年度春季学期姓名吕西亚学号1130310621学院计算机科学与技术学院教师刘晓烽实验报告1实验一HTTP代理服务器的设计与实现一、实验目的熟悉并掌握SOCKET网络编程的过程与技术;深入理解HTTP协议,掌握HTTP代理服务器的基本工作原理;掌握HTTP代理服务器设计与编程实现的基本技能。二、实验内容1设计并实现一个基本HTTP代理服务器。要求在指定端口接收来自客户的HTTP请求并且根据其中的URL地址访问该地址所指向的HTTP服务器(原服务器),接收HTTP服务器的响应报文,并将响应报文转发给对应的客户进行浏览。2设计并实现一个支持CACHE功能的HTTP代理服务器。要求能缓存原服务器响应的对象,并能够通过修改请求报文(添加IFMODIFIEDSINCE头行),向原服务器确认缓存对象是否是最新版本。3扩展HTTP代理服务器,支持如下功能A网站过滤允许/不允许访问某些网站;B用户过滤支持/不支持某些用户访问外部网站;C网站引导将用户对某个网站的访问引导至一个模拟网站(钓鱼网站)三、实验过程及结果1、实验原理1SOCKET编程的客户端和服务器端主要步骤在TCP/IP网络应用中,通信的两个进程之间相互作用的主要模式是客户/服务器(C/S或B/S)模式,即客户向服务器发出请求,服务器接受到请求后,提供相应的服务。两者的工作步骤可以通过下面流程图直观地看到实验报告2服务器端其过程是首先服务器方要先启动,并根据请求提供相应服务(1)打开一通信通道并告知本地主机,它愿意在某一公认地址上的某端口接收客户请求;对应的操作是申请一个SOCKET,这时的SOCKET称为“欢迎套接字”,然后绑定(BIND)本地地址信息和欢迎套接字,然后开放监听(LISTEN)。(2)等待客户请求到达该端口;(3)接收到客户端的服务请求时,处理该请求并发送应答信号。在TCP实现过程中进行了三次握手操作,但是实际编写过程中通过ACCEPT函数即可实现上述操作,并建立连接,注意这个时候才真正建立起了与客户机传输数据的套接字。接收到并发服务请求,要激活一新进程来处理这个客户请求。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。(4)返回第(2)步,等待另一客户请求。(5)关闭服务器,对应的也就是关闭服务器的欢迎套接字。客户端(1)打开一通信通道,即建立起要与服务器传输数据的套接字SOCKET,通过CONNECT连接到服务器所在主机的特定端口;(2)向服务器发服务请求报文,等待并接收应答;继续提出请求(3)请求结束后关闭通信通道并终止。实验报告3从上面所描述过程可知(1)客户与服务器进程的作用是非对称的,因此代码不同。(2)服务器进程一般是先启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。2HTTP代理服务器的基本原理与流程图代理服务器,俗称“翻墙软件”,允许一个网络终端(一般为客户端),通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。如图11所示,为普通WEB应用通信方式与采用代理服务器的通信方式的对比。图11代理服务器可以认为是TCP/IP网络应用的客户端和服务器端的结合。一方面,它是浏览器客户端的服务器端,另一方面,它也是目标服务器的客户端。浏览器将请求报文发送给代理服务器,代理服务器经过一些处理或者不经过处理,将请求报文转发给目标服务器;目标服务器相应请求报文发出响应报文,代理服务器接受到响应报文之后直接将响应报文转发给浏览器客户端。代理服务器在指定端口(例如10240)监听浏览器的访问请求(需要在客户端浏览器进行相应的设置),接收到浏览器对远程网站的浏览请求时,首先查看浏览器来源的IP地址,如果属于被限制的用户,则认为没有接受到访问请求。否则,查看其请求的HOST主机,如果属于不允许访问的主机,则默认不向目标服务器发送请求;如果属于被引导的网站,则对该网站的请求报文中的HOST主机地址和URL进行更改,代理服务器开始在代理服务器的缓存中检索URL对应的对象(网页、图像等对象),找到对象文件后,提取该对象文件的最新被修改时间;代理服务器程序在客户的请求报文首部插入,并向原WEB服务器转发修改后的请求报文。如果代理服务器没有该对象的缓存,则会直接向原服务器转发请求报文,并将原服务器返回的响应直接转发给客户端,同时将对象缓存到代理服务器中。代理服务器程序会根据缓存的时间、大小和提取记录等对缓存进行清理。实验报告4流程图3HTTP代理服务器实验验证过程以及实验结果1.设置IE浏览器的代理服务器请求报文建立连接关闭连接原服务器请求报文建立连接响应报文PROXYSOCKETBINDLISTENACCEPTRECVFROM()//从客户端SERVERSOCKETSENTO//到服务器CLOSE//关闭所有的CONNECTRECVFROM()//从服务器SENTO//到客户端代理服务器浏览器响应报文关闭连接实验报告52.运行程序3.在IE浏览器输入WWWSOUGOUCOM,在程序运行窗口发现了请求报文,并在浏览器端接收到了网页的数据,说明代理服务器基本功能实现。实验报告64.(拓展功能1支持CACHE功能)我们在加入缓冲区的代码中设置一个断点,如图图中309行的BUFFER2是在缓冲区找到原网页,并且在原请求报文上加上了IFMODIFIEDSINCE段的请求报文,刷新网页,查看BUFFER2实验报告7单步运行,查看原服务器返回的响应报文发现响应报文中有HTTP/11304NOTMODIFIED,表示没有更新,直接将缓存中的数据发送给浏览器,此时查看浏览器实验报告8成功5.(拓展功能2A网站过滤)在程序中设置了一个数组以下四个网站主机被禁,接下来我们在浏览器输入被禁网站之一HTTP//TODAYHITEDUCN/,看其反馈我们发现网站受限。接着我们查看源代码中,在代码设置断点查看实验报告9FIND表示在禁用网站中发现被禁用了,直接进入ERROR6.(拓展功能2B用户过滤)首先我限制只能用户来访问即本机在之前我们看到成功了,现在我进行限制本机访问成功7.(拓展功能2C网站引导)我们将网站HTTP//DJANGOBOOKPY3KCN/20/引导到HTTP//PTHITEDUCN/,在浏览器中输入网站HTTP//DJANGOBOOKPY3KCN/20/实验报告10成功引导4实现HTTP代理服务器的关键技术及解决方案简单代理服务器通过以下几个函数实现1.////INITSOCKET//FULLNAMEINITSOCKET//ACCESSPUBLIC//RETURNSBOOL//QUALIFIER初始化套接字//BOOLINITSOCKET该函数首先加载套接字库,这一步是必须的;然后分别使用C的库函数里的SOCKETAF_INET,SOCK_STREAM,0BINDPROXYSERVER,SOCKADDRCHARBUFFERMAXSIZECHARDATEDATELENGTH//存储的更新时间}}HTPHED用于在缓冲区中找存储的请求报文的头部,BUFFER是该请求报文在服务器端返回的响应报文,DATE指该响应报文最后一次更新的时间,