哈工大计算机网络实验一-HTTP代理服务器的设计与实现

一、代理服务器原理

当客户在浏览器中设置好Proxy Server后,你使用浏览器访问所有WWW站点的请求都不会直接发给目的主机,而是先发给代理服务器,代理服务器接受了客户的请求以后,由代理服务器向目的主机发出请求,并接受目的主机的数据,存于代理服务器的硬盘中,然后再由代理服务器将客户要求的数据发给客户。

代理服务器是为了减少长距离的传送而诞生的。它不仅可以代理客户端向服务器端提出请求,也可以代理服务器传给客户端所需要的数据。

当客户端对服务器端提出请求时,此请求会被送到代理服务器,然后代理服务器会检查本身是否有客户端所需要的数据。如果有,代理服务器便代替服务器将数据传给客户端。而代理服务器一般都是设置距自己传输距离较近的某台代理服务器,所以它传数据给客户端的速度会比从远程服务器传数据要快。

如果代理服务器没有客户端所请求的数据,它会去服务器获取所需的数据。在代理服务器从服务器端取得数据传给客户端时,自己保存一份,待下次如果有用户提出相同的请求时,便可以将数据直接传过去,而不需要再去服务器端获取了。可见,代理服务器改善网络数据传输阻塞的功能是显而易见的。

本实验中代理服务器的流程图:

  • 代理服务器的配置

我们在firefox设置里查找网络代理设置,然后选择手动设置代理,适用代理服务器,并设置好地址和端口号,保存。

  • 实验实现过程

首先我们设置实验中需要用到的参数

PARAMETERS = {

    'HOST': '127.0.0.1',

    'PORT': 9999,

    'MAX_LISTEN': 50,

    'MAX_LENGTH': 4096,

    'CACHE_SIZE': 1000

}

接下来我们初始化socket并且在循环中监听指定端口,当接收到客户端的请求则创建一个新线程进行处理。其中transmission函数是代理服务器的核心函数。

# 初始化socket

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定IP地址和端口号

    s.bind((PARAMETERS['HOST'], PARAMETERS['PORT']))

    # socket的排队个数

    s.listen(PARAMETERS['MAX_LISTEN'])

    # 创建cache目录

    if not os.path.exists(cache_dir):

        os.mkdir(cache_dir)

    print('初始化完成.')

    print('server将一直等待连接...')

    while True:

        # 在循环中监听9999端口,接收到客户端请求则创建一个新线程处理

        sock, address = s.accept()

        threading.Thread(target=transmission, args=(sock, address)).start()

接下来接收来自客户端的http请求报文,解码报文,获取请求行并格式化,分析字符串得到url地址,并且通过传入参数获得主机IP。

# 接受来自客户端的http请求报文

    message = so.recv(PARAMETERS['MAX_LENGTH'])

    if len(message) == 0:

        return

    message = message.decode('utf-8', 'ignore')  # 对报文进行解码,忽略错误

    request_line = message.split('\r\n')[0].split()  # 获得请求行,去掉前后空格

    url = urlparse(request_line[1])  # 获得URL

    hostIP = address[0]  # 获得主机IP

四、附加功能的部分。

1. 用户IP是否被过滤

如果用户IP被过滤,则直接输出提示信息,然后关闭套接字并返回。

    if hostIP in Blocked_User:  # 用户IP被过滤

        print('用户 '+str(hostIP)+' 被禁止访问.')

        so.close()

        return

  1. 主机名是否禁止访问

如果主机名禁止访问,则直接输出提示信息,然后关闭套接字并返回。

    if url.hostname in No_Access_url:  # 主机名被禁止访问

        print(str(url.hostname) + ' 被禁止访问.')

        so.close()

        return

3. 是否是钓鱼网站并且如何处理。

如果是钓鱼网站,首先输出提示信息,然后根据给定的参数重构请求报文,发送到被引导到的网站服务器,从中接收数据,转发给客户端,之后关闭套接字并返回。

    if url.hostname in fishing:  # 主机名为钓鱼网站

        print('即将从 ' + str(url.hostname) + ' 跳转到 ' + str(fishing[url.hostname]))

        new_hostname = fishing[url.hostname]  # 新的目标主机名

        message = message.replace(request_line[1], 'http://'+new_hostname+'/')

        message = message.replace(url.hostname, new_hostname)  # 将报文重构

        # print(message)

        fish_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 初始化钓鱼网站的socket

        fish_socket.connect((new_hostname, 80))  # 与钓鱼网站的服务器建立连接

        fish_socket.sendall(message.encode())  # 将报文编码发送到钓鱼网站服务器

        while True:

            # 从服务器接收数据,转发给客户端

            buff = fish_socket.recv(PARAMETERS['MAX_LENGTH'])

            if not buff:

                fish_socket.close()

                break

            so.sendall(buff)

        so.close()

        fish_socket.close()

        return

五、cache功能模块。

首先确定缓存路径和文件名,并初始化标记为未修改。

接下来进行判断,如果本地已经存在该文件,此时需要查看最后一次缓存之后网站内容是否有发生变化,并更新最后一次缓存的时间。我们通过向服务器发送报文,解析返回数据的方式进行判断。

如果返回数据的响应码为304,则表示发生未变化,直接从本地文件中读取信息发送到客户端。如果响应码不为304,则表示发生了变化,直接将标记修改为已修改。

接下来进行判断,如果本地缓存中不存在该文件或者标记为已修改,则表示需要更新缓存。向服务器发送数据,获取服务器返回的数据,并且写入到缓存中,然后将数据转发给客户端,最后关闭套接字。

当本地缓存已经存在相应文件,判断网页是否被修改时的逻辑实现:

path = cache_dir + url.hostname  # 缓存路径和文件名

    modified = False  # 第一次标记为未修改

    if os.path.exists(path):  # 当已经存在该文件,需要判断服务器是否修改过此网页

        modified_time = os.stat(path).st_mtime  # 缓存文件最后修改的时间

        headers = str('If-Modified-Since: ' + time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(modified_time)))

        # 把modified-time按报文要求格式化

        message = message[:-2] + headers + '\r\n\r\n'  # 把If-Modified-Since字段加入到请求报文中

        # 向服务器发送报文

        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        server_socket.connect((url.hostname, 80))

        server_socket.sendall(message.encode())

        data = server_socket.recv(PARAMETERS['MAX_LENGTH']).decode('utf-8', 'ignore')

        # print(data)

        server_socket.close()

        if data[9:12] == '304':  # 响应码为304,表示网页未变化,从cache中读取网页

            print('网页未更新,将从缓存中读取网页.')

            with open(path, "rb") as f:

                so.sendall(f.read())

        else:  # 网页变化,标记为已修改

            modified = True

    if not os.path.exists(path) or modified:  # 如果没有该网页的缓存或者网页已被修改

        # 向服务器发送数据,才能接收到服务器发回来的数据

        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        server_socket.connect((url.hostname, 80))

        server_socket.sendall(message.encode())

        print('更新缓存.')

        f = open(path, 'wb')  # 重写缓存

        while True:

            buff = server_socket.recv(PARAMETERS['MAX_LENGTH'])

            if not buff:

                # print(buff)

                f.close()

                server_socket.close()

                break

            f.write(buff)  # 将接收到的数据写入缓存

            so.sendall(buff)  # 将接收到的数据转发给客户端

        so.close()

实验结果:

  1. 正常情况:第一次访问hituc.hit.edu.cn,由于之前从未访问过,所以更新缓存,将缓存写入cache

缓存如下:

  1. 再次访问同一网站

为防止网站实时更新,我找到了一个较为稳定的网址www.qqkk.com,进行试验

再次访问www.qqkk.com,发现响应码为304,代理服务器从缓存中读取信息。

  1. 网站过滤

    我们设置了禁止访问的网站,将注释符号删除后运行程序,发现该网站被禁止访问。

   

  1. 用户过滤
        我们设置了Blocked_User来存储需要被过滤的用户IP地址,此时所有网站均不可访问。

    

  1. 网站重定向

   我设置了钓鱼网站的字典,将需要转发的网站转发到目的网址。

 

问题讨论:

在实现功能中网站缓存时,发现不能在缓存中显示if-modified-since 语句,后来发现是将浏览器当作server,而不是主机当作server,使用sendall函数将报文发送给主机即可在缓存中显示if-modified-since语句

心得体会:

本次实验是第一次上机实现网络协议,通过本次实验,对socket编程的过程与技术有了一个初步的了解,更加深入地理解了http协议和代理服务器的基本原理,同时也掌握了代理服务器的设计与编程的基本实现。

CDDDD!
关注 关注
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
哈工大计算机网络实验1-6实验报告及源码.rar
01-12
哈工大计算机网络实验 HTTP 代理服务器设计实现 HTTP 分组收发实验 HTTP 分组转发实验 可靠数据传输协议——GBN协议的设计实现 利用 Wireshark 进行协议分析 简单网络组建与配置
哈工大计算机网络2018实验一及报告
01-20
哈尔滨工业大学16级的计算机网络实验一 截止到2019年初这是最新的版本!! 实验及报告清晰明了 (已经过TA验收)可以直接上交
哈工大计算机组成原理实验预习(翁瑞2024)持续更新(实验一运算器原理)
E_D_Unicorn的博客
03-28 1020
哈工大计算机网络实验1,http代理服务器
01-20
http代理服务器
HTTP代理服务器设计实现
tu_gou的博客
10-10 3229
哈工大计算机网络实验一—HTTP代理服务器设计实现
计算机网络——哈工大
dalai_c的博客
01-10 1462
计算机网络 ———哈工大课程学习笔记
哈工大计网实验
qq_63087948的博客
06-22 702
SR_client,需要在目录下创建一个test的txt文本。SR_server,在目录下创建一个test1的txt文本。
哈工大计网实验
qq_63087948的博客
06-22 1194
鼠鼠我呀,做实验的时候的虽然也是找源码,但是这个🐎是这个报错,那个不对,这改改那看看,所以鼠鼠我直接把我调试好的代码直接发出来。
哈工大计算机网络实验1 Java实现
Lockede的博客
04-08 741
最后的最后说一下我没有解决的问题,就是有的工大网站我确实访问不进去,好像其他同学用C写的是可以进去的,比如今日哈工大哈工大官网,我也不知道是什么原因,验收的时候灵活选择了一下演示的网页,助教也不会特意让我访问别的网站。然后就是最主要的部分了,用于实现缓存以及报文的转发和响应。之后就要获得服务器的响应了,如果没更新会返回一个304,有更新的话就是正常的200,所以可以接收比较小的一部分报文,判断里面含不含304,如果含的话就直接把缓存发给浏览器就好了,要是不含的话还得把服务器的响应读完,更新缓存并转发。
哈工大计算机网络实验三——利用 Wireshark 进行协议分析
m0_62249876的博客
12-11 1445
在显示筛选规则中输入“tcp”,可以看到在本地主机和服务器之间传输的一系列tcp和http报文,你应该能看到包含SYN报文的三次握手。也可以看到有主机向服务器发送的一个HTTP POST报文和一系列的“http continuation”报文。启动Web浏览器和Wireshark,选择“capture”下拉菜单中的“Capture Options”命令,设置分组俘获的选项后,开始分组捕获。
哈工大计算机网络实验一:HTTP代理服务器(Java语言实现
m0_61108725的博客
10-07 1799
否则可以直接将缓存中的数据返回。循环体中,我们对请求报文做一些解析用来提取一些必要的信息,然后建立与目标服务器的连接后,监听浏览器到服务器的数据传送,同时监听服务器到浏览器的数据传送。在Java中socket网络编程,慕课里也讲过,socket是点对点的,代理服务器程序在一次循环中,分别与浏览器客户端,目标服务器维持一个socket连接,那么数据流就可以在这条通路上传输。事实上,我们在浏览器地址栏上输入我们想访问的网址,到浏览器展示给我们丰富的页面,即使我们只访问一次,浏览器还是会发送许许多多的请求。
HIT-Computer-Network:哈工大计算机网络实验
05-11
HIT-Computer-Network 2018哈工大计算机网络实验
哈工大计算机网络2018实验二(报告丢失)
01-20
这一次的实验报告被我弄丢了 实在是抱歉了学弟学妹们 ,代码可以使用,但是没有报告,如果学弟学妹们需要报告请不要下载!
哈尔滨工业大学计算机系统实验2-DataLab 数据表示
12-26
1.1实验目的 通过对Linux下编码的练习,熟练掌握计算机系统的数据表示与数据运算,通过C程序深入理解计算机运算器的底层实现与优化,掌握Linux下makefile与GDB的使用。 1.2 实验环境与工具 1.2.1 硬件环境 X64 CPU;2GHz;2G RAM;256GHD Disk 以上 1.2.2 软件环境 Windows7 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位; Visual Studio 2010 64位以上;CodeBlocks;vi/vim/gpedit+gcc1.2.3 开发工具 Code blocks 1.3 实验预习 C语言下的位操作指令: 逻辑:||,&&,!,分别为或,与,非 无符号型:位级运算:|或,&与,~非,^异或 有符号型:位级运算:|或,&与,~非,^异或
哈尔滨工业大学计算机课程实验-计算机网络-内含源码和说明书.zip
最新发布
05-09
哈尔滨工业大学计算机课程实验-计算机网络-内含源码和说明书.zip
计算机网络-哈工大】---学习笔记(上)---网络体系结构,TCP/IP参考模型,应用层,HTTP,DNS,SMTP,Socket
plain_rookie的博客
07-09 1350
通过交换网络互连主机 什么是Internet?----组成细节角度网络协议(network protocol)定义协议三要素 协议是计算机网络的重要内容Internet协议标准 3、分组交换:传输延迟 4、报文交换 vs 分组交换 2、HTTP请求消息的通用格式 3、上传输入的方法 6、setsockopt,getsockopt(设置套接字参数,读取套接字参数) 7、Scoket API函数小结...
哈工大计算机网络实验四——简单网络组建及配置
m0_62249876的博客
11-07 2542
在完成一个简单校园网的基本建设、配置工作,完成终端设备参数配置、各层设备配置、路由表配置和VLAN配置,使校园网各区域能够完成通信。宿舍区与办公区、教学区隔离,即宿舍区的设备只能访问服务器区的资源;其他区域的设备可以互相访问。配置无线局域网,包括无线路由和笔记本的设置。在不考虑冗余链路的前提下,可将网络拓扑结构简化如下。同时,为了管理方便,以及提高网络的高性能,减少不必要的流量消耗,还应该根据需求设计IP地址分配方案,用户需求如下:中心机房(即服务器区),需要分配至少20个。
Educoder | 计算机网络实验-HTTP协议分析
Mksg_28的博客
06-30 1488
该认证是 HTTP1.1 提出的基本认证的替代方法,不包含密码的明文传递。摘要认证使用随机数 + MD5 加密哈希函数来对用户名、密码进行加密,在上述第二步时,服务器返回随机字符串 nonnce 之后,客户端发送摘要。其中。
计算机网络实验报告7HTTP协议分析与测量
Jellyfishwuan的博客
05-11 1651
了解HTTP协议及其报文结构了解HTTP操作过程:TCP三次握手、请求和相应交互。掌握基于tcpdump和wireshark软件进行HTTP数据包抓取和分析技术。
哈工大计算机网络实验
10-19
哈工大计算机网络实验是哈尔滨工业大学计算机科学与技术专业的一门实验课程,旨在让学生通过实践掌握计算机网络的基本原理和实现方法。该实验包括多个实验项目,如网络编程、路由器实现、网络安全等。其中,网络编程...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
8
原创
2
点赞
43
收藏
2
粉丝
关注
私信
写文章

热门文章

  • 机器学习实验一-多项式拟合 3027
  • 哈工大计算机网络实验一-HTTP代理服务器的设计与实现 2309
  • 黑盒测试-软件构造学习 1417
  • HITICS大作业 291
  • hit软件构造lab3 242

最新评论

  • 哈工大计算机网络实验一-HTTP代理服务器的设计与实现

    xiaoxiaopeixi: 能把源码分享一下吗

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 机器学习实验一-多项式拟合
  • hit软件构造lab3
  • Java:异常
2022年8篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司韶关优秀网站设计哪家好海口seo排名多少钱宝安网站制作设计推荐淮南seo优化报价木棉湾如何制作网站价格防城港关键词按天收费哪家好潜江阿里店铺运营报价巴中网站推广方案南京外贸网站制作哪家好清远网站优化按天收费哪家好吉安至尊标王哪家好塔城关键词按天收费哪家好通辽营销型网站建设长春优化公司北京网页制作哪家好三明网站改版公司福州模板网站建设报价新余高端网站设计多少钱黄冈关键词按天扣费公司铜仁网站优化哪家好商洛网站建设设计多少钱杭州如何制作网站价格定西模板网站建设丹东百度竞价包年推广公司海西seo排名报价酒泉网站推广工具哪家好兴安盟网站优化按天扣费报价拉萨百度爱采购公司怒江外贸网站建设公司亳州如何制作网站推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化