网站首页 > 技术文章 正文
女朋友说:“看你最近挺辛苦的,我送你一个礼物吧。你看看想要什么,我来准备。”
我想了半天,从书到鞋子到电子产品最后到生活用品,感觉自己什么都不缺,然后和她说:“你省省钱吧,我什么都不需要。”
她坚持要送:“不行,你一定要说一个礼物,我想送你东西了。”
于是,我认真了起来,拿起手机,上淘宝逛了几分钟,但还是没能想出来缺点什么,最后实在没办法了:“这样吧,如果你实在想送东西,那你就写一个代理服务器吧”
她什么也没说,哈哈大笑了起来,然后写了这篇博客。
定义
允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。如图所示,为普通 Web 应用通信方式与采用代理服务器的通信方式的对比。
原理
代理服务器在指定端口(例如 8080) 监听浏览器的访问请求。接收到浏览器对远程网站的浏览请求时,代理服务器开始在代理服务器的缓存中检索 URL 对应的对象,找到对象文件后, 提取该对象文件的最新被修改时间。
代理服务器程序在客户的请求报文首部插入<If-Modified-Since: 对象文件的最新被修改时间>,并向原 Web 服务器转发修改后的请求报文。
如果代理服务器没有该对象的缓存,则会直接向原服务器转发请求报文, 并将原服务器返回的响应直接转发给客户端,同时将对象缓存到代理服务器中。 代理服务器程序会根据缓存的时间、大小和提取记录等对缓存进行清理。
内容
- 设计并实现一个基本 HTTP 代理服务器。 要求在指定端口(例如8080) 接收来自客户的 HTTP 请求并且根据其中的 URL 地址访问该地址所指向的 HTTP 服务器(原服务器), 接收 HTTP 服务器的响应报文,并将响应报文转发给对应的客户进行浏览。
- 设计并实现一个支持 Cache 功能的 HTTP 代理服务器。 要求能缓存原服务器响应的对象,并能够通过修改请求报文(添加 if-modified-since头行),向原服务器确认缓存对象是否是最新版本。(选作内容,加分项目,可以当堂完成或课下完成)
- 扩展 HTTP 代理服务器,支持如下功能:
a) 网站过滤:允许/不允许访问某些网站;
b) 用户过滤:支持/不支持某些用户访问外部网站;
c) 网站引导:将用户对某个网站的访问引导至一个模拟网站(钓鱼)。
过程
设置浏览器代理
以IE浏览器设置为例:打开浏览器工具浏览器选项——连接——局域网设置——代理服务器。设置地址为127.0.0.1,端口号为10240。
实现一个基本的HTTP代理服务器
HTTP代理服务器用于一个网络终端(一般为客户端)通过代理服务与另一个网络终端(一般为服务器)进行非直接的连接。设计的流程图如下:
(1) InitSocket()函数功能:初始化套接字(2) ProxyThread()函数功能:线程执行函数(3) ParseHttpHead()函数功能:解析 TCP 报文中的 HTTP 头部(4) ConnectToServer()函数功能:根据主机创建目标服务器套接字,并连接
Cache功能
- 客户端第一次请求服务器中的数据时,代理服务器将该请求返回的响应缓存下来,存到本地的文件下。
- 当客户端第二次访问该数据时,代理服务器检查本地是否有该请求的响应,如果没有,则继续缓存;如果有,则通过向服务器发送一个请求,对比最后修改时间来判断缓存是否过期,如果服务器返回状态码304,则没过期;如果服务器返回状态码200,则缓存过期,则更新本地缓存。
- 相应函数
(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代码链接:https://github.com/1170300826/Computer-Networks-Lab
猜你喜欢
- 2024-11-13 「直击面试」- 搞定计算机网络,这些问题还没有我答不出来的
- 2024-11-13 HTTP面试题 高校毕业生就业难 面试题
- 2024-11-13 HTTP的起源与发展 http的具体内容是什么
- 2024-11-13 前端优化的步骤 前端优化的步骤包括
- 2024-11-13 Python最常见的170道面试题全解析答案(四)
- 2024-11-13 前端项目中 浏览器缓存的更新不及时问题及解决方法
- 2024-11-13 你还没弄懂浏览器的缓存机制吗? 介绍一下浏览器缓存
- 2024-11-13 如何使用缓存提高系统性能? 提高缓存速度
- 2024-11-13 网络相关面试题 网络相关面试问题
- 2024-11-13 为什么你做的H5开屏那么慢?H5首屏秒开方案探讨
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-